参看网址:
https://tech.souyunku.com6844903709994909710#heading-5
https://tech.souyunku.com6844903709994909710#heading-11
https://www.jianshu.com/p/ad8f35c2c0d0
https://tech.souyunku.com6844903655527677960
1. Redis key过期策略
1.1 Redis过期时间相关命令
在Redis中,可以设置key的过期时间,相关命令如下:
命令 | 含义 | 粒度级别 |
---|---|---|
expire | 设置key多少秒后过期 | 秒 |
pexpire | 设置key多少毫秒后过期 | 毫秒 |
EXPIREAT | 设置key在什么时刻过期 | 秒级时间戳 |
PEXPIREAT | 设置key在什么时刻过期 | 毫秒级时间戳 |
ttl | 剩余存活时间 | 秒 |
pttl | 剩余存活毫秒数 | 毫秒 |
persist | 持久,不再过期 |
1.2 3种过期策略
在对key设置了过期时间后,key到期会自动过期,但何时进行过期key的删除动作比较合适呢?
(1)立即删除
在到过期时间后,立即进行删除。
特点:对内存友好,对CPU不友好;
(2)惰性删除
在查询时判断是否过期,过期则删除。
特点:对CPU友好,对内存不友好
(3)定期删除
每隔一段时间去删除过期key。
1.3 Redis过期策略
Redis采用定期删除+惰性删除结合的策略
2. Redis内存淘汰机制
Redis内存淘汰是用来淘汰包含非持久的、持久的key,当redis使用的内存大小达到设置的最大内存时,redis会根据内存淘汰机制来删除一些key。
最大内存设置
maxmemory。为0表示不限制
淘汰策略:
策略 | 算法 | key类型 |
---|---|---|
volatile-lru | 淘汰最近最久未使用(时间)的非持久key | 非持久key |
volatile-lfu | 淘汰最近最不常用(频次)的非持久key | 非持久key |
valatile-random | 随机淘汰非持久key | 非持久key |
valatile-ttl | 淘汰剩余过期时间最小非持久key | 非持久key |
allkeys-lru | 淘汰最近最久未使用的key | 所有key |
allkeys-lfu | 淘汰最近最不常用的key | 所有key |
allkeys-random | 随机淘汰key | 所有key |
noeviction | 禁止淘汰数据,内存满写操作会报错 | 所有key |
默认策略和配置项:
noeviction。
配置项:maxmemory-policy
redis作缓存建议淘汰策略:
如果redis当做缓存来使用,为了保证缓存中数据是热点数据,可以使用allkeys-lru,或者allkeys-lfu来淘汰数据。
3. Redis持久化
Redis支持将内存中数据持久化,用于崩溃后恢复数据。
Redis支持两种持久化方式:RDB快照持久化和AOF增量持久化。
3.1 RDB快照持久化
概念
RDB快照持久化是对redis某一时刻所有数据进行全量持久化(生成数据库当前时刻的快照),生成的rdb文件是一个经过压缩的二进制文件,redis在启动时可以通过读取rdb文件来还原数据。
启动时读取RDB文件
持久化方式
RDB持久化主要有两种方式:手动和自动,以及server关闭时自动持久化动作。
(1)手动
可以通过save或bgsave来手动处RDB持久化,其中save是阻塞的,bgsave会建立一个子线程来创建RDB文件。
- 需要注意的是redis server启动时读取rdb文件也是阻塞的。
(2)自动
根据配置文件,redis会在满足条件时,自动触发rdb持久化(自动触发使用的是bgsave)。RDB持久化默认配置如下:
dbfilename dump.rdb #rdb文件名
save 900 1 #在900秒(15分钟)之后,至少有1个key发生变化,
save 300 10 #在300秒(5分钟)之后,至少有10个key发生变化
save 60 10000 #在60秒(1分钟)之后,至少有10000个key发生变化
(3)关闭时自动持久化
使用redis-cli执行shutdown或者shutdown save时,会先进行持久化再关闭server。
直接kill进程或者shutdown nosave不会执行持久化动作,导致一部分数据丢失。
3.2 AOF文件追加增量持久化
概念
AOF持久化是通过将服务器执行的写命令追加到文件中,启动时通过读取AOF文件,重新执行写命令来恢复数据。
持久化配置
开启AOF持久化:
# 是否开启AOF,默认关闭(no)
appendonly yes
AOF文件路径:
appendfilename "appendonly.aof"
持久化频率
AOF支持上种模式的写磁盘模式,分别是always、everysec、no,解释如下:
# appendfsync always 每次收到写命令就立即强制写入磁盘。最有保证的方式,但是对redis性能影响非常大
appendfsync everysec # 每秒钟强制写入磁盘一次,在性能和持久化安全性方面做了很好的折中,是推荐的方式。
# appendfsync no 完全依赖OS的写入,一般为30秒左右一次,性能最好但是持久化最没有保证
AOF重写
AOF还可以对多条写命令进行重写,合并成单调命令,从而减小AOF文件的体积。
3.3 RDB和AOF
(1)同时开启RDB和AOF
Redis支持同时开启RDB和AOF,但是实际上当AOF开启并且aof文件存在时,优先从aof文件中恢复数据。当AOF关闭或者aof文件不存在时,使用RDB文件进行数据恢复。
(2)优缺点
RDB
优点:文件体积小,恢复快;
缺点:容易丢失数据,因为需要一定条件才会触发RDB文件生成;(默认配置最快60秒才新生成RDB文件)
AOF
优点:丢失数据较少,按照默认配置的话,每秒写一次文件,只会丢失1秒的数据。 缺点:文件提交大,恢复数据相对较慢。
aof文件和rdb文件大小比较示意图
(3)两者对过期键的处理
参考网址:
https://tech.souyunku.com/lukexwang/p/4710333.html
RDB
- 已过期的key不会被保存到rdb文件中;
- 从rdb文件恢复数据时,过期的key会被忽略(主服务器会忽略,从服务器不会忽略);
AOF
- 在key被惰性删除,或定期删除时会向AOF追加一条DEL命令
- 读取AOF文件时,过期键会被忽略(主从情况下不太确定?)