一,过期策略
定期删除
Redis默认每隔100ms随机抽取设置了过期时间的key,并对其进行检查,如果已经过期则删除。为什么是随机抽取? 因为如果存储了大量数据,全部遍历一遍是非常影响性能的!
惰性删除
每次获取key时会对key进行判断是否还存活,如果已经过期了则删除。如果一些键长期没有被访问,会造成内存泄露(垃圾数据占用内存)。
二,淘汰机制
在 Redis 中,允许用户设置最大使用内存大小 server.maxmemory
,在内存限定的情况下是很有用的。譬如,在一台 8G 机子上部署了 4 个 Redis 服务点,每一个服务点分配 1G 的内存大小,减少内存紧张的情况,由此获取更为稳健的服务。
Redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。Redis 提供 6 种数据淘汰策略:
- volatile-lru:(默认)淘汰已设置过期时间且最近最少使用的数据。
- volatile-ttl:淘汰已设置过期时间且将要过期的数据。
- volatile-random:随机淘汰已设置过期时间中的任意数据。
- allkeys-lru:淘汰所有key中最近最少使用的数据。(推荐)
- allkeys-random:所有key中随机淘汰数据。
- no-eviction:写入报错,不删除数据。
三,其它模块对过期键的处理
生成RDB文件时
执行SAVE或BGSAVE时 ,数据库键空间中的过期键不会被保存在RDB文件中。
载入RDB文件时
Master 载入RDB时,文件中的未过期的键会被正常载入,过期键则会被忽略。
Slave 载入RDB时,文件中的所有键都会被载入,当同步进行时,会和Master保持一致。
AOF文件写入时
已过期未被删除的键会被正常记录到AOF文件中,当过期键发生释放删除时,DEL 也会被同步到 AOF 文件中去。
重写rewrite AOF文件时
执行BGREWRITEAOF时,数据库键中过期的键不会被记录到AOF文件中。
复制
Master 删除过期Key之后,会向所有 Slave 服务器发送一个 DEL 命令,从服务器收到之后,会删除这些 Key。
Slave 在被动的读取过期键时,不会做出操作,而是继续返回该键,只有当Master 发送 DEL 通知来,才会删除过期键,这是统一、中心化的键删除策略,保证主从服务器的数据一致性。
评论区