一、过期(redis主动删除)
- 设置了ttl过期时间的key,在ttl时间到的时候redis会删除过期的key。但是redis是惰性过期。
- 惰性过期:redis并不会立即删除过期的key,而是会在获取key的时候判断key是否过期,如果发现key过期了,才会进行删除。
- 定期删除:redis为了提升性能和减少内存的使用率,会开启1个定时任务,serverCorn默认100ms执行1次,从expires dict中以桶的维度去扫描设置了过期时间的key,扫描20个为至(默认,可配置,最多扫描400个桶),如果某个桶扫到1半已经扫到了20个key,则会把当前这个桶扫完。然后从扫描到的key中删除掉过期的key,如果删除比例超过10%(默认值,可配置),则会接着执行扫描和删除逻辑,循环16次之后会有个时间监测,如果超过指定时间则跳出。
二、淘汰(不得已而为之)
- 当redis内存不足的时候,set key没有足够的内存,redis以1定的策略删除掉1些key(有效的数据),来释放内存,从而保证新数据能set成功,这就是淘汰。
- 淘汰策略:
- novication: 默认淘汰策略,不删除key,能读,不能写;
- allkeys-random:从所有的key中,随机删除key;
- volatile-random:随机从设置了过期时间的key中,删除数据;
- allkeys-lfu:从所有key中删除使用频率(次数)最少的key;
- volatile-lfu: 从设置了过期时间的key中,删除使用次数最少的key
- allkeys-lru: 从所有key中删除最近最少使用的key
- volatile-lru: 从设置了过期时间的key中,删除最近最少使用的key
- volatile-ttl: 从设置了过期时间的key中,删除快要过期的key
- 如何淘汰:
- 不同的淘汰策略,lru、lfu、ttl会根据采样计算淘汰值,越大越容易淘汰。并且有1个大小为16的淘汰池,会动态的替换淘汰池中的key,淘汰值越大的key在淘汰池中的位置越靠前。这样经过采用,保证能淘汰掉最适合被淘汰的数据。