Expire
Redis的数据可以采用expire命令 设置过期时间,到了过期时间之后reids并不是立即将过期的key删除;
而是采用了两种方式来进行过期key的处理:
定期删除:redis默认每隔1000ms随机获取部分key,如果已经过期就将对应的key删除;
惰性删除:在每次访问key的时候回检查key是否已经过期,如果过期就将对应的key删除;
内存淘汰策略
redis配置文件中有个maxMemory参数,当内存中的数据达到该最大内存的配置,新的数据写入会执行淘汰策略;
maxMemory如果设置为0,表示不限制,当系统内存不足以容纳新的写入数据的场景下,redis同样会采取内存淘汰策略:
1. noeviction: 内存不足以写入新数据的情况下**直接报异常**;
2. allkeys-lru: 在**所有数据集中**将最少是用的数据移除;
3. allkeys-random:在**所有数据集中** 随机移除一些数据;
4. volatile-ttl: 在**设置过期的数据集**中选最早过期的数据进行移除;
5. volatile-random:在**设置过期的数据集**中随机选择部分数据移除;
6. volatile-lru:在**设置过期的数据集**中移除最少使用的数据;
内存淘汰策略设置默认是 noeviction;
# maxmemory-policy noeviction
LRU
redis采用的LRU是非精准的LRU算法,基于抽样实现;
由于redis是单线程的,如果采用全量的数据进行LRU计算,会比较消耗CPU资源;
因此,redis提供了一个重要参数:
# maxmemory-samples 5
该参数表示,每次随机选出5个不经常使用的key进行移除;
配置的 参数值越大,其LRU结果能接近全量LRU的结果;
但同时会给CPU带来比较大的开销,因此如果仅仅将redis作为LRU缓存服务使用,建议保持默认配置即可。
备注:了解一下LRU算法和LRU算法实现;