那些有效期到了的数据,Redis并不是真的一到期立刻就把它删了,因为删除数据相比于其他客户端命令并不那么重要,这些数据会暂留在内存中,最终根据Redis的删除策略删除
好的删除策略应该是尽量寻找内存占用和CPU占用之间的平衡点,而不是单纯确保过期数据被删除,顾此失彼会造成Redis整体性能的下降,引起服务器宕机或内存泄露。
Redis 有三种删除策略:
对于时效性的数据,Redis在存储时,会以Hash的方式在expires中存储这些数据的地址和过期时间,那么在进行删除时,redis只会操作expires,把已经过期的时间戳对于的地址的内容删除。
下次访问时才真正删除,所有的获取数据的操作都需要经过expirelNeeded()
函数,该函数就是检查数据有没有过期,过期就删除,没过期才返回
这是一种比较折中的方案。Redis启动服务器初始化时,会先读取配置server.hz的值,这个值默认为10。Redis 每秒钟执行server.hz次serverCron(), serveCron()会调用databasesCron()来对Redis的每一个数据库进行轮询,在对单个数据库轮询时,又会调用activeExpireCycle(),activeExpireCycle()会对当前数据库的expires中随机挑选W个Key进行检测,如果Key超时了,就删除,如果删除的Key的数量 > W*25%
W 的取值取决于配置文件中ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP的值
特点:
当新数据进入Redis中时,内存不足怎么办?
freeMemoryIfNeeded()
检查内存是否充足,如果内存不满足储存新数据所需要的最小内存,Redis会临时删除一批数据为当前指令清理储存空间,清理储存空间的策略叫逐出算法
最大可使用内存
maxmemory
配置占用物理内存的比率,默认为0表示不受限制,生产环境通常设置为50%以上,根据需求设定
每次选取待删除数据的个数
maxmemory-samples
选取要删除的数据时并不会全库扫描,因为这样会导致严重的性能消耗,降低读写性能;因此Redis采用随机获取数据的方式作为待检测删除的数据
删除策略
maxmemory-policy
配置选出来后因该删除什么样的数据?【有8种逐出策略】
易丢失数据也就是设置了过期时间的数据,反正你迟早要过期,那早过期晚过期只是时间问题,有四种具体策略
不针对易丢失数据,而是看全部数据库里谁更应该被删除,有三种具体策略
禁用逐出策略【Redis 4.0默认的方式】,这样容易引起OOM
LRU 和 LFU