过期建删除策略:删除键的目的就是为了释放内存。
定时删除:
1.设置键的过期时间时,创建一个Timer,当过期时间到临时,立刻删除键。
2.内存友好策略。一旦键过期,就会被删除,并释放所占的内存。CPU不友好,当一批数量较多的key过期时,正好遇上CPU紧张的时段,这时候需要的是CPU处理能力,而不是内存,显然Cpu时间用在删除键上,会对服务器的吞吐量和响应时间造成影响。另外当前Redis时间事件无法高效的处理大量时间事件,所以定时删除不是一种好的删除策略。
惰性删除:
1.不管过期的键,在这种策略下,当键被取出时,首先检查键是否过期,若过期删除该键,否则返回该键。
2.很明显,惰性删除依赖过期键的被动访问,对内存不友好,如果一些键长期没有被访问,会造成内存泄漏。
定期删除:
1.有定时删除算法,定期的去检查一定的数据库,删除一定的过期键。
2.通过合理的删除操作执行的时长和频率,达到合理的删除过期键。
redis.conf中的过期淘汰配置
# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory
# is reached. You can select among five behaviors:
#最大内存策略:当到达最大使用内存时,你可以在下面5种行为中选择,Redis如何选择淘汰数据库键
#当内存不足以容纳新写入数据时
# volatile-lru -> remove the key with an expire set using an LRU algorithm
# volatile-lru :在设置了过期时间的键空间中,移除最近最少使用的key。这种情况一般是把 redis 既当缓存,又做持久化存储的时候才用。
# allkeys-lru -> remove any key according to the LRU algorithm
# allkeys-lru : 移除最近最少使用的key (推荐)
# volatile-random -> remove a random key with an expire set
# volatile-random : 在设置了过期时间的键空间中,随机移除一个键,不推荐
# allkeys-random -> remove a random key, any key
# allkeys-random : 直接在键空间中随机移除一个键,弄啥叻
# volatile-ttl -> remove the key with the nearest expire time (minor TTL)
# volatile-ttl : 在设置了过期时间的键空间中,有更早过期时间的key优先移除 不推荐
# noeviction -> don't expire at all, just return an error on write operations
# noeviction : 不做过键处理,只返回一个写操作错误。 不推荐
# Note: with any of the above policies, Redis will return an error on write
# operations, when there are no suitable keys for eviction.
# 上面所有的策略下,在没有合适的淘汰删除的键时,执行写操作时,Redis 会返回一个错误。下面是写入命令:
# At the date of writing these commands are: set setnx setex append
# incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd
# sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby
# zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby
# getset mset msetnx exec sort
# 过期策略默认是:
# The default is:
# maxmemory-policy noeviction
其他模块对过期键的处理
生成RDB文件时
执行 SAVE
或 BGSAVE
时 ,数据库键空间中的过期键不会被保存在RDB文件中
载入RDB文件时
1.Master载入RDB文件,未过期正常载入,过期不载入
2.Slave载入RDB文件时,所有键都会被载入,当进行同步时,会和Master保持一致。
AOF文件写入时
数据库空中的过期键过期但未被删除的释放的状态会被正常的记录到AOF文件中,当过期键发生释放删除时,DEL也会被同步到AOF文件中。
重新生成AOF文件时
执行 BGREWRITEAOF
时 ,数据库键中过期的键不会被记录到 AOF
文件中。
复制
1.master删除过期key之后,会向所有的slave服务器发生一个DEL命令,从服务器收到命令后会删除这些键。
2.Slave在被动的读取过期键时,不会做出操作,而是继续返回该键,只有当Master发送的DEL通知来,才会删除过期键,这是统一的、中心化的键删除策略,保证主从服务器的数据一致性。