- 过期集合:redis会将每个设置了过期时间的key放入到一个独立的字典中,定时遍历这个字典来删除到期的key,还可
结合惰性策略来删除过期二代key. - 定时扫描策略:Redis默认会每秒进行十次过期扫描,过期扫描不会遍历过期字典中所有的key,而是采用了一种简单的贪心策略.
1.从过期字典中随机20个key.
2.删除这20个key中过期的key.
3.如果过期的key比率超过1/4,那就重复1.
另外为保证过期扫描不会出现循环过渡,导致线程卡死现象,算法还增加了扫描时间的上限,默认不超过25ms.
大量key同时过期导致服务器卡顿,采用过期时间随机化解决该问题. - LRU:当Redis内存超出物理内存限制时,内存的数据会开始和磁盘产生频繁的交换(Swap),交换会让Redis的性能急剧下降.
Redis提供了配置参数maxmemory来限制内存超出期望大小.当实际内存超出maxmemory时,redis提供了几种可选
策略(maxmemory-policy)来让用户决定该如何腾出新的空间以继续提供读写服务. - noeviction: 不会继续服务写请求(DEL请求可继续服务),读请求可以继续进行.这样可以保证不会丢失数据,但是会让线
上的业务不能持续进行.这是默认的淘汰策略. - volatile-lru:尝试淘汰设置了过期时间的key,最少使用的key优先被淘汰.没有设置过过期时间的key不会被淘汰,这样可以
保证需要持久化的数据不会突然丢失. - volatile-ttl: 设置了过期时间的key根据剩余寿命ttl的值,ttl越小越优先被淘汰.
- volatile-random: 随机.
- allkeys-lru: 所有keylru.
- allkeys-random: 所有key随机.
一般做缓存的话,使用allkeys-xxx策略;如果使用其持久化策略的话,volatile-xxx策略.
- 懒惰删除:lazy free.删除指令del会直接释放对象的内存,大部分情况下,这个指令非常快,没有明显延迟.不过如果删除的key是一个非常大
的对象,则删除操作就会导致单线程卡顿.为解决这种卡顿问题,引入unlink指令,它能对操作进行懒处理,丢给后台线程来异步回收
内存.flush async参数同理.