如果你的 Redis 只能存10G数据,你写了12G,那么 Redis 会怎么淘汰那2G数据呢?
过期键删除策略
我们都知道,删除键的目的,就是释放内存占用。那么,当一个键过期了,Redis 什么时候会去删除它呢?
定时删除
惰性删除
定期删除
redis.conf 中的过期淘汰配置
看下 Redis 源码中的默认配
# 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文件时
AOF 文件写入时
数据库键空间的过期键的过期但并未被删除释放的状态会被正常记录到 AOF 文件中,当过期键发生释放删除时,DEL 也会被同步到 AOF 文件中去。
重新生成 AOF文件时
执行 BGREWRITEAOF 时 ,数据库键中过期的键不会被记录到 AOF 文件中
复制