首页 > 数据库 >Redis中设置了过期时间的Key,那么你还要知道些什么?

Redis中设置了过期时间的Key,那么你还要知道些什么?

时间:2022-09-02 21:01:46浏览次数:114  
标签:key 删除 过期 Redis Key 时间 设置

  熟悉Redis的同学应该知道,Redis的每个Key都可以设置一个过期时间,当达到过期时间的时候,这个key就会被自动删除。这就是Redis的过期策略。

  在为key设置过期时间需要注意的事项

  1、 DEL/SET/GETSET等命令会清除过期时间

  在使用 DEL、SET、GETSET 等会覆盖key对应value的命令操作一个设置了过期时间的key的时候,会导致对应的key的过期时间被清除。

  2、INCR/LPUSH/HSET等命令则不会清除过期时间

  而在使用 INCR/LPUSH/HSET 这种只是修改一个key的value,而不是覆盖整个value的命令,则不会清除key的过期时间。INCR:

  LPUSH:

  3、PERSIST命令会清除过期时间

  当使用 PERSIST 命令将一个设置了过期时间的key转变成一个持久化的key的时候,也会清除过期时间。

  4、使用RENAME命令,老key的过期时间将会转到新key上

  在使用例如: RENAME KEY A KEY B 命令将KEYA重命名为KEYB,不管KEYB有没有设置过期时间,新的key KEYB将会继承KEY_A的所有特性。

  这里篇幅有限,我就不一一将keya重命名到keyb的各个情况列出来,大家可以在自己电脑上试一下keya设置了过期时间,keyb没设置过期时间这种情况。

  5、使用EXPIRE/PEXPIRE设置的过期时间为负数或者使用EXPIREAT/PEXPIREAT设置过期时间戳为过去的时间会导致key被删除

  EXPIRE:

  EXPIREAT:

  6、EXPIRE命令可以更新过期时间

  对一个已经设置了过期时间的key使用expire命令,可以更新其过期时间。

  在Redis2.1.3以下的版本中,使用expire命令更新一个已经设置了过期时间的key的过期时间会失败。并且对一个设置了过期时间的key使用LPUSH/HSET等命令修改其value的时候,会导致Redis删除该key。

  Redis的过期策略

  那你有没有想过一个问题,Redis里面如果有大量的key,怎样才能高效的找出过期的key并将其删除呢,难道是遍历每一个key吗?假如同一时期过期的key非常多,Redis会不会因为一直处理过期事件,而导致读写指令的卡顿。

  这里说明一下,Redis是单线程的,所以一些耗时的操作会导致Redis卡顿,比如当Redis数据量特别大的时候,使用keys * 命令列出所有的key。

  实际上Redis使用 懒惰删除+定期删除 相结合的方式处理过期的key。

  懒惰删除

  所谓 懒惰删除 就是在客户端访问该key的时候,redis会对key的过期时间进行检查,如果过期了就立即删除。

  这种方式看似很完美,在访问的时候检查key的过期时间,不会占用太多的额外CPU资源。但是如果一个key已经过期了,如果长时间没有被访问,那么这个key就会一直存留在内存之中,严重消耗了内存资源。

  定期删除

  定期删除的原理是,Redis会将所有设置了过期时间的key放入一个字典中,然后每隔一段时间从字典中随机一些key检查过期时间并删除已过期的key。

  Redis默认每秒进行10次过期扫描:

  1、从过期字典中随机20个key

  2、删除这20个key中已过期的

  3、如果超过25%的key过期,则重复第一步

  同时,为了保证不出现循环过度的情况,Redis还设置了扫描的时间上限,默认不会超过25ms。

标签:key,删除,过期,Redis,Key,时间,设置
From: https://www.cnblogs.com/ebuybay/p/16651201.html

相关文章

  • redis OCI runtime exec failed: exec failed:解决方法
    引入了一个镜像,由于要修改一个参数,因此要进入容器中,一般使用dockerexec-it容器名/bin/bash然而报错[root@mylinux~]#dockerexec-itgoinception/bin/bashOCIru......
  • Redis实现分布式锁的几种方式
    为什么要加锁如果多个线程同时访问共享资源时,我们通常需要锁的机制,保证在某个时刻,只有一个线程可以对这个资源进行操作,其他线程需要等待这个锁的释放才能继续处理。主要保......
  • Redis集群模式哈希槽rename问题
    (error)ERR'RENAME'commandkeysmustinsameslot一、介绍我们先来看基本的介绍RedisRename命令用于修改key的名称。1、语法redisrename命令的基本用法如......
  • Redis服务端命令请求处理
    命令处理流程1.Redis单线程单进程通过IO复用从文件事件中选出已经就绪的命令放入输入缓存区querybuffer2.一个个取出querybuffer里的命令进行解析,解析argv和argc3.通过a......
  • K8s - 重新生成token以及hash值(解决令牌过期的问题)
     当我们使用 kubeadminit 完成 Master 节点的安装后,界面上会输出如下 kubeadmjoin…… 命令。这个命令使用来将各个节点加入集群中。kubeadmjoin192.168.60......
  • SpringBoot整合Redis
    14、SpringBoot整合Redis14.1、概述SpringBoot操作数据库:spring-data,jpa,jdbc,mongodb,redisSpringData也是和SpringBoot齐名的项目!说明:在SpringBoot2.x之后,原来使用的jed......
  • SparkStreaming中的转换算子2--有状态的转换算子updateStateByKey
    将之前批次的状态保存,packageSparkStreaming.transimportorg.apache.spark.SparkConfimportorg.apache.spark.storage.StorageLevelimportorg.apache.spark.str......
  • 4. 简述redis集群的实现原理
    4. 简述redis集群的实现原理  4.1RedisCluster工作原理 在哨兵sentinel机制中,可以解决redis高可用问题,即当master故障后可以自动将slave提升为master,从而可以......
  • 5、基于redis5的redis cluster部署
    5、基于redis5的rediscluster部署   5.1原生命令手动部署过程在所有节点安装redis,并配置开启cluster功能各个节点执行meet,实现所有节点的相互通信为各个m......
  • 1、简述redis特点及其应用场景
    1、简述redis特点及其应用场景 1.1redis特点速度快:10WQPS,基于内存,C语言实现单线程持久化支持多种数据结构支持多种编程语言功能丰富:支持Lua脚本,发布订阅......