redis是将数据存放在内存里的,内存是有限的且有的业务场景也需要将数据设置为过期,所以就有了过期删除策略与淘汰策略。
过期删除策略分了定时删除、惰性删除与定期删除三种:
这里说一下定时与定期的主要差别:定时会扫描全部的键如果过期进行删除;而定期并不会扫描全部键,而是有一定的算法只是对其中一部分键进行删除。
通过三种删除策略的比较,惰性删除+定期删除结合可以一定程度上避免内存的无效占用,但也不可能完全避免,假设一下:如果某些键一直没被扫描到也没被使用,那它就会逃脱定期与惰性删除使得内存还是得不到释放,这样,我们就需要设置淘汰策略了。
当redis内存使用达到我们设置的maxmemory后,会根据淘汰策略清理内存,淘汰策略一有下面八种:
- noeviction 当内存不足以容纳写入数据时,新写入操作会报错。
- allkeys-lru 当内存不足以容纳写入数据时,移除最近最少使用的key。
- allkeys-random 当内存不足以容纳写入数据时,随机移除某个key。
- volatile-lru 当内存不足以容纳写入数据时,移除设置了过期时间里最近最少使用的key。
- volatile-random 当内存不足以容纳写入数据时,随机移除设置了过期时间的key。
- volatile-ttl 当内存不足以容纳写入数据时,优先移除更早过期时间的key。
- allkeys-lfu(Redis 4.0 以上),针对所有 Key,优先删除最少使用的 Key;
- volatile-lfu(Redis 4.0 以上),针对带有过期时间的 Key,优先删除最少使用的 Key。
有两点需要说明下:
- 一般不推荐使用random相关的淘汰策略,一些数据莫明其妙的不见给人造成困惑。不过也没有绝对,需要结合业务场景。
- 如果没设置过期时间,那volatile-lru/volatile-random/volatile-ttl的行为与noeviction差不多。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。