Redis笔记
写在前面:笔记为了让自己快速复习忘记的知识,所以写的很简。可能有些地方其他人看不懂,甚至作者本人也看不懂。
1.常用命令
地址:http://www.redis.cn/commands.html
1.1 系统
查找所有符合给定模式(pattern)的key:
keys pattern
查找当前数据库的key的数量:
dbsize
检查给定的key是否存在:
exists key
在key存在时删除key:
del key1 [key2...]
为给定key设置过期时间,单位为秒:
expire key second
以秒为单位,返回给定key的剩余生存时间(TTL , time to live) 不存在key返回-2 无过期时间的key返回-1:
ttl key
移除key的过期时间,key将持久保存:
persist key
返回key所存储的值的类型:
type key
查看redis设置:
config get xx
设置redis:
config set xxx xxx
1.2 String
设置/获取:
set key value
get key value
同时设置/获取多个:
MSET key value [key value ....]
MGET key [key ....]
递增数字/增加指定数字:
INCR key
INCRBY key increment
递减数字/减少指定数字:
DECR key
DECRBY key decrement
获取字符串长度:
STRLEN key
分布式锁相关:
不存在时才设置:setnx key value
同时设置属性与超时时间(后面跟NX或XX代表存在或不存在时才成功)set key value [Ex seconds][PX milliseconds][NX|XX]
1.3 List
向列表左边添加元素
LPUSH key value [value ...]
向列表右边添加元素
RPUSH key value [value ....]
查看列表
LRANGE key start stop
获取列表中元素的个数
LLEN key
应用场景:
点赞列表?评论区?
1.4 hash
结构类似:
Map<String,Map<Object,object>>
一次设置一个字段值:
HSET key field value
一次获取一个字段值:
HGET key field
一次设置多个字段值:
HMSET key field value [field value ...]
一次获取多个字段值:
HMGETkey field [field ....]
获取所有字段值:
hgetall key
获取某个key内的全部数量:
hlen
删除一个key:
hdel
1.5 set
添加元素
SADD key member[member ...]
删除元素
SREM key member [member ...]
获取集合中的所有元素
SMEMBERS key
判断元素是否在集合中
SISMEMBER key member
获取集合中的元素个数
SCARD key
从集合中随机弹出一个元素,元素不删除
SRANDMEMBER key [数字]
从集合中随机弹出一个元素,出一个删一个
SPOP key[数字]
集合运算
集合的差集运算A-B
属于A但不属于B的元素构成的集合:qq的可能认识的人,网易云推荐歌单
SDIFF key [key ...]
集合的交集运算A∩B
属于A同时也属于B的共同拥有的元素构成的集合:共同好友,共同关注,共同加入的群
SINTER key [key ...]
集合的并集运算AUB
属于A或者属于B的元素合并后的集合:
SUNION key [key ...]
1.6 zset
向有序集合中加入一个元素和该元素的分数
添加元素
ZADD key score member [score member ...]
按照元素分数从小到大的顺序 返回索引从start到stop之间的所有元素
ZRANGE key start stop [WITHSCORES]
获取元素的分数
ZSCORE key member
删除元素
ZREM key member [member ...]
获取指定分数范围的元素
ZRANGEBYsCORE key min max [WITHSCORES] [LIMIT offset count]
增加某个元素的分数
ZINCRBY key increment member
获取集合中元素的数量
ZCARD key
获得指定分数范围内的元素个数
ZCOUNT key min max
按照排名范围删除元素
ZREMRANGEBYRANK key start stop
获取元素的排名
从小到大ZRANK key member
从大到小ZREVRANK key member
应用场景:
销量排行榜
微博热搜等
2. 缓存淘汰
查看redis可以使用的最大内存:config get maxmemory
设置redis的最大占用内存:config set maxmemory xxx
后面可以跟单位,ex:100mb。0代表无限制。
当内存占满时,会执行缓存淘汰策略。
Redis提供的淘汰策略:
-
noeviction:内存满了直接报错(系统默认)
-
allkeys-lru:lru算法,所有key里面
-
volatile-lru:lru算法,仅限设置了过期时间的(常用)
-
allkeys-random: 随机删除任意数据
-
volatile-random: 随机删除设置了过期时间的key
-
volatile-ttl: 设置了过期时间的,从最快过期的key里面开始删除
查看当前的缓存淘汰策略:config get maxmemory-policy
设置新的缓存淘汰策略:config set maxmemory-policy volatile-lru
3. 集群
3.1 主从模式
主节点(master),从节点(slave)
特点:
-
该模式下,master节点唯一,slave可以有多个。
-
master节点对外提供读写服务,slave节点实时同步master的数据,但是只提供读服务。
-
若master节点宕机,slave节点不会晋升成master节点,但是依然可以提供读服务。
工作机制:
- slave节点初始化时会向主节点传输
sync
命令,拿到rdb数据,master节点在sync命令之后进行的写操作会全部传送到slave节点。 - master节点接收到的所有写操作会实时同步到slave节点
配置:
master节点需配置连接密码,其他配置不用改变
slave节点配置redis.conf:
replicaof <master-ip> <master-port>
masterauth <master-password>
3.2 哨兵模式(Sentinel)
特点:
-
建立在主从模式的基础上
-
当master挂了以后,sentinel会在slave中选择一个做为master,并修改它们的配置文件,其他slave的配置文件也会被修改,比如slaveof属性会指向新的master
-
当master重新启动后,将做为slave接收新的master的同步数据
-
sentinel因为也是一个进程有挂掉的可能,所以sentinel也会启动多个形成一个sentinel集群
-
多sentinel配置的时候,sentinel之间也会自动监控
-
一个sentinel或sentinel集群可以管理多个主从Redis,多个sentinel也可以监控同一个redis
-
sentinel最好不要和Redis部署在同一台机器,不然Redis的服务器挂了以后,sentinel也挂了
工作机制:
- 每个sentinel以每秒钟一次的频率向它所知的master,slave以及其他sentinel实例发送一个 PING 命令
- 如果一个实例距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被sentinel标记为主观下线。
- 如果一个master被标记为主观下线,则正在监视这个master的所有sentinel要以每秒一次的频率确认master的确进入了主观下线状态
- 当有足够数量的sentinel(大于等于配置文件指定的值)在指定的时间范围内确认master的确进入了主观下线状态, 则master会被标记为客观下线
- 在一般情况下, 每个sentinel会以每 10 秒一次的频率向它已知的所有master,slave发送 INFO 命令
- 当master被sentinel标记为客观下线时,sentinel向下线的master的所有slave发送 INFO 命令的频率会从 10 秒一次改为 1 秒一次
- 若没有足够数量的sentinel同意master已经下线,master的客观下线状态就会被移除;若master重新向sentinel的 PING 命令返回有效回复,master的主观下线状态就会被移除
配置:
每台哨兵节点配置相同,监听master节点即可:sentinel.conf
sentinel monitor mymaster <master-ip> <master-port> 2 #判断master失效至少需要2个sentinel同意,建议设置为n/2+1,n为sentinel个数
sentinel auth-pass mymaster <master-password>
sentinel down-after-milliseconds mymaster 30000 #判断master主观下线时间,默认30s
然后启动哨兵的进程。
3.3 集群模式(Cluster)
相当于横向扩容,解决单机redis容量有限的问题。
特点:
- 所有的节点都是一主一从(也可以是一主多从),其中从不提供服务,仅作为备用
- 不支持同时处理多个key(如MSET/MGET),因为redis需要把key均匀分布在各个节点上,并发量很高的情况下同时创建key-value会降低性能并导致不可预测的行为
- 支持在线增加、删除节点
- 客户端可以连接任何一个主节点进行读写
- 最少需要6个节点,3主3从,3主节点为了投票。
配置:
-
修改redis.conf,打开cluster模式。6个节点配置相同:
cluster-enabled yes cluster-config-file nodes-xxx.conf
-
创建集群:
redis-cli--cluster create 节点1:端口 节点2:端口 节点3:端口 节点4:端口 节点5:端口 节点6:端口 --cluster-replicas 1
(--cluster-replicas 1 1个master节点配置1个从节点)
4. 持久化
4.1 RDB(Redis DataBase)
快照方式,根据自动配置或手动操作将内存中的数据存储在硬盘上。默认的文件名为dump.rdb。
触发机制:
- save手动触发:阻塞其他所有命令,将数据备份,备份完成后继续工作。
- bgsave手动触发:fork子线程进行数据备份,期间可以处理其他命令。(fork时会阻塞线程,但是时间很短)
- 自动方式:redis.conf中设置策略。
save m n
:表示m秒内数据集存在n次修改时,自动触发bgsave。- 默认配置就有三条自动化配置:
save 900 1
:900 秒内如果至少有 1 个 key 的值变化,则保存save 300 10
:300 秒内如果至少有 10 个 key 的值变化,则保存save 60 10000
:60 秒内如果至少有 10000 个 key 的值变化,则保存
- 默认配置就有三条自动化配置:
优点:
- 文件紧凑,全量备份,适合异地灾备
- 恢复数据快
缺点:
- 非实时。突然宕机会丢失数据。
4.2 AOF(Append Only File)
日志记录方式。客户端发来的每一条消息,都会记录到日志里。恢复数据时,重新执行记录的所有命令即可。
三种设置:
- 每修改同步 always:同步持久化。每次数据变更立即记录日志,性能差但数据完整性比较好
- 每秒同步 everysec:异步操作。每秒记录 如果一秒内宕机,有数据丢失
- 不同步 no:从不同步
优点:
- 保护数据不丢失(同步方式)
缺点:
- 日志会不断增大,虽然有重写机制,依然会不断增长。
- 恢复数据慢
4.3 总结
两者同时使用。根据业务,自行调整。
速度or数据完整性不可兼得。