Redis笔记

Redis:开源、免费、高性能、K-V数据库、内存数据库、非关系型数据库,支持持久化、集群和事务

一、Redis安装及配置

1、用docker运行Redis

docker pull redis
docker run -d --name redis -p 6379:6379 redis
docker exec -it redis redis-cli

2、Linux安装

确保Linux已经安装gcc
下载Redis
wget http://download.redis.io/releases/redis-4.0.1.tar.gz
解压
tar -zxvf redis-4.0.1.tar.gz
进入目录后编译
cd redis-4.0.1
make MALLOC=libc
安装
make PREFIX=/usr/local/redis install #指定安装目录为/usr/local/redis
启动
/usr/local/redis/bin/redis-server

3、Redis配置

进入解压的Redis目录,将redis.conf复制到安装文件的目录下
cp redis.conf /usr/local/redis
启动自定义配置的Redis
/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf

配置详解
daemonize : 默认为no,修改为yes启用守护线程
port :设定端口号,默认为6379
bind :绑定IP地址
databases :数据库数量,默认16
save :指定多少时间、有多少次更新操作,就将数据同步到数据文件
#redis默认配置有三个条件,满足一个即进行持久化
save 900 1 #900s有1个更改
save 300 10 #300s有10个更改
save 60 10000 #60s有10000更改
dbfilename :指定本地数据库的文件名,默认为dump.rdb
dir :指定本地数据库的存放目录,默认为./当前文件夹
requirepass :设置密码,默认关闭
客户端登录
redis -cli -h host -p port -a password

4、Redis关闭

使用kill命令 (非正常关闭,数据易丢失)
ps -ef|grep -i redis
kill -9 PID
正常关闭
redis-cli shutdown(关闭服务端)
quit(关闭客户端)

二、Redis基础

1、公用命令

DEL key :删除key
DUMP key:序列化给定key,返回被序列化的值
EXISTS key:检查key是否存在
EXPIRE key second:为key设定过期时间
TTL key:返回key剩余时间
PERSIST key:移除key的过期时间,key将持久保存
KEY pattern:查询所有符号给定模式的key
RANDOM key:随机返回一个key
RANAME key newkey:修改key的名称
MOVE key db:移动key至指定数据库中
TYPE key:返回key所储存的值的类型
EXPIRE key second的使用场景:
1、限时的优惠活动
2、网站数据缓存
3、手机验证码
4、限制网站访客频率

2、key的命名建议

key不要太长,尽量不要超过1024字节。不仅消耗内存,也会降低查找的效率
key不要太短,太短可读性会降低
在一个项目中,key最好使用统一的命名模式,如user:123:password
key区分大小写

3、五种存储类型

1)、string

string类型是二进制安全的,redis的string可以包含任何数据,如图像、序列化对象。一个键最多能存储512MB。二进制安全是指,在传输数据的时候,能保证二进制数据的信息安全,也就是不会被篡改、破译;如果被攻击,能够及时检测出来 。

常用命令

set key_name value:(key存在覆盖key的值)命令不区分大小写,但是key_name区分大小写
SETNX key value:当key不存在时设置key的值。(SET if Not eXists)
get key_name
GETRANGE key start end:获取key中字符串的子字符串,从start开始,end结束
MGET key1 [key2 …]:获取多个key
GETSET KEY_NAME VALUE:设定key的值,并返回key的旧值。当key不存在,返回nil
STRLEN key:返回key所存储的字符串的长度
INCR KEY_NAME :INCR命令key中存储的值+1,如果不存在key,则key中的值话先被初始化为0再加1
INCRBY KEY_NAME 增量

DECR KEY_NAME:key中的值自减一
DECRBY KEY_NAME

append key_name value:字符串拼接,追加至末尾,如果不存在,为其赋值

应用场景:

i、String通常用于保存单个字符串或JSON字符串数据
ii、因为String是二进制安全的,所以可以把保密要求高的图片文件内容作为字符串来存储
iii、计数器:常规Key-Value缓存应用,如微博数、粉丝数。INCR本身就具有原子性特性,所以不会有线程安全问题
incr等指令本身就具有原子操作的特性,所以我们完全可以利用redis的incr等指令来实现原子计数的效果。(不用考虑并发操作)例如某个场景下有3个客户端同时读取了num的值(值为2),然后对其同时进行加1操作,那么num最后值一定是5。
很多网站都利用redis的这个特性来实现业务上的统计计数需求

2)、hash

Redis hash是一个string类型的field和value的映射表,hash特别适用于存储对象。每个hash可以存储232-1键值对。可以看成KEY和VALUE的MAP容器。相比于JSON,hash占用很少的内存空间。

常用命令

HSET key_name field value:为指定的key设定field和value
hmset key field value[field1,value1]
hget key field
hmget key field[field1]
hgetall key:返回hash表中所有字段和值
hkeys key:获取hash表所有字段
hlen key:获取hash表中的字段数量
hdel key field [field1]:删除一个或多个hash表的字段
hexists key field :查看哈希表key中,指定的字段是否存在

应用场景:

hash是最接近关系数据库结构的数据类型,可以将数据库一条记录或程序中一个对象转换成hashmap存储在redis中
Hash的应用场景,通常用来存储一个用户信息的对象数据。
i、相比于存储对象的string类型的json串,json串修改单个属性需要将整个值取出来。而hash不需要。
ii、相比于多个key-value存储对象,hash节省了很多内存空间
iii、如果hash的属性值被删除完,那么hash的key也会被redis删除

3)、list

类似于Java中的LinkedList。
List的设计非常简单精巧,即可以作为栈,又可以作为队列,满足绝大多数的需求
类似于java中的linkedlist

常用命令

lpush key value1 [value2]
rpush key value1 [value2]
lpushx key value:从左侧插入值,如果list不存在,则不操作
rpushx key value:从右侧插入值,如果list不存在,则不操作

llen key:获取列表长度
lindex key index:获取指定索引的元素
lrange key start stop:获取列表指定范围的元素
lpop key :从左侧移除第一个元素
prop key:移除列表最后一个元素
blpop key [key1] timeout:移除并获取列表第一个元素,如果列表没有元素会阻塞列表到等待超时或发现可弹出元素为止
brpop key [key1] timeout:移除并获取列表最后一个元素,如果列表没有元素会阻塞列表到等待超时或发现可弹出元素为止
ltrim key start stop :对列表进行修改,让列表只保留指定区间的元素,不在指定区间的元素就会被删除
lset key index value :指定索引的值
linsert key before|after world value:在列表元素前或则后插入元素

应用场景

i、对数据大的集合数据删减
列表显示、关注列表、粉丝列表、留言评价…分页、热点新闻等
ii、任务队列
list通常用来实现一个消息队列,而且可以确保先后顺序,不必像MySQL那样通过order by来排序

补充:

rpoplpush list1 list2 移除list1最后一个元素,并将该元素添加到list2并返回此元素
用此命令可以实现订单下单流程、用户系统登录注册短信等。

4)、set

无序、不重复

常用命令

sadd key value1[value2]:向集合添加成员
scard key:返回集合成员数
smembers key:返回集合中所有成员
sismember key member:判断memeber元素是否是集合key成员的成员
srandmember key [count]:返回集合中一个或多个随机数
srem key member1 [member2]:移除集合中一个或多个成员
spop key:移除并返回集合中的一个随机元素
smove source destination member:将member元素从source集合移动到destination集合
sdiff key1 [key2]:返回所有集合的差集
sdiffstore destination key1[key2]:返回给定所有集合的差集并存储在destination中
对两个集合间的数据[计算]进行交集、并集、差集运算

应用场景

i、以非常方便的实现如共同关注、共同喜好、二度好友等功能。对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存储到一个新的集合中。
ii、利用唯一性,可以统计访问网站的所有独立 IP

5)、zset

有序且不重复。每个元素都会关联一个double类型的分数,Redis通过分数进行从小到大的排序。分数可以重复

常用命令

ZADD key score1 memeber1
ZCARD key :获取集合中的元素数量
ZCOUNT key min max 计算在有序集合中指定区间分数的成员数
ZCOUNT key min max 计算在有序集合中指定区间分数的成员数
ZRANK key member:返回有序集合指定成员的索引
ZREVRANGE key start stop :返回有序集中指定区间内的成员,通过索引,分数从高到底
ZREM key member [member …] 移除有序集合中的一个或多个成员
ZREMRANGEBYRANK key start stop 移除有序集合中给定的排名区间的所有成员(第一名是0)(低到高排序)
ZREMRANGEBYSCORE key min max 移除有序集合中给定的分数区间的所有成员

应用场景

常用于排行榜:
i、如推特可以以发表时间作为score来存储
ii、存储成绩
iii、还可以用zset来做带权重的队列,让重要的任务先执行

6)、HyperLoglog(计算基数)
常用命令

pfadd key element
pfcount key [key …]
pfmerge destkey sourcekey [sourcekey…] :将多个HyperLoglog合并为一个

应用场景:

大数据开发
统计注册IP数
统计每日访问IP数
统计页面实时UV 数
统计在线用户数
HyperLoglog是一种算法,并非redis独有
目的是做基数统计,故不是集合,不会保存元数据,只记录数量而不是数值
统计真实文章的阅读数

三、Redis高级

1、发布订阅

Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。

Redis 客户端可以订阅任意数量的频道。

下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:

当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:

命令

subscribe channel [channel…]:订阅一个或多个频道的信息
psubscribe pattern [pattern…]:订阅一个或多个符合规定模式的频道
publish channel message :将信息发送到指定频道
unsubscribe [channel[channel…]]:退订频道
punsubscribe [pattern[pattern…]]:退订所有给定模式的频道
应用场景

构建实时的消息系统,比如普通聊天、群聊等功能。
1)、博客网站订阅,当作者发布就可以推送给粉丝
2)、微信公众号模式

2、Redis多数据库

select db
move key db
flushdb
flushall

3、Redis 事务(不支持事务回滚)

Redis事务可以一次执行多个命令,(按顺序地串行化执行,执行过程中不允许其他命令插入执行序列中)。
1)、Redis会将一个事务中的所有命令序列化,然后按顺序执行
2)、执行中不会被其他命令插入,不允许加塞行为
Multi:事务开始
exec:事务执行
discard:取消事务

输入Multi命令开始,输入的命令都会依次进入命令队列中,但不会执行
直到输入exec后,Redis会将之前队列中的命令依次执行

discard放弃队列执行

如果某个命令报出错,则只有报错的命令不会被执行,而其他的命令都会执行,不会回滚。

如果队列中某个命令出现报告错误(语法错误),执行时整个队列都会被取消

4、主从复制

我们将一台redis服务器作主库,其他三台作为从库,主库只负责写数据,每次有数据更新都将更新的数据同步到它所有的从库,而从库只负责读数据,这样做带来的好处:
1)、读写分离,不仅可以提高服务器的负载能力,并且可以根据读请求的规模自由增加和减少从库的数量
2)、数据被复制了好几份
注意:一个主库可以有多个从库,但一个从库只能隶属于一个主库
Redis主从复制配置
在这里插入图片描述

5、哨兵模式

是对主从复制的再一次升级

哨兵模式的特点
1)、不时地监控redis是否按照 预期良好的运行。
2)、如果发现某个redis节点运行出现状况,能够通知另外一个进程(例如它的客户端)
3)、能够进行自动切换。当一个master节点不可用时,能够选举出master的多个slave(如果有超过一个slave的话)中的一个来作为新的master,其他slave节点会将它所追随的master的地址改为被提升为master的slave的新地址。
4)、哨兵为客户端提供服务发现,客户端链接哨兵,哨兵踢狗当前master的地址然后提供服务,如果出现切换,也就是master挂了,哨兵会提供给客户端一个新地址。

6、Redis集群

redis cluster 是社区版推出的redis分布式集群解决方案
为了在大流量访问下提供稳定的业务,集群化是存储的必然形态
未来的发展趋势肯定是云计算和大数据的紧密结合
只有分布式架构能满足要求

7、Redis持久化

1)、RDB
RDB是Redis默认持久化机制。RDB相当于快照,保存的是一种状态
默认的文件名为dump.rdb
优点:
保存速度、还原速度极快
适用于灾难备份
缺点:
小内存的机器不符合使用。RDB机制符合要求就会快照。

2)、AOF
如果Redis意外down掉,RDB方式会丢失最后一次快照后的所有修改。如果要求应用不能丢失任何修改,可以采用AOF持久化方式。
AOF:Append-Only File:Redis会将每一个收到写命令都追加到文件中(默认是appendonly.aof)。当Redis重启时会通过重新执行文件中的写命令重建整个数据库的内容。

产生的问题:
保存过多重复的指令
有些命令是多余的。

8、缓存穿透和缓存雪崩

1)、穿透
缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。
解决办法:持久层查询不到就缓存空结果,查询时先判断缓存中是否exists(key),如果有直接返回空,没有则查询后返回。
注意insert时需清除查询的key,否则几遍DB中有值也查询不到(当然也可以设置空缓存的过期时间)
2)、雪崩
缓存雪崩就是缓存大量失效的时候,引发大量查询数据库
【如果缓存集中在一段时间内失效,发生大量的缓存穿透,所有的查询都落在数据库上,造成了缓存雪崩。
这个没有完美的解决办法,但可以分析用户行为,尽量让失效时间点均匀分布。大多数系统设计者考虑用加锁或者队列的方式保证缓存的单线程(进程)写,从而避免失效时大量的并发请求落到底层存储系统上】
解决办法
用锁/分布式锁或者队列串行访问
缓存失效时间均匀分布

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
狂神在他的Redis笔记中可能会涉及到一些内容,但是根据提供的引用内容,无法确定具体是哪些内容。可以使用自定义的配置文件来启动Redis服务,使用systemctl命令来启动和关闭服务。\[1\]在复杂的情况下,可以使用专业的消息中间件来进行订阅,但是需要注意如果订阅方的读取消息速度不够快,可能会导致消息积压,影响Redis的性能甚至导致崩溃。\[2\]Redis和Memcached一样,数据都是缓存在内存中,但是Redis会周期性地将更新的数据写入磁盘或记录文件,并通过主从复制实现数据同步。\[3\]如果你有具体的问题或需要更详细的信息,请提供更多的上下文。 #### 引用[.reference_title] - *1* *2* [Redis详细笔记](https://blog.csdn.net/qq_40087648/article/details/109808727)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [狂神说 Redis笔记](https://blog.csdn.net/DDDDeng_/article/details/108118544)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值