c# redis hashid如何设置过期时间_Redis中Key过期策略amp;淘汰机制
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定义了几种策略,即“内存淘汰机制”,来处理这种情况:
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还是可能被删除。
创作不易,有收获记得分享哦。关注微信,提升自己
万水千山总是情,点个 “在看” 行不行!!!
c# redis hashid如何设置过期时间_Redis中Key过期策略amp;淘汰机制相关推荐
- redistemplate.opsforhash设置过期时间_Redis详解(十一)------ 过期删除策略和内存淘汰策略...
大家好,我是可乐,一个专注原创,乐于分享的程序猿. 本系列教程持续更新,可以微信搜索「 IT可乐 」第一时间阅读.回复<电子书>有我为大家特别筛选的海量免费书籍资料 在介绍这篇文章之前,我 ...
- redis hash field过期时间_Redis系列-Redis数据类型
1.全局命令 1.1查看所有键 127.0.0.1:6379> set k1 111OK127.0.0.1:6379> set k2 222OK127.0.0.1:6379> set ...
- redis map 过期时间_redis的过期时间和过期删除机制
一:设置过期时间 redis有四种命令可以用于设置键的生存时间和过期时间: EXPIRE <KEY> <TTL> : 将键的生存时间设为 ttl 秒 PEXPIRE <K ...
- redis map 过期时间_redis 过期时间
设置key的过期时间,超过时间后,将会自动删除该key.在Redis的术语中一个key的相关超时是不确定的. 超时后只有对key执行DEL命令或者SET命令或者GETSET时才会清除. 这意味着,从概 ...
- java控制订单过期时间_订单自动过期实现方案
需求分析:24小时内未支付的订单过期失效. 解决方案被动设置:在查询订单的时候检查是否过期并设置过期状态. 定时调度:定时器定时查询并过期需要过期的订单. 延时队列:将未支付的订单放入一个延时队列中, ...
- redis的zset的底层实现_Redis中hash、set、zset有多牛?从底层告诉你数据结构原理...
前言 今天来说下Redis中hash.set.zset的底层数据结构原理! Redis-哈希对象(hash) hash的底层存储有两种数据结构,一种是ziplist,另外一种是hashtable,这两 ...
- c# redis hashid如何设置过期时间_Redis数据库实现原理(划重点)
Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中,db数组的每一项都是一个redis.h/redisDb结构,每个redisDb结构代表一个数据库, ...
- c# redis 如何设置过期时间_Redis Hash存储token、及设置过期时间
相信大家在很多业务场景都会遇到对数据设置过期时间,如安全认证token.短信验证码等.一般我们的解决有几种:存redis.存数据库.实时计算(如JWT),不管使用哪种方式,需求就是过期了对数据的清理. ...
- java redis设置过期时间_Redis的一些核心原理
点关注,不迷路:持续更新Java相关技术及资讯!!! 一.Redis的单线程和高性能 Redis 单线程为什么还能这么快? 因为它所有的数据都在内存中,所有的运算都是内存级别的运算(纳秒),而且单线程 ...
最新文章
- HarmonyOS 查看本地API
- spaugment--生成最小二乘增广矩阵
- Delphi控制Excel输出上标示例
- C++四种强制类型转换 dynamic_cast,const_cast,static_cast,reinterpret_cast
- 一个B/S结构自动二次请求需求的实现
- 关于 IOS5 使用 position:fixed 与 scrollTo 共存的 bug
- HBase-shell及happyhbase
- C++类引用中的构造函数与析构函数的执行顺序练习
- 怎么读 Tomcat 源码?
- 计算机硬盘驱动器可以删吗,有关删除存储驱动器上的数据的注意事项
- 用unity制作简单的AR,亲测有效
- 南京城市公共自行车推出共享单车,停在车桩附近可免费使用
- c/c++函数 -strtol strtoll strtoul strtoull 使用注意项cc
- 移动软件开发:安卓APP首页构建
- SpringBoot利用ZXing工具来生成二维码(简单)
- 学习编程(c语言)的经历以及对未来的期望
- 杜克计算机工程本科专业申请,杜克大学电气与计算机工程专业申请要求有哪些?...
- 相位通俗解释_必读:通俗地解释一下印度占星是什么?
- 英雄远征Erlang源码分析(5)-协议解析与玩家登录处理
- 论程序员写不出代码怎么办
热门文章
- 多线程:pthread_cond_wait 实现原理
- 36.两个链表的第一个公共结点——剑指offer
- navicat 几个 可用的东西
- smbpasswd 和 pdbedit 的区别
- 非递归一次性加载分类数据到TreeViw
- Linux(centOS)手动安装Apache+MySQL+PHP+Memcached+Nginx原创无错版
- C# 特性(Attribute)学习。
- DataGrid 的 全选/取消全选 控制(CheckBox)
- 获取GridView中的某列值
- asp.net中的联动菜单