当前位置: 首页 > 编程日记 > 正文

c# redis hashid如何设置过期时间_Redis中Key过期策略amp;淘汰机制

f7b45aaab06358705230586dd8cabce0.png

1. Redis中设置Key过期时间

我们有两种方式设置过期时间

1.1 设置多久后过期

设置一个 key 10s 过期,可以这样

127.0.0.1:6379> SET key value EX 10

127.0.0.1:6379> SET key value PX 10000

PX 后面是毫秒ms,EX是秒。

设置完成后,10s内,可以查询到,我们也可以使用 ttl 命令查看多长时间后过期。

127.0.0.1:6379> TTL key

(integer) 8

等到过了10s后,再查询,发现就查询不到了。

1.2 设置在什么时候过期

127.0.0.1:6379> EXPIREAT key 1577808000

其中 1577808000 是 2020-01-01 00:00:00 对应的时间戳。

没过期的时候,我们也可以使用 EXPIRE 命令直接将key设置成过期。

也可以使用 PERSIST 将 key 设置为永久不过期。

那么当时间到的时候, key 在 redis 中是怎么过期的呢?如何清理呢?

2. 惰性删除

redis 中,一个key过期,并不会马上清除,而是惰性删除。

即当下次读取这个 key 时会进行检查,如果发现已经过期了,会返回空,并且立即删除掉它。

当一个key被scan的时候发现已经过期了,也会被删除。

3. 定期删除

上面提到的惰性删除有一个问题那就是,如果一个key已经过期了,但永远不会被读取到,它就会一直在内存中,浪费内存空间。

为了解决这个问题,redis又在“惰性删除”的基础上加了“定期删除”机制。

redis会随机读取一些key进行检查,如果发现它们过期了,就会立即删除它们。当然,实际的实现要比这复杂,但这是主要思想。

Redis Server运行时,会运行着定期清除事件,在 Redis 2.6 版本中,一分钟触发10次,平均每 100ms 运行一次。从 Redis 2.8开始, 用户可以通过修改 hz选项来调整每秒执行次数,具体信息可以修改 redis.conf 文件中 hz 选项。

定期删除,这里的“定期”指的是Redis定期触发的清理策略,由位于src/redis.c的activeExpireCycle(void)函数来完成。

key过期相关源代码链接:https://github.com/antirez/redis/blob/a92921da135e38eedd89138e15fe9fd1ffdd9b48/src/expire.c#L98

3. 当 redis 存储满了,会怎么样?

通过上述两种手段结合起来,大部分过期的key会被删掉。

但也会有一些过期key,没有被“定期删除”扫描到,也没有被访问到,堆积在内存里,导致redis内存耗尽了,怎么办?

Redis定义了几种策略,即“内存淘汰机制”,来处理这种情况:

c3f01ad8e86fcf295eb1f716e1fff635.png

VolatileLRU 按照LRU算法逐出原有数据,但仅逐出设置了过期时间的数据(常用)

VolatileTTL 仅逐出设置了过期时间的数据,并且是按照TTL从小到大的顺序进行逐出

VolatileRandom 随机逐出原有数据,但仅逐出设置了过期时间的数据

AllKeysLRU 按照LRU算法逐出原有数据

AllKeysRandom 随机逐出原有数据

NoEviction 不逐出任何数据,新数据的写入会得到一个错误信息

不知道LRU算法的同学可以看看这个 LRU算法简介。

LFU的核心思想是按照key最近被访问的频率进行淘汰。

需要注意的是,如果使用 Volatile开头的几种策略,如果没有可以淘汰的key时,会像 NoEviction 一样,报错,无法写入。

最后总结

Redis key过期的方式有三种:

惰性删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key(无法保证冷数据被及时删掉)

定期删除:Redis会定期主动淘汰一批已过期的key(随机抽取一批key检查)

内存淘汰机制:当前已用内存超过maxmemory限定时,触发主动清理策略。

一句话:惰性删除 + 定期删除 + 内存淘汰机制

思考题:

在memcache中不给key设置过期时间,意味着key“永久不过期”,这个key就不会被删除么?

答案:不是,memcache不是持久化的,不设置过期时间意味着key不会主动被删除,但由于内存不足,server重启等各种原因,key还是可能被删除。

创作不易,有收获记得分享哦。关注微信,提升自己

6d0180cedda4fdbc7d3a9ede70c21d04.png

万水千山总是情,点个 “在看” 行不行!!!

cd9d468d96faf9bf1bdc5c7ec1788ed9.png

相关文章:

在CISCO路由器上配置DHCP与DHCP中继

企业网络中DHCP环境的搭建 企业DHCP需求描述: 在大型企业中,一般都有很多个部门,各部门之间有时要求不能互通,这可以通过使用VLAN来解决,但是上千个人IP配置也是一件极大耗费人力的事。所以我们迫切需求一种全自动的&a…

MQTT消息长度限制

原文连接: https://stackoverflow.com/questions/34522053/what-is-the-maximum-message-length-for-a-mqtt-broker 内容: 单条消息默认限制大小256MB,可以通过配置修改 It’s not entirely clear what you’re asking here, so I’ll answer both pos…

jQuery EasyUI API 中文文档 - DataGrid 数据表格

扩展自 $.fn.panel.defaults &#xff0c;用 $.fn.datagrid.defaults 重写了 defaults 。依赖panelresizablelinkbuttonpagination用法1. <table id"tt"></table> 1. $(#tt).datagrid({ 2. url:datagrid_data.json, 3. columns:[[ 4. …

point-to-point(点对点) 网口

点对点连接是两个系统或进程之间的专用通信链路。想象一下直接连接两个系统的一条线路。两个系统独占此线路进行通信。点对点通信的对立面是广播&#xff0c;在广播通信中&#xff0c;一个系统可以向多个系统传输。 点对点通信在OSI协议栈的物理、数据链路层和网络层中定义。 点…

springboot中文文档_登顶 Github 的 Spring Boot 仓库!艿艿写的最肝系列

源码精品专栏中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 RocketMQ 源码解析数据库中间件 Sharding-JDBC 和 MyCAT 源码解析作业调度中间件 Elastic-Job 源码解析分布式事务中间件 TCC-Transaction 源码解析Eureka 和 Hystrix 源码解…

浏览器缓存网站静态文件

当用户第一次访问你的网站时&#xff0c;让用户的浏览器缓存网站的静态文件&#xff0c;如图片\CSS\JS等,然后接访问接下来的页面就会直接调用浏览器的缓存而不是重新从服务器下载&#xff0c;这样既节省带宽和流量又加快了用户打开网页的速度&#xff0c;一石三鸟&#xff0c;…

MQTT 心跳和keepalive配置

MQTT 心跳和keepalive配置 内容&#xff1a; 正常MQTT 服务器端会配置一个超时时间&#xff0c;一般为60s&#xff0c; 在这个时间段内一个连接如果没有数据传输的话&#xff0c;服务端会主动断开连接以释放资源&#xff0c; 有两种方式可以规避这个问题: 方式1: 最为简单&a…

android开发我的新浪微博客户端-登录页面功能篇(4.2)

上一篇中完成了如上图的UI部分的实现&#xff0c;现在继续来讲功能的实现&#xff0c;用户登录操作主要就是账号列表显示和选择账号登录两个功能其他的都是些简单的辅助功能&#xff0c;首先是点击id为iconSelectBtn的ImageButton时显示用户选择窗口&#xff0c;这个时候去数据…

大脚本运行常见问题总结

1. Allowed memory size of 8388608 bytes exhausted 出现原因&#xff1a;脚本运行超过最大运行时间 解决方法&#xff1a;1 ) 修改 php.ini 文件。将memory_limit 由默认值改成合适的大小&#xff0c;重启服务器。 2&#xff09;在脚本中加入 ini_set("memory_limit&qu…

MQTT Qos类型解释

MQTT Qos类型解释 原文连接: https://blog.csdn.net/yangguosb/article/details/78653228 内容&#xff1a; Qos0 发送者只发送一次消息&#xff0c;不进行重试&#xff0c;Broker不会返回确认消息。在Qos0情况下&#xff0c;Broker可能没有接受到消息&#xff0c;流程如…

对做技术的一点思考

做技术在中国有没有前途&#xff1f;这个问题是每个在国内做技术的人都会思考的问题。在我看来&#xff0c;我们之所以会产生样的困扰&#xff0c;主要原因在于我们所谓的研发都是二次开发&#xff0c;国内任何公司&#xff0c;研究单位&#xff08;除开严格保密的单位&#xf…

iis伪静态排除css_魔众系统伪静态规则怎么配

魔众系列系统目前已经有大量用户在使用&#xff0c;大家对于伪静态的配置一直有所疑惑&#xff0c;经过和技术小哥哥的协商&#xff0c;我们特意将三种不同的 HTTP 服务器配置文件分享给大家&#xff0c;方便大家参考。魔众系列系统目前已经有大量用户在使用&#xff0c;大家对…

R.drawable 转 bitmap

引用&#xff1a;http://zhidao.baidu.com/question/291703800.html Bitmap bmpBitmapFactory.decodeResource(r, R.drawable.icon); Bitmap newb Bitmap.createBitmap( 300, 300, Config.ARGB_8888 ); Canvas canvasTemp new Canvas( newb ); canvasTemp.drawBitmap(bmp, …

洛谷P3254 圆桌问题(最大流)

题意 $m$个不同单位代表参加会议&#xff0c;第$i$个单位有$r_i$个人 $n$张餐桌&#xff0c;第$i$张可容纳$c_i$个代表就餐 同一个单位的代表需要在不同的餐桌就餐 问是否可行&#xff0c;要求输出方案 Sol 比较zz的最大流 从$S$向$1-m$连流量为$r_i$的边 从$m 1$向$m n$连流…

设置commit 提交模板

设置commit 提交模板 建议提交 &#xff08;.template&#xff09;模板文件 放在用户目录(Doceuments)下 (~/Doceuments) 原文连接: https://blog.csdn.net/mafei852213034/article/details/51908049 内容&#xff1a; 1、在根目录建立模板文件 如 xxx_template文件&#…

listen函数的第二个参数_【图像处理】OpenCV系列十七 --- 几何图像变换函数详解(一)...

上一篇我们学习了仿射变换的warpAffine函数&#xff0c;知道了如何用这个函数对图像进行旋转、平移等操作&#xff0c;那么本节我们一起来学习一下与仿射变换相关的其他函数以及相关的几何图像变换。一、convertMaps()函数1、函数原型void convertMaps(InputArray map1, InputA…

flex java socket通信

引用:http://developer.51cto.com/art/201003/189791.htm Java socket通信如何进行相关问题的解答呢&#xff1f;还是需要我们不断的学习&#xff0c;在学习的过程中会遇到不少的问题。下面我们就从源代码中找到有关的问题解决方案。希望大家在以后的Javasocket通信使用中有所收…

编程珠玑:对DAO层的一点修改

由于以前的Domain对象都是不需要序列化的&#xff0c;所以为了操作数据库查询的方便&#xff0c;直接采用继承BaseDomain的方式来完成。这样在传递动态参数的时候&#xff0c;只需要把参数放到Map总&#xff0c;就可以很好的在ibatis配置文件(map.xx来直接获取值)中使用。 这样…

solr 下载 有dist目录的(6需要8)

http://archive.apache.org/dist/lucene/solr/ solr6 需要java8 转载于:https://www.cnblogs.com/hnqm/p/9367140.html

抛出一个nullpointerexception_Java 14 发布了,再也不怕 NullPointerException 了!

推荐阅读&#xff1a;Java程序员danni&#xff1a;就一个HashMap&#xff0c;居然能跟面试官扯上半个小时&#xff1f;​zhuanlan.zhihu.com2020年3月17日发布&#xff0c;Java正式发布了JDK 14 &#xff0c;目前已经可以开放下载。在JDK 14中&#xff0c;共有16个新特性&#…

linux平台软件动态分析工具valgrind系列工具及其可视化

linux平台软件动态分析工具valgrind系列工具 Memcheck–内存检查工具Callgrind–函数调用分析工具Cachegrind–缓存命中分析工具Helgrind–线程分析工具Massif–内存堆栈分析工具 一、Valgrind 概述 Valgrind是一套Linux下&#xff0c;开放源代码&#xff08;GPL V2&#xf…

codeviz安装使用全记录

安装过程 $ sudo apt-get install -y graphviz graphviz-dev graphviz-doc $ sudo apt-get install -y libgv-* $ sudo apt-get install -y ncftp $ sudo ln -sf /usr/include/asm-generic/ /usr/include/asm http://www.csn.ul.ie/~mel/projects/codeviz/ $ wget http://www.c…

运维工程师的职责和前景

转载自网络 运维中关键技术点解剖&#xff1a;1 大量高并发网站的设计方案 &#xff1b;2 高可靠、高可伸缩性网络架构设计&#xff1b;3 网站安全问题&#xff0c;如何避免被黑&#xff1f;4 南北互联问题,动态CDN解决方案&#xff1b;5 海量数据存储架构 一、什么是大型网站运…

java visualvm远程监控_深入理解JVM虚拟机12:JVM性能管理神器VisualVM介绍与实战

本文转自互联网&#xff0c;侵删本系列文章将整理到我在GitHub上的《Java面试指南》仓库&#xff0c;更多精彩内容请到我的仓库里查看https://github.com/h2pl/Java-Tutorial喜欢的话麻烦点下Star哈文章将同步到我的个人博客&#xff1a;http://www.how2playlife.com本文是微信…

WCF入门(一)——简单的示例

这篇随笔写了一段时间了&#xff0c;当时没有发布&#xff0c;今天整理文档的时候发现了&#xff0c;顺便给配了些图。主要是绍了一下WCF编程模型&#xff0c;并给了一个简单的示例。 概述 WCF框架是下一代.NET平台通信应用程序的核心。它包含了Web服务、Remoting、同步和异步…

Callgrind--函数调用分析工具以及可视化方法

生成分析文件 命令行运行: valgrind --toolcallgrind ./palmGateMachine 检测完毕之后会生成一个文件callgrind.out.26805&#xff0c; 后面的数字其实是这个待测进程的pid 可视化方法 可视化方法 可视化工具 kcachegrind 1、下载地址: https://launchpad.net/ubuntu/trust…

Java中BASE64 编码

2019独角兽企业重金招聘Python工程师标准>>> BASE64 编码是一种常用的字符编码&#xff0c;在很多地方都会用到。JDK 中提供了非常方便的 BASE64Encoder 和 BASE64Decoder&#xff0c;用它们可以非常方便的完成基于 BASE64 的编码和解码。下面是本人编的两个小的函数…

java script (二)

实现轮播图 获取元素 document.getElementById("id名称") 事件&#xff08;onlond&#xff09; onlond "changeImg()" 在<script>中function changeImg(){ document.getElementById("img").src "图片地址"} 定时操作&…

转 [JAVA] 使用 common-fileupload 实现文件上传

就在前段时间&#xff0c;还在苦于找到不到合适的上传组件&#xff0c;虽然很早就知道了 common-fileupload&#xff0c;但当时却因为没有找到如何获取表单参数的方法而使用 jspSmartUpload&#xff0c;历尽艰辛终于找到了它的 jar&#xff0c;可是使用后才发现此东西对中文参数…

Cachegrind--缓存命中检查工具及其可视化

Cachegrind–缓存命中检查工具及其可视化 和 Callgrind–函数调用分析工具以及可视化方法 一模一样 命令改为: valgrind --toolcachegrind ./palmGateMachine 生成的文件名: cachegrind.out.8025 用kcachegrind 打开 参考我的另一篇文章&#xff1a; https://editor.csdn.…