我们在使用redis时,一般会设置一个过期时间,当然也有不设置过期时间的,也就是永久不过期。

当我们设置了过期时间,redis是如何判断是否过期,以及根据什么策略来进行删除的。

1.redis设置过期时间:

   expire key time(以秒为单位)--这是最常用的方式

    setex(String key, int seconds, String value)--字符串独有的方式

注:

除了字符串自己独有设置过期时间的方法外,其他方法都需要依靠expire方法来设置时间

如果没有设置时间,那缓存就是永不过期

如果设置了过期时间,之后又想让缓存永不过期,使用persist key

2.三种过期策略:

 a.定时删除

含义:在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除

优点:保证内存被尽快释放

缺点:若过期key很多,删除这些key会占用很多的CPU时间,在CPU时间紧张的情况下,CPU不能把所有的时间用来做要紧的事儿,还需要去花时间删除这些key定时器的创建耗时,若为每一个设置过期时间的key创建一个定时器(将会有大量的定时器产生),性能影响严重
    b.懒汉式删除

含义:key过期的时候不删除,每次通过key获取值的时候去检查是否过期,若过期,则删除,返回null(用的时候再检查                     删除)

优点:删除操作只发生在通过key取值的时候发生,而且只删除当前key,所以对CPU时间的占用是比较少的,而且此时的删除是已经到了非做不可的地步(如果此时还不删除的话,我们就会获取到了已经过期的key了)

缺点:若大量的key在超出超时时间后,很久一段时间内,都没有被获取过,那么可能发生内存泄露(无用的垃圾占用了大量的内存)

c.定期删除

含义:每隔一段时间执行一次删除过期key操作

优点:通过限制删除操作的时长和频率,来减少删除操作对CPU时间的占用--处理"定时删除"的缺点定期删除过期key--处理"懒汉式删除"的缺点
        缺点:在内存友好方面,不如"定时删除"(会造成一定的内存占用,但是没有懒汉式那么占用内存)
 在CPU时间友好方面,不如"懒汉式删除"(会定期的去进行比较和删除操作,cpu方面不如懒汉式,但是比定时好)
        难点:合理设置删除操作的执行时长(每次删除执行多长时间)和执行频率(每隔多长时间做一次删除)(这个要根据服务器运行情况来定了),每次执行时间太长,或者执行频率太高对cpu都是一种压力。每次进行定期删除操作执行之后,需要记录遍历循环到了哪个标志位,以便下一次定期时间来时,从上次位置开始进行循环遍历

memcached只是用了惰性删除,而redis同时使用了惰性删除与定期删除,这也是二者的一个不同点(可以看做是redis优于memcached的一点)

对于懒汉式删除而言,并不是只有获取key的时候才会检查key是否过期,在某些设置key的方法上也会检查(eg.setnx key2 value2:该方法类似于memcached的add方法,如果设置的key2已经存在,那么该方法返回false,什么都不做;如果设置的key2不存在,那么该方法设置缓存key2-value2。假设调用此方法的时候,发现redis中已经存在了key2,但是该key2已经过期了,如果此时不执行删除操作的话,setnx方法将会直接返回false,也就是说此时并没有重新设置key2-value2成功,所以对于一定要在setnx执行之前,对key2进行过期检查)。

3.Redis采用的过期策略

懒汉式删除+定期删除

懒汉式删除流程:在进行get或setnx等操作时,先检查key是否过期;
                                     若过期,删除key,然后执行相应操作;
                                     若没过期,直接执行相应操作;
        定期删除流程(简单而言,对指定个数个库的每一个库随机删除小于等于指定个数个过期key):遍历每个数据库(就是                                         redis.conf中配置的"database"数量,默认为16)检查当前库中的指定个数个key(默认是每个库检查20                                         个key,注意相当于该循环执行20次,循环体是下边的描述)如果当前库中没有一个key设置了过期时                                           间,直接执行下一个库的遍历随机获取一个设置了过期时间的key,检查该key是否过期,如果过期,删                                       除key判断定期删除操作是否已经达到指定时长,若已经达到,直接退出定期删除。

对于定期删除,在程序中有一个全局变量current_db来记录下一个将要遍历的库,假设有16个库,我们这一次定期删除遍历了10个,那此时的current_db就是11,下一次定期删除就从第11个库开始遍历,假设current_db等于15了,那么之后遍历就再从0号库开始(此时current_db==0)

在实际中,如果我们要自己设计过期策略,在使用懒汉式删除+定期删除时,控制时长和频率这个尤为关键,需要结合服务器性能,已经并发量等情况进行调整,以致最佳。

转自博客原文:https://blog.csdn.net/xiangnan129/article/details/54928672

Redis过期策略---实现原理相关推荐

  1. Redis过期策略 实现原理

    我们在使用redis时,一般会设置一个过期时间,当然也有不设置过期时间的,也就是永久不过期. 当我们设置了过期时间,redis是如何判断是否过期,以及根据什么策略来进行删除的. 1.redis设置过期 ...

  2. redis过期策略和持久化

    Redis过期策略 注:本文主要参考自<Redis设计与实现> 1.设置过期时间 expire key time(以秒为单位)--这是最常用的方式 setex(String key, in ...

  3. Redis过期策略与内存淘汰机制

    参考博客:https://blog.csdn.net/u010006156/article/details/124914082 Redis过期策略与内存淘汰机制 过期策略简介 作用 redis数据都是 ...

  4. @cacheable 设置过期时间_缓存面试三连击——聊聊Redis过期策略?内存淘汰机制?再手写一个LRU 吧!...

    大家好,今天我和大家想聊一聊有关redis的过期策略的话题. 听到这里你也许会觉得:"我去,我只是个日常搬砖的,这种偏底层的知识点,我需要care吗?" 话虽如此·,但是兄die, ...

  5. redis 过期策略

    redis 过期策略是:定期删除+惰性删除. 所谓定期删除,指的是 redis 默认是每隔 100ms 就随机抽取一些设置了过期时间的 key,检查其是否过期,如果过期就删除. 假设 redis 里放 ...

  6. Redis 过期策略和淘汰策略

    1.Redis 过期策略 Redis 过期策略用于处理设置了缓存时间的数据,使用定时扫描和惰性删除机制删除到期的缓存数据. Redis 将设置了过期时间的 key 保存在一个独立的字典中,定时扫描就是 ...

  7. redis过期策略与淘汰策略

    redis过期策略与淘汰策略 1.过期策略 2.淘汰策略 3.在哪里配置? 4.Lazy Free 1.过期策略 1.redis中所有的key都可以通过expire命令来设置过期时间,所有被设置了过期 ...

  8. Redis过期策略及实现原理

    2019独角兽企业重金招聘Python工程师标准>>> 我们在使用redis时,一般会设置一个过期时间,当然也有不设置过期时间的,也就是永久不过期. 当我们设置了过期时间,redis ...

  9. 第九章 Redis过期策略

    注:本文主要参考自<Redis设计与实现> 1.设置过期时间 expire key time(以秒为单位)--这是最常用的方式 setex(String key, int seconds, ...

最新文章

  1. Pytorch中的数据加载
  2. SAP Workload Monitor
  3. ArrayList 源码阅读记录
  4. PyTorch ToTensor解读
  5. org 07c00h的原因
  6. 对序列连续计算平均数和方差
  7. Golang 为什么不能直接将任意类型数组赋值给 []interface{}完成泛型操作
  8. flume高可用-failover-配置文件编写
  9. 阿里计算平台掌门人贾扬清:我对人工智能方向的一点浅见
  10. 怎么在activity里面操作listView的item里的组件的点击事件
  11. Android 系统(226)---Android 阿拉伯语适配
  12. 黑鲨游戏手机2 Pro外观设计曝光:或将新增两条LED灯带
  13. DMA访问(直接内存访问)
  14. [转]TortoiseSVN客户端的安装
  15. 数据结构严蔚敏清华大学pdf_2019年清华大学软件学院软件工程考研经验分享
  16. java servlet 视频_Servlet开发的理论提升视频教程 - JavaWeb - Java - 私塾在线 - 只做精品视频课程服务...
  17. android测试tf卡读写速度,手机TF卡速度的研究经验sandisk/金士顿 C2,C4,C6测速软件测速图数据...
  18. c语言保留三位小数用float,float保留三位小数
  19. JSP javaweb餐厅点餐系统源码(点餐系统)jsp点餐系统网上订餐
  20. 计算机表格应用试题及答案,2016年职称计算机考试EXCEL练习试题及答案

热门文章

  1. 华米手表安装第三方应用
  2. notepad++ 对比文档
  3. 使用Beego撸了一个社区
  4. 非线性方程组求解方法,神经网络的非线性函数
  5. 如何将图片调整为固定大小?怎么自定义压缩图片大小?
  6. 一张图片切割成九宫格,微信朋友圈发布
  7. 远程 PC 访问软件
  8. php页眉,自定义页眉
  9. python license_怎么解决pycharm license Acti的方法
  10. 不懂代码如何制作公司网站—壹间网络