Redis 缓存删除策略

article/2025/8/27 10:33:51

Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

Redis中的数据特征

Redis是一种内存级数据库,所有数据均存放在内存中,内存中的数据可以通过TTL指令获取其状态

  • XX :具有时效性的数据

  • -1 :永久有效的数据

  • -2 :已经过期的数据或被删除的数据或未定义的数据

在我们了解完基础知识后我们进入主题,来看看它的删除策略!

Redis 缓存删除策略分为定时删除、定期删除与惰性删除。前两个是主动删除,后一个是被动删除。

一、数据删除策略

数据删除策略的目标:在内存占用与CPU占用之间寻找一种平衡,顾此失彼都会造成整体redis性能的下降,甚至引发服务器宕机或
内存泄露。

时效性数据的存储结构:

定时删除 

  • 创建一个定时器,当key设置有过期时间,且过期时间到达时,由定时器任务立即执行对键的删除操作 
  • 优点:节约内存,到时就删除,快速释放掉不必要的内存占用 
  • 缺点:CPU压力很大,无论CPU此时负载量多高,均占用CPU,会影响redis服务器响应时间和指令吞吐量 
  • 总结:用处理器性能换取存储空间 (拿时间换空间) 

2. 惰性删除 

  • 数据到达过期时间,不做处理。等下次访问该数据时,如果未过期,返回数据 ;发现已过期,删除,返回不存在。 
  • 优点:节约CPU性能,发现必须删除的时候才删除 
  • 缺点:内存压力很大,出现长期占用内存的数据 
  • 总结:用存储空间换取处理器性能(拿空间换时间)

3. 定期删除 

  • 两种方案都走极端,有没有折中方案?
  •  周期性轮询redis库中的时效性数据,采用随机抽取的策略,利用过期数据占比的方式控制删除频度 
  • 特点1:CPU性能占用设置有峰值,检测频度可自定义设置 
  • 特点2:内存压力不是很大,长期占用内存的冷数据会被持续清理 
  • 总结:周期性抽查存储空间 (随机抽查,重点抽查) 

 

 删除策略比对

内存占用CPU占用特征
定时删除节约内存,无占用不分时段占用CPU资源,频度高时间换空间
惰性删除内存占用严重延时执行,CPU利用率高空间换时间
定期删除内存定期随机清理每秒花费固定的CPU资源维护内存随机抽查,重点抽查

 在redis里,会使用惰性删除和定期删除两种方式

策略失效场景

惰性删除因为直到访问过期 key 时才删除它,可能导致内存出现大量过期的 key。而定期删除是一种随机抽取策略,有些 key 可能一直没有被抽取到,导致一直驻留在内存中。所以这两种策略都可能导致 Redis 的内存占有率越来越高。这时就需要内存淘汰机制来解决这一问题。

逐出算法

当内存被永久数据占满(删除策略只能清除过期数据),新数据进入redis时,如果内存不足怎么办?

Redis使用内存存储数据,在执行每一个命令前,会调用freeMemoryIfNeeded()检测内存是否充足。如果内存不满足新加入数据的最低存储要求,redis要临时删除一些数据为当前指令清理存储空间。清理数据的策略称为逐出算法

注意:逐出数据的过程不是100%能够清理出足够的可使用的内存空间,如果不成功则反复执行。当对所有数据尝试完毕后,如果不能达到内存清理的要求,将出现如下错误信息:
 

影响数据逐出的相关配置

  1. maxmemory:redis可使用内存占物理内存的最大比例,默认为0,表示不限制redis使用内存。生产环境中根据需求设定,通常设置在50%以上
  2. maxmemory-samples:每次选取待删除数据的个数,选取数据时并不会全库扫描,导致严重的性能消耗,降低读写性能。因此采用随机获取数据的方式作为待检测删除数据
  3. maxmemory-policy:达到最大内存后的,对被挑选出来的数据进行删除的算法

内存淘汰机制

Redis 有两种数据集,一种是设置了过期 key 的集合(volatile),另一种是包含所有 key 的集合(allkeys)。它们都拥有以下这些内存淘汰机制。

检查可能会过期的数据集server.db[i].expires内的数据

  1. volatile-lru:挑选最近最少使用(最长时间不使用的)的数据淘汰,使用较多
  2. volatile-lfu:挑选最近使用次数最少的数据淘汰
  3. volatile-ttl :挑选将要过期的数据淘汰
  4. volatile-random:任意选择数据淘汰,一般用的少

检测全库数据(所有数据集server.db[i].dict)

  1. allkeys-lru:挑选最近最少使用的数据淘汰
  2. allkeys-lfu:挑选最近使用次数最少的数据淘汰
  3. allkeys-random:任意选择数据淘汰

(1)LRU

LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”3。

本质上是把最久未被访问的元素淘汰掉。

(2)Random

淘汰掉随机选取的某些元素。

(3)LFU

LFU (Least frequently used) 最不经常使用,如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小4。

LFU 是选择一段时间内使用次数最少的那个元素,而 LRU 是选择在内存中排在队尾的那个最近没有被使用过的元素,因为如果元素被使用过,那么会被排在队头。 

 (4)TTL

TTL 是 Time To Live5。当 key 过期,会被马上清除。

放弃数据驱逐 
 no-enviction(驱逐):禁止驱逐数据(redis4.0中默认策略),会引发错误OOM(Out Of Memory) 

maxmemory-policy volatile-lru

数据逐出策略配置依据

使用INFO命令输出监控信息,查询缓存 hit 和 miss 的次数,根据业务需求调优Redis配置 。


http://chatgpt.dhexx.cn/article/4DS9IWCL.shtml

相关文章

Linux下redis清理缓存

1、先确保redis进程存在: 2、进入redsi下面的bin目录; 3、执行:执行./redis-cli登陆; 4、查看当前数据库key的数量,执行:dbsize命令 (如果出现(error) ERR unknown command ‘(error)’ &#x…

利用Redis进行数据缓存

1. 引言 缓存有啥用? 降低对数据库的请求,减轻服务器压力提高了读写效率 缓存有啥缺点? 如何保证数据库与缓存的数据一致性问题?维护缓存代码搭建缓存一般是以集群的形式进行搭建,需要运维的成本 2. 将信息添加到…

Linux下如何清空Redis缓存

1.首先进到redis的安装目录,进到src目录下,找到redis-cli 2.首先用账号密码的方式进入到redis的服务端 ./redis-cli -h 127.0.0.1 -p 6379 进去后会出现下面的界面ip:port> 然后,输入密码进行鉴权>auth "yourpassword"&a…

redis如何清空指定缓存和所有缓存

Windows环境下使用命令行进行redis缓存清理 1.访问redis根目录 cd D:\development_tools\redis64-3.0.501 2.登录redis:redis-cli -h 127.0.0.1 -p 6379 3.查看所有key值:keys * 4.删除指定索引的值:del key 5.清空整个 Redis 服务器的数据&…

redis删除缓存

首先下载一个redis可视化管理页面:RedisDesktopManager, 1、点击连接到redis服务器 2、 填写连接Ip地址,端口(默认6379),有密码填写密码,没用密码就不用填写了,然后点击测试连接,连接成功后,可以找到自己…

如何清理Redis中的缓存

首先在cmd模式下进入redis的目录, 然后使用 redis-cli -p 6379(指定进入的端口号,本人的端口号为6379) 进入该端口的redis数据库之后有以下两种清空缓存的命令 1.清空当前redis数据库缓存flushdb flushdb 2.清空整个redis缓存flushall flushall

redis如何清空缓存

前言: 如果你们的项目用到redis啦,虽然设置了过期时间,但有时候修改bug,仍然需要及时清空缓存,去读数据库的数据,所以这篇文章讲解如何在linux下清除redis的缓存。 正文: 1.首先进到redis的安…

redis如何清空当前缓存和所有缓存

Windows环境下使用命令行进行redis缓存清理 1、redis安装目录下输入cmd 2、redis-cli -p 端口号 3、flushdb 清除当前数据库缓存 4、flushall 清除整个redis所有缓存 客户端直接 右键即可:

redis 清理缓存

----windos 方法1,重启redis也能请缓存。 方法2,清缓存前确保redis-server.exe进程已经启动,然后打开redis-cli.exe,跳出的CMD里面输入flushall,显示OK就可以了。 flushall:清空整个redis 服务器的数据(删除…

redis清理缓存

redis如何清空缓存 如果你们的项目用到redis啦,虽然设置了过期时间,但有时候修改bug,仍然需要及时清空缓存,去读数据库的数据,所以这篇文章讲解如何清除redis的缓存。 正文 1.首先进到redis的安装目录,进…

WPS为公式编号

首先打开标尺,看一下中间位置(放公式),和后面位置(放编号)的刻度是多少,我中间位置目测是17个字符,后面位置是38个字符 为你的公式新建一个样式 这里主要注意两个地方,“制表位”和“段落”…

mathtype自动设置公式编号及更新

在写论文的时候难免要用到mathtype,mathtype相对来说还是好用的 使用mathtype的好处之一是可以利用mathtype自动设置公式编号及更新,非常方便,而且可以引用公式,在删除公式时不用手动更新公式编号,mathtype可以自动帮你…

使用MathType为公式自动编号

使用MathType为公式自动编号 公式格式设置修改章节号 公式格式设置 首先设置编号格式,在这里我们先将公式设置成(1-1-1)这样的,后续再讲如何修改成(1-1),看这两者有什么区别; 插入…

Mathtype怎么设置公式编号 ?公式编号怎么自动更新?删除新增公式后编号自动更新?

文章目录 1 公式编号设置2 插入公式3 公式编号怎么自动更新3.1 正常插入公式 编号自动更新3.2 文章中 增加公式 编号自动更新3.3 文章中 删除公式 编号自动更新3.4 文中 引用的公式编号 及 自动更新 以插入下面公式为例, 假如现在在第二单元,插入第一公式…

中值滤波器 C++ 实现

均值滤波是像素周围的33的像素做平均值操作, 那么中值就是在33中的像素中寻找中值 一般来说这个中值滤波是去除椒盐噪声的非常理想的选择。 /** ** method to remove noise from the corrupted image by median value * param corrupted input grayscale binary ar…

基于opencv,C++实现中值滤波器

基于opencv,C实现中值滤波器 目的:去除图像的椒盐噪声 原理:它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值 伪代码: 输入:原图像、目标图像、核的半径 (1).判断原图像是否为空,…

python自编中值滤波器

使用python实现图像的中值滤波 椒盐噪声处理的图片: import numpy as np import matplotlib.pyplot as plt from skimage import io def mediafil(img,m): #滤波后会缺失边缘,先对原图进行0 paddingimg1np.zeros((img.shape[0]m-1,img.shape[1]m-1))im…

空间滤波-随机椒盐噪声-高斯噪声-均值滤波器-中值滤波器

文章目录 1 随机椒盐噪声2 高斯噪声3 均值滤波器4 中值滤波器 1 随机椒盐噪声 椒噪声:灰度值为0的噪声点,黑噪声 盐噪声:灰度值为255的噪声点,白噪声 思路:获取图像长、宽、通道数,在每个通道矩阵中随机产…

《数字图像处理》手动实现修正的α均值滤波+手动实现自适应中值滤波器

1 修正的α均值滤波实现 1.1 修正的α均值滤波原理 假设在邻域S_xy内去掉g(x,t)最低灰度值的d/2和最高的灰度值的d/2。令g_r (x,t)代表剩下的mn-d个像素。由这些剩余的像素的平均值形成的滤波器就称为修正的α均值滤波器: 其中,d的取值范围可以为0到m…

3D点云处理:半径滤波器中值滤波器

文章目录 0. 效果1. 半径滤波器1.1. 半径滤波器基本内容1.2 pcl实现2. 中值滤波器2.1.中值滤波器基本内容2.2 pcl实现3. 参考0. 效果 红色点云为处理的点云;白色为滤除的点云。 1. 半径滤波器 1.1. 半径滤波器基本内容 设置目标点半径范围内最少点数,如果少于该点数,则认为…