欢迎光临

我们一直在努力
当前位置:首页 > 编程技术 >

redis 设置生存和过期时间的原理分析

日期:
后台-插件-广告管理-首页/栏目/内容广告位一(PC)
后台-插件-广告管理-首页/栏目/内容广告位一(手机)
目录
  • 在了解原理前 先来看使用方法
  • 原理
    • 过期键的判定
  • Redis的过期键删除策略原理

    在了解原理前 先来看使用方法

    通过EXPIRE命令或者PEXPIRE命令,客户端可以以秒或者毫秒精度为数据库中的某个键设置生存时间,在经过指定的秒数或者毫秒数之后,服务器就会自动删除生存时间为0的键。

    SETEX命令可以在设置一个字符串键的同时为键设置过期时间(只能用于字符串键)

    与EXPIRE命令和PEXPIRE命令类似,客户端可以通过EXPIREAT命令或PEXPIREAT命令,以秒或者毫秒精度给数据库中的某个键设置过期时间

    过期时间是一个Unix时间戳,当键的过期时间来临时,服务器就会自动从数据库中删除这个键

    TTL命令和PTTL命令接受一个带有生存时间或者过rEqcvunQQO期时间的键,返回这个键的剩余生存时间,也就是,返回距离这个键被服务器自动删除还有多长时间

    Redis有四个不同的命令可以用于设置键的生存时间(键可以存在多久)或过期时间(键什么时候会被删除):

    • EXPIRE<key><ttl>命令用于将键key的生存时间设置为ttl秒。
    • PEXPIRE<key><ttl>命令用于将键key的生存时间设置为ttl毫秒。
    • EXPIREAT<key><timestamp>命令用于将键key的过期时间设置为timestamp所指定的秒数时间戳。
    • PEXPIREAT<key><timestamp>命令用于将键key的过期时间设置为timestamp所指定的毫秒数时间戳。

    原理

    虽然有多种不同单位和不同形式的设置命令,但实际上EXPIRE、PEXPIRE、EXPIREAT三个命令都是使用PEXPIREAT命令来实现的:

    无论客户端执行的是以上四个命令中的哪一个,经过转换之后,最终的执行效果都和执行PEXPIREAT命令一样。

    redisDb结构的expires字典保存了数据库中所有键的过期时间,我们称这个字典为过期字典

    过期字典的键是一个指针,这个指针指向键空间中的某个键php对象(也即是某个数据库键)。

    过期字典的值是一个long long类型的整数,这个整数保存了键所指向的数据库键的过期时间——一个毫秒精度的UNIX时间戳。

    下图展示了一个带有过期字典的数据库例子,在这个例子中,键空间保存了数据库中的所有键值对,而过期字典则保存了数据库键的过期时间。

    为了展示方便,图中的键空间和过期字典中重复出现了两次alphabet键对象和book键对php象。在实际中,键空间的键和过期字典的键都指向同一个键对象,所以不会出现任何重复对象,也不会浪费任何空间。

    图中的过期字典保存了两个键值对:

    第一个键值对的键为alphabet键对象,值为1385877600000,这表示数据库键alphabet的过期时间为1385877600000(2013年12月1日零时)。

    第二个键值对的键为book键对象,值为1388556000000,这表示数据库键book的过期时间为1388556000000(2014年1月1日零时)。当客户端执行PEXPIREAT命令(或者其他三个会转换成PEXPIREAT命令的命令)为一个数据库键设置过期时间时,服务器会在数据库的过期字典中关联给定的数据库键和过期时间。

    在服务器执行以下命令之后

    过期字典将新增一个键值对,其中键为message键对象,而值则为1391234400000(2014年2月1日零时),如图

    以下是PEXPIREAT命令的伪代码定义

    PERSIST命令可以移除一个键的过期时间

    PERSIST命令就是PEXPIREAT命令的反操作:PERSIST命令在过期字典中查找给定的键,并解除键和值(过期时间)在过期字典中的关联。

    过期键的判定

    通过过期字典,程序可以用以下步骤检查一个给定键是否过期:

    1)检查给定键是否存在于过期字典:如果存在,那么取得键的过期时间。

    2)检查当前UNIX时间戳是否大于键的过期时间:如果是的话,那么键已经过期;否则的话,键未过期。可以用伪代码来描述这一过程:[!--empirenews.page--]

    对于android一个过期时间为1385877600000(2013年12月1日零时)的键alphabet来说:

    如果当前时间为1383282000000(2013年11月1日零时),那么调用is_expired(alphabet)将返回False,因为当前时间javascript小于alphabet键的过期时间。

    另一方面,如果当前时间为1385964000000(2013年12月2日零时),那么调用is_expired(alphabet)将返回True,因为当前时间大于alphabet键的过期时间。

    Redis的过期键删除策略原理

    https://www.jb51.net/article/260852.htm

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

    后台-插件-广告管理-首页/栏目/内容广告位二(PC)
    后台-插件-广告管理-首页/栏目/内容广告位二(手机)
    后台-插件-广告管理-内容广告位三(PC)
    后台-插件-广告管理-内容广告位三(手机)

    相关阅读

    后台-插件-广告管理-内容广告位四(PC)
    后台-插件-广告管理-内容广告位四(手机)

    热门文章

    后台-插件-广告管理-侧边广告位一(PC)
    后台-插件-广告管理-侧边广告位一(手机)
    • HTML 表单组件实例代码

    • HTML 表单用于搜集不同类型的用户输入。下文通过代码给大家分享html 表单组件实例代码,感兴趣的朋友参考下吧 废话不多说了,直接给大家贴代码了,具体代码如下所示: <!DOCTYPE
    • html2canvas 将html代码转为图片的使用方法

    • 转换代码到图片使用 html2canvas,这是一个非常著名的从浏览器网页截图的开源库,使用很方便,功能也很强大。 使用 html2canvas http:// html2canvas 的使用非常简单,简单
    • HTML网页中插入视频的方法小结

    • 现在如果要在页面中使用video标签,需要考虑三种情况,支持Ogg Theora或者VP8(如果这玩意儿没出事的话)的(Opera、Mozilla、Chrome),支持H.264的(Safari、IE 9、Chrome),都不支持的(IE6、
    • HTML实现文本框只读不能修改其中的内容

    • 废话不多说了,直接给大家贴代码了,具体代码如下所示: <!--方法1:>http:// 当鼠标放不上就离开焦点 --> <input type="text" name="input1" value=http://www.cppcns.com/web
    • 移动端专用的meta标签设置大全

    • 前言 之前学习前端中,对meta标签的了解仅仅只是这一句。 <meta charset="UTF-8"> 但是打开任意的网站,其head标签内都有一列的meta标签。比如我们我们网站,但是自己却很不熟
    后台-插件-广告管理-侧边广告位二(PC)
    后台-插件-广告管理-侧边广告位二(手机)

    最新文章

    • 在Asp.net core项目中使用WebSocket

    • 今天小试了一下在ASP.NET core中使用websocket,这里记录一下: 在 Startup 类的 Configure 方法中添加 WebSocket 中间件。 app.UseWebSockets(); 它也可以传入一些参数 app.Us
    • Vue快速理解事件绑定是什么

    • 目录一、监听事件二、事件修饰符1、stop修饰符阻止事件冒泡2、capture修饰符3、self修饰符4、prevent修饰符5、键盘事件修饰符6、鼠标事件修饰符一、监听事件 监听事件一般
    • C#实现模拟ATM自动取款机功能

    • 目录(1)关于用户帐号的类:Account(2)关于银行数据库的类:BankDatabase(3)关于ATM屏幕显示的类:Screen(4)关于ATM键盘的类:Keypad(5)关于进钞、出钞口的类:DepositSlot(6)关于ATM
    • Java设计模式之抽象工厂模式浅析讲解

    • 1.介绍 当系统准备为用户提供一系列相关对象,又不想让用户代码和这些对象形成耦合时,就可以使用抽象工厂模式。 2.如何实现 1)抽象产品--Car 2)具体产品--BYDCar、TSLCar 3)抽象
    • 如何动态替换Spring容器中的Bean

    • 目录动态替换Spring容器中的Bean原因方案实现Spring中的bean替换问题动态替换Spring容器中的Bean 原因 最近在编写单测时,发现使用 Mock 工具预定义 Service 中方法的行为特
    • C#优雅的实现INotifyPropertyChanged接口

    • INotifyPropertyChanged接口在wpF或WinFrom程序中使用还是经常用到,常用于通知界面属性变更。标准写法如下: class NotifandroidyObject : INotifyPropertyChanged {
    后台-插件-广告管理-侧边广告位三(PC)
    后台-插件-广告管理-侧边广告位三(手机)