[Redis 5 教程] 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自带内存淘汰策略,但在开发时,我们还是尽量养成规范,养成节约内存的习惯,避免滥用内存

参考链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值