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;淘汰机制相关推荐

  1. redistemplate.opsforhash设置过期时间_Redis详解(十一)------ 过期删除策略和内存淘汰策略...

    大家好,我是可乐,一个专注原创,乐于分享的程序猿. 本系列教程持续更新,可以微信搜索「 IT可乐 」第一时间阅读.回复<电子书>有我为大家特别筛选的海量免费书籍资料 在介绍这篇文章之前,我 ...

  2. 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 ...

  3. redis map 过期时间_redis的过期时间和过期删除机制

    一:设置过期时间 redis有四种命令可以用于设置键的生存时间和过期时间: EXPIRE <KEY> <TTL> : 将键的生存时间设为 ttl 秒 PEXPIRE <K ...

  4. redis map 过期时间_redis 过期时间

    设置key的过期时间,超过时间后,将会自动删除该key.在Redis的术语中一个key的相关超时是不确定的. 超时后只有对key执行DEL命令或者SET命令或者GETSET时才会清除. 这意味着,从概 ...

  5. java控制订单过期时间_订单自动过期实现方案

    需求分析:24小时内未支付的订单过期失效. 解决方案被动设置:在查询订单的时候检查是否过期并设置过期状态. 定时调度:定时器定时查询并过期需要过期的订单. 延时队列:将未支付的订单放入一个延时队列中, ...

  6. redis的zset的底层实现_Redis中hash、set、zset有多牛?从底层告诉你数据结构原理...

    前言 今天来说下Redis中hash.set.zset的底层数据结构原理! Redis-哈希对象(hash) hash的底层存储有两种数据结构,一种是ziplist,另外一种是hashtable,这两 ...

  7. c# redis hashid如何设置过期时间_Redis数据库实现原理(划重点)

    Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中,db数组的每一项都是一个redis.h/redisDb结构,每个redisDb结构代表一个数据库, ...

  8. c# redis 如何设置过期时间_Redis Hash存储token、及设置过期时间

    相信大家在很多业务场景都会遇到对数据设置过期时间,如安全认证token.短信验证码等.一般我们的解决有几种:存redis.存数据库.实时计算(如JWT),不管使用哪种方式,需求就是过期了对数据的清理. ...

  9. java redis设置过期时间_Redis的一些核心原理

    点关注,不迷路:持续更新Java相关技术及资讯!!! 一.Redis的单线程和高性能 Redis 单线程为什么还能这么快? 因为它所有的数据都在内存中,所有的运算都是内存级别的运算(纳秒),而且单线程 ...

最新文章

  1. HarmonyOS 查看本地API
  2. spaugment--生成最小二乘增广矩阵
  3. Delphi控制Excel输出上标示例
  4. C++四种强制类型转换 dynamic_cast,const_cast,static_cast,reinterpret_cast
  5. 一个B/S结构自动二次请求需求的实现
  6. 关于 IOS5 使用 position:fixed 与 scrollTo 共存的 bug
  7. HBase-shell及happyhbase
  8. C++类引用中的构造函数与析构函数的执行顺序练习
  9. 怎么读 Tomcat 源码?
  10. 计算机硬盘驱动器可以删吗,有关删除存储驱动器上的数据的注意事项
  11. 用unity制作简单的AR,亲测有效
  12. 南京城市公共自行车推出共享单车,停在车桩附近可免费使用
  13. c/c++函数 -strtol strtoll strtoul strtoull 使用注意项cc
  14. 移动软件开发:安卓APP首页构建
  15. SpringBoot利用ZXing工具来生成二维码(简单)
  16. 学习编程(c语言)的经历以及对未来的期望
  17. 杜克计算机工程本科专业申请,杜克大学电气与计算机工程专业申请要求有哪些?...
  18. 相位通俗解释_必读:通俗地解释一下印度占星是什么?
  19. 英雄远征Erlang源码分析(5)-协议解析与玩家登录处理
  20. 论程序员写不出代码怎么办

热门文章

  1. 多线程:pthread_cond_wait 实现原理
  2. 36.两个链表的第一个公共结点——剑指offer
  3. navicat 几个 可用的东西
  4. smbpasswd 和 pdbedit 的区别
  5. 非递归一次性加载分类数据到TreeViw
  6. Linux(centOS)手动安装Apache+MySQL+PHP+Memcached+Nginx原创无错版
  7. C# 特性(Attribute)学习。
  8. DataGrid 的 全选/取消全选 控制(CheckBox)
  9. 获取GridView中的某列值
  10. asp.net中的联动菜单