1、过期键删除策略
redis过期的key并不会自动删除,需要redis根据设置的过期删除策略,耗费cpu的资源,执行删除逻辑。过期键删除策略有三种:定时删除、定期删除和惰性删除。
定时删除
在设置键的过期时间时,创建一个定时器,当键过期时间快到时,立即删除key。此策略对内存友好,但是会耗费大量的cpu资源,影响吞吐量。另外,创建定时器要用到redis服务器的时间事件,而时间事件的实现方式–无序链表,查找事件的时间复杂度时O(n),并不能高效低处理大量的时间事件。
因此,使用大量的定时器进行定时删除的策略,不实际。
定期删除
根据定期间隔(默认100ms)随机抽取M个key,删除过期的key,如果过期的key占抽取key的25%,则重新抽取M个key,执行删除操作,重复此操作直至过期key占抽取key的比例小于25%。
定期删除策略的难点是确定删除操作执行的时长和频率。
惰性删除
使用到某个key的时候,检查该key是否过期,如果过期,则删除。
redis使用定期删除+惰性删除
2、内存淘汰机制
定期删除+惰性删除并不能保证删除掉所有过期的key,随着时间的推移,内存可能会不够用,需要内存淘汰机制,释放出内存。
内存淘汰机制有一下6种:
- volatile-lru:最近最少使用算法,只淘汰设定了有效期的key;
- allkeys-lru:最近最少使用算法,所有key都有可能按照此机制淘汰;
- volatile-random:随机算法,只淘汰设定了有效期的key;
- allkeys-random:随机算法,所有的key都可以被淘汰;
- volatile-ttl:淘汰剩余有效期最短的key;
- no-enviction:不删除任意数据。
默认的内存策略是noeviction。