Redis数据淘汰策略
数据的淘汰策略:当Redis中的内存不够用时,此时在向Redis中添加新的key,那么Redis就会按照某一种规则将内存中的数据删除掉,这种数据的删除规则被称之为内存的淘汰策略。
一、8种淘汰策略
Redis支持8种不同策略来选择要删除的key:
1.1 核心算法原理
在学习这8中淘汰策略前,我们先来了解一下其中的核心算法原理:
1.LRU(最近最少使用)
核心思想:优先淘汰最久未被访问的数据
类比:像整理书架,把最近用过的书放在前面,长期不用的放到后面
2. LFU(最少频率使用)
核心思想:优先淘汰使用频率最低的数据
类比:图书馆下架那些借阅量最少的书籍
3.TTL(生存时间)
优先淘汰即将过期的键
对没有设置TTL的键永不淘汰
1.2 8种淘汰策略
1. 不淘汰策略
noeviction(默认):不淘汰任何的key,但是内存满时不允许写入新的数据。
2. 全体键范围淘汰
策略 | 算法 | 描述 |
---|---|---|
allkeys-lru | LRU | 从所有键中淘汰最近最少使用的 |
allkeys-lfu | LFU | 从所有键中淘汰使用频率最低的 |
allkeys-random | 随机 | 随机淘汰所有键 |
3. 过期键范围淘汰
策略 | 算法 | 描述 |
---|---|---|
volatile-lru | LRU | 从设置了过期时间的键中淘汰LRU |
volatile-lfu | LFU | 从设置了过期时间的键中淘汰LFU |
volatile-random | 随机 | 随机淘汰有过期时间的键 |
volatile-ttl | TTL | 淘汰剩余生存时间最短的键 |
1.3 策略选择建议
针对于不同的场景问题,我们可以在配置文件中设置合适的淘汰策略:
场景特征 | 推荐策略 | 理由 |
---|---|---|
数据重要性相同 | allkeys-lru | 有效利用内存 |
有明显热点数据 | allkeys-lfu | 更好保护热点 |
数据访问均匀 | allkeys-random | 公平淘汰 |
混合持久/临时数据 | volatile-lru | 保护持久数据 |
临时缓存数据 | volatile-ttl | 自然淘汰 |
数据不可丢失 | noeviction | 确保数据安全 |
以下是配置文件中的相应配置示例:
# 内存限制1GB
maxmemory 1gb
# 使用LFU淘汰策略
maxmemory-policy allkeys-lfu
二、相关面试问题
2.1 redis的内存淘汰策略有哪些?
首先,在了解redis的内存淘汰策略之前,我们需要了解到2个核心的算法概念:LRU最近最少使用算法,优先淘汰最近最少使用的数据;LFU最少频率使用算法,优先淘汰最少频率使用的数据。
然后,redis中提供了8种内存淘汰策略,其可分为三大类:不淘汰策略、全体键淘汰策略和过期键淘汰策略。首先,redis默认就是不淘汰策略noeviction,不淘汰数据,但是内存满时也无法填加新数据;然后,全体键淘汰策略主要包含有allkeys-lru、allkeys-lfu和allkeys-random;其次,过期键淘汰策略主要包含有volatile-ttl、volatile-lru、volatile-lfu和volatile-random。
最后,在redis的config配置文件中,我们可以根据不同的业务场景来选择适合的淘汰策略
2.2 数据库中有1000万条数据,redis中只能存储20w条数据。如何保证redis中的数据都是热点数据?
我们可以使用allkeys-lru内存淘汰策略,挑选出最近最少使用的数据淘汰,那么留下来的就是热点数据。