文章目录
- 场景
- 缓存容量大小
- 设置缓存容量
- 内存淘汰策略
- 不会淘汰数据
- noeviction(默认使用)
- 会淘汰数据
- volatile-random、volatile-ttl、volatile-lru、volatile-lfu
- allkeys-lru、allkeys-random、allkeys-lfu
- 配置淘汰策略
- 配置文件
- 如何避免Redis内存占用过多
- 参考链接
场景
- 内存大小毕竟有限,随着要缓存的数据量越来越大,有限的缓存空间不可避免地会被写满。
- 数据访问都是有局部性的,也就是我们通常所说的“八二原理”,80% 的请求实际只访问了 20% 的数据
缓存容量大小
- 我们不能简单地按照“总数据量的 20%”来设置缓存最大空间容量。在实践过程中,我看到过的缓存容量占总数据量的比例,从 5% 到 40% 的都有。这个容量规划不能一概而论,是需要结合应用数据实际访问特征和成本开销来综合考虑的。
- 一般来说,建议把缓存容量设置为总数据量的 15% 到 30%,兼顾访问性能和内存空间开销。
设置缓存容量
config set maxmemory 100mb
内存淘汰策略
- Redis 4.0 之前一共实现了 6 种内存淘汰策略,在 4.0 之后,又增加了LFU的 2 种策略,共有8种策略。我们可以按照是否会进行数据淘汰把它们分成两类:
不会淘汰数据
- noeviction
noeviction(默认使用)
- redis.conf
# The default is:
#
# maxmemory-policy noeviction
默认情况下,Redis 在使用的内存空间超过 maxmemory 值时,并不会淘汰数据,也就是设定的 noeviction 策略。对应到 Redis 缓存,也就是指,一旦缓存被写满了,再有写请求来时,Redis 不再提供服务,而是直接返回错误。
会淘汰数据
- 对设置过期时间的数据进行淘汰 (volatile 前缀)
- 包括 volatile-random、volatile-ttl、volatile-lru、volatile-lfu(Redis 4.0 后新增)四种。
- 在所有数据范围内淘汰 (allkeys 前缀)
- 在所有数据范围内进行淘汰,包括 allkeys-lru、allkeys-random、allkeys-lfu(Redis 4.0 后新增)三种。
volatile-random、volatile-ttl、volatile-lru、volatile-lfu
- 它们筛选的候选数据范围,被限制在已经设置了过期时间的键值对上。也正因为此,即使缓存没有写满,这些数据如果过期了,也会被删除。
- volatile-ttl 在筛选时,会针对设置了过期时间的键值对,根据过期时间的先后进行删除,越早过期的越先被删除。
volatile-random 就像它的名称一样,在设置了过期时间的键值对中,进行随机删除。
volatile-lru 会使用 LRU 算法筛选设置了过期时间的键值对。
volatile-lfu 会使用 LFU 算法选择设置了过期时间的键值对。
allkeys-lru、allkeys-random、allkeys-lfu
- allkeys-lru、allkeys-random、allkeys-lfu 这三种淘汰策略的备选淘汰数据范围,就扩大到了所有键值对,无论这些键值对是否设置了过期时间。
- allkeys-random 策略,从所有键值对中随机选择并删除数据;
allkeys-lru 策略,使用 LRU 算法在所有数据中进行筛选。
allkeys-lfu 策略,使用 LFU 算法在所有数据中进行筛选。
配置淘汰策略
配置文件
maxmemory-policy noeviction
如何避免Redis内存占用过多
- 虽然Redis自带内存淘汰策略,但在开发时,我们还是尽量养成规范,养成节约内存的习惯,避免滥用内存