【redis过期删除】

devtools/2024/9/20 3:58:09/ 标签: redis, bootstrap, 数据库

redis_3">redis过期删除

redis的键可以设置过期时间,但是并不是每个键一到过期时间就会立即删除,redis不可能给每个设置过期时间的key上添加一个定时器来监视是否过期,CPU根本承受不了如此多的定时线程

注意:我使用的版本是6.0.10,不同版本可能略有差别

删除策略

存在的删除策略:

  • 定时删除 在设置键的同时创建定时器,过期时间到了就执行对键的删除,这种策略对内存使用率有优势,但是占用CPU资源太多
  • 定期删除 每隔特定时间对数据库进行一次扫描,检测并删除其中过期的键值对
  • 惰性删除 键值对过期暂时不进行删除,当获取键时先查看是否已经过期,过期则进行删除,这种策略可能会由于一些过期key一直没有被访问,浪费一定的内存

redis采用的策略是定期删除+惰性删除

定期删除是指每隔一段时间去检查是否有过期的key,如果有则删除

惰性删除是指在获取key的时候检查一下这个key是否过期

定期删除的配置是hz(默认是10,即每秒十次扫描)

首先客户端在尝试访问某个key的时候,redis会检查是否过期,如果过期则删除,但是有些key是不会被访问到的,redis的定期删除则会进行扫描并删除过期的key

  1. 从过期字典里随机抽取20个key
  2. 删除这20个key中已经过期的key
  3. 如果过期的比例超过25%,则重复步骤一

过期的key过多会导致循环抽取删除,为防止过度循环,增加了扫描时间的上限,默认不超过25ms

应该避免同一时刻大量key同时过期

在主从结构中,从服务器就算读取到过期键也不会删除,只有接收到主服务器发来的del命令之后才会删除

淘汰机制

配置最大内存的大小,如果超过该内存大小,就会使用淘汰机制进行淘汰

confmaxmemory 100mb

也可以通过命令进行修改

shell127.0.0.1:6380> config set maxmemory 50mb
OK
127.0.0.1:6380> config get maxmemory
1) "maxmemory"
2) "52428800"

由于使用定期删除+惰性删除机制,但是也可能很多过期的没有被删除掉导致内存不足的情况,所以redis存在淘汰机制

  • volatile-lru -> Evict using approximated LRU, only keys with an expire set 当内存不足时,设置了过期时间的键,选取最近最少使用的键抛弃(Least Recently Used)
  • allkeys-lru -> Evict any key using approximated LRU 当内存不足时,对于所有的键,选取最近最少使用的键抛弃(Least Recently Used)
  • volatile-lfu -> Evict using approximated LFU, only keys with an expire set 当内存不足时,设置了过期时间的键,选取最少频率使用的键抛弃(Least Frequently Used)
  • allkeys-lfu -> Evict any key using approximated LFU 当内存不足时,对于所有的键,选取最少频率使用的键抛弃(Least Frequently Used)
  • volatile-random -> Remove a random key having an expire set 当内存不足时,对于设置过期时间的键,随机选取键抛弃
  • allkeys-random -> Remove a random key, any key 当内存不足时,对于所有的键,随机选取键抛弃
  • volatile-ttl -> Remove the key with the nearest expire time (minor TTL) 当内存不足时,抛弃最近要过期的键
  • noeviction -> Don’t evict anything, just return an error on write operations 默认策略,不淘汰,如果内存已满,写操作返回错误

在使用volatile-lfu、volatile-random、volatile-ttl时,如果没有key可以淘汰,则与noeviction一样在写操作时返回错误

获取当前的内存策略

shellconfig get maxmemory-policy

可以在配置文件修改

confmaxmemory-policy noeviction

也可以使用命令设置

shellconfig set maxmemory-policy noeviction

在进行LRU/LFU/TTL淘汰策略时,并不是那么准确,可以通过采样率来进行设置其准确度,默认是5,即随机选出5个key,然后淘汰掉里面最近最少使用的key。

当设置为10的时候就非常接近真正的LRU算法了,但是会消耗更多的CPU,5已经是足够好的结果了

confmaxmemory-samples 5

http://www.ppmy.cn/devtools/52263.html

相关文章

/usr/bin/ld: 当搜索用于 /lib/i386-linux-gnu/libcuda.so 时跳过不兼容的 -lcuda

/usr/bin/ld: 当搜索用于 /lib/i386-linux-gnu/libcuda.so 时跳过不兼容的 -lcuda ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/023dbdeb215b4b4580f7f54706e32af9.pn当使用unsloth做微调时,发现找不到libcuda,很自然想到需要软链接到最新…

HandyControl 使用内置Command 执行无效问题

HandyControl 中通过查阅代码HandyControl_Shared 共享项目中,Interactivity/Commands 目录下,存在着一些内置 Command,开心发现还有关闭窗体,最小化等系统级别常用命令。 CloseWindowCommand.cs ControlCommands.cs OpenLinkCom…

ctfshow web七夕杯

web签到 执行命令没有回显&#xff0c;我们直接写文件就可以了 有字符长度限制 ls />a nl /*>a访问url/api/a下载文件 easy_calc <?phpif(check($code)){eval($result."$code".";");echo($result); }function check(&$code){$num1…

IP分片的隐患,以及TCP分片

好的&#xff0c;我们来用一个生活中的例子更详细地解释 MTU、MSS&#xff0c;以及 IP 和 TCP 分片。 MTU 和 MSS 的概念 MTU&#xff08;Maximum Transmission Unit&#xff0c;最大传输单元&#xff09;&#xff1a; 假设你搬家&#xff0c;需要用卡车搬运家具。 卡车的最…

一行代码实现鼠标横向滚动

&#x1f9d1;‍&#x1f4bb; 写在开头 点赞 收藏 学会&#x1f923;&#x1f923;&#x1f923; 在项目中我们可能会遇到当鼠标在某个区域内&#xff0c;我们希望滚动鼠标里面的内容可以横向滚动&#xff1b; 比如我们一些常见的后台状态栏&#xff1a; 那这种该怎么写&…

LearnDash+BuddyBoss:终极在线课程社区组合

您是否希望使用 WordPress 建立在线课程社区&#xff1f; 如果是这样&#xff0c;没有比LearnDash和BuddyBoss在线课程社区更好的组合了。使用这两款产品&#xff0c;您可以创建和销售在线课程、创建群组和讨论&#xff0c;并为您的学生提供整个社交网络&#xff0c;所有这些都…

PLSQL、Oracle以及客户端远程连接服务器笔记(仅供参考)

1.PLSQL参考链接&#xff1a; 全网最全最细的PLSQL下载、安装、配置、使用指南、问题解答&#xff0c;相关问题已汇总-CSDN博客文章浏览阅读2.9w次&#xff0c;点赞98次&#xff0c;收藏447次。双击之后&#xff0c;这里选择安装目录&#xff0c;你安装目录选的哪里&#xff0…

新手怎么使用GitHub?

GitHub新手使用指南&#xff0c;涵盖了从注册、创建仓库、版本控制基本操作到SSH密钥配置等关键步骤&#xff1a; 第一步&#xff1a;注册与登录 访问GitHub官方网站&#xff1a;https://github.com。点击页面右上角的"sign up"按钮开始注册账号。输入有效的电子邮…

Macbook M芯片Homebrew与git的安装与配置

Macbook M芯片Homebrew与git的安装与配置 Homebrew的安装与配置 搜索Homebrew; 找到如下网址https://brew.sh/ 把以上命令复制到终端 执行后&#xff0c;发现并不能下载&#xff1b; 如果你像我一样也是不通的&#xff0c;可以使用国内源,将如下命令复制到终端&#xff1a;…

深入探索深度学习的验证集:必要还是可选?

深入探索深度学习的验证集&#xff1a;必要还是可选&#xff1f; 在深度学习项目的设计和实施过程中&#xff0c;数据通常被划分为训练集、测试集&#xff0c;以及有时的验证集。尽管在一些研究中&#xff0c;我们可能看到只有训练集和测试集被使用&#xff0c;验证集的作用及…

第壹章第15节 C#和TS语言对比-泛型

C#提供了泛型的完整支持&#xff0c;不仅在编译时&#xff0c;运行时仍然保留泛型的类型信息&#xff0c;同时提供了更加丰富的泛型约束和更加全面的协变逆变支持。TS的泛型&#xff0c;在语法表现形式上&#xff0c;和C#差不多&#xff0c;但本质上两者是不一样的。TS的泛型&a…

2024年春季学期《算法分析与设计》练习15

问题 A: 简单递归求和 题目描述 使用递归编写一个程序求如下表达式前n项的计算结果&#xff1a; (n<100) 1 - 3 5 - 7 9 - 11 ...... 输入n&#xff0c;输出表达式的计算结果。 输入 多组输入&#xff0c;每组输入一个n&#xff0c;n<100。 输出 输出表达式的计…

selenium中,怎么判断是否已选多选框

html文件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body><p>测试勾选</p><div><input type"checkbox" name"b…

数据库和DDL语句

数据库和DDL语句 数据库&#xff1a;SQL:分类&#xff1a;DDL:操作库&#xff1a;操作表&#xff1a;操作字段&#xff1a; 数据库&#xff1a; ​ 数据库&#xff08;database&#xff09;就是一个存储数据的仓库。为了方便数据的存储和管理&#xff0c;它将数据按照特定的规律…

linux kernel 驱动模型中匹配顺序是怎样的

今天看驱动&#xff0c;发现有几处都可以进行匹配&#xff0c;我就在想他们的优先顺序是怎样的 这里看的是platform架构 其他的应该一样 跟踪代码发现如下代码&#xff1a; __driver_attach //./drivers/base/dd.c driver_match_device ./drivers/base/base.h drv->…

数据库基础——数字、字符串、日期时间、二进制

数据库的分类 定义&#xff1a;主要是数据表的创建、删除、修改 操纵&#xff1a;对数据进行增删添改 控制&#xff1a;对数据库的权限进行管理 数据库不区分大小写&#xff0c;一条语句的结尾以英文分号结尾 命名不能是关键字&#xff0c;只能使用英文、数字和下划线 注释可以…

COVINS-G编译注意事项

install_files.sh 修改source devel/setup.bash 为 source devel/setup.zsh cv_bridge 为了防止和本机的noetic的cv_bridge冲突&#xff0c;需要放入一个旧版本的cv_bridge。 先编译好opencv3_catkin&#xff0c;然后添加cv_bridge,也就是下载vision_opencv的melodic分支到cov…

文章MSM_metagenomics(七):分组马赛克图

欢迎大家关注全网生信学习者系列&#xff1a; WX公zhong号&#xff1a;生信学习者Xiao hong书&#xff1a;生信学习者知hu&#xff1a;生信学习者CDSN&#xff1a;生信学习者2 介绍 本教程是使用一个Python脚本来绘制马赛克图&#xff0c;用于可视化两个变量的频率分布。 数…

如何以银行客户为中心实现自动化,并创造更顺畅的客户体验?

在当今社会&#xff0c;客户已习惯于通过几次点击就能迅速得到所需&#xff0c;但银行业的客户旅程仍然因为延误、错误、隐藏费用和资金可获取性问题而显得繁琐。试问&#xff0c;您上一次向他人推荐自己的银行、保险公司或税务局提供的优质服务是何时&#xff1f; 无论是购车…