Redis的数据淘汰机制有哪些?
Redis的数据淘汰机制有哪些?
提示
题眼:冷门题目
Redis缓存基于内存实现的,则其缓存其容量是有限的,当出现缓存被写满的情况,Redis就需要缓存数据淘汰机制,通过一定淘汰规则将一些数据刷选出来删除,让缓存服务可再使用。
在Redis 4.0 之后,Redis 缓存淘汰策略6+2种,包括分成三大类:
- 不淘汰数据
* noeviction ,不进行数据淘汰,当缓存被写满后,Redis不提供服务直接返回错误。 - 在设置过期时间的键值对中
* volatile-random ,在设置过期时间的键值对中随机删除
* volatile-ttl ,在设置过期时间的键值对,基于过期时间的先后进行删除,越早过期的越先被删除。
* volatile-lru , 基于LRU(Least Recently Used) 算法筛选设置了过期时间的键值对, 最近最少使用的原则来筛选数据
* volatile-lfu ,使用 LFU( Least Frequently Used ) 算法选择设置了过期时间的键值对, 使用频率最少的键值对, 来筛选数据。 - 在所有的键值对中
* allkeys-random, 从所有键值对中随机选择并删除数据
* allkeys-lru, 使用 LRU 算法在所有数据中进行筛选
* allkeys-lfu, 使用 LFU 算法在所有数据中进行筛选
重要
参考答案:
根据我了解的,Redis大概有五种数据淘汰策略。第一种和第二种是不淘汰和随机淘汰,不淘汰就是满了以后redis直接不再写入,直接返回错误。随机淘汰是会对现有的数据进行随机淘汰。这两种方法,显然不太合理,所以基本上不用。
然后剩下三种是比较常见的,fifo先进先出,LRU和LFU。一般情况下,会采用LRU的策略,它的话就是维持了一个队列,这个队列里放的是Key,每次操作一个Key就把这个Key放到队列的最前面,这样最近这段时间,没有被访问的数据,就肯定在后面了,这样后续只需要清理掉队列尾巴上的Key就行。这样的好处是,不会把这会正在使用的数据给误删掉。但是它也有一种极端场景,就是前面的都是最近被访问了几次的数据,队尾的反而是频繁使用的数据,那么这种情况的话可以采用LFU来处理。
相关信息
引申:redis 执行删除是立刻就删除数据的么?
