Redis过期时间设置与处理指南
Redis过期时间
时间复杂度:O(1)
设置密钥的超时时间。
超时后密钥将自动删除。
在Redis术语中,具有相关过期时间的密钥通常被认为是不稳定的。
只有删除或覆盖主要内容的命令,包括DEL、SET、GETSET和所有*STORE命令,才会清除过期时间。
这意味着,理论上,任何更改存储在键中的值的操作,而不是用新值替换它,都会使过期时间保持不变。
例如,如果使用INCR递增键值、使用LPUSH将新值添加到列表中或使用HSET更改哈希字段的值,则过期时间保持不变。
当使用PERSIST命令将密钥变成永久密钥时,过期时间也会被清除。
使用RENAME重命名密钥会将关联的生命周期转移到新的密钥名称。
当使用RENAME重命名密钥时,如Key_A中,通过调用RENAMEKey_BKey_A覆盖现有密钥,原始Key_A是否有关联的过期时间并不重要,新密钥Key_A会继承所有密钥Key_B的特征。
使用负数调用EXPIRE/PEXPIRE或使用过去的时间调用EXPIREAT/PEXPIREAT将导致密钥被丢弃而不是过期(因此弹出按键事件将被丢弃而不是删除)。
已到期)。
可以使用已将过期时间设置为参数的密钥来调用EXPIRE。
在这种情况下,密钥的生命周期已更新为新值。
对此有许多应用程序,示例记录在下面的“探索会话模式”部分中。
在Redis2.1.3之前的版本中,使用命令更改带有过期时间的键的值与完全删除键具有相同的效果。
既然复制层的限制已经确定,我们就需要这个语义。
EXPIRE返回0,不使用设置的过期时间来改变key的过期时间。
特殊返回值:
假设您有一个Web服务,并且您对用户最近访问的N个页面感兴趣。
每个相邻页面视图的执行时间不超过前一个页面视图执行时间的60秒。
理论上,您可以将用户访问的页面集合视为一个NavigationSession,其中包含用户正在寻找的感兴趣的产品信息,从而可以推荐相关产品。
您可以使用以下策略轻松地在Redis中对此类行为进行建模:每当用户访问该页面时,调用以下命令:
如果用户不再空闲的时间少于60秒,则该key将被丢弃,只记录访问时间差小于60秒的页面。
此模式可以轻松修改为使用INCR作为计数器,而不是列表的RPUSH。
通常,当您创建Redis密钥时,没有与其关联的生命周期。
除非您显式删除该键(例如使用DEL命令),否则该键将保留。
EXIRE系列命令允许您将过期时间与特定密钥相关联,但会增加该密钥的内存使用量。
如果对某个键设置了过期时间,Redis将确保该键在指定时间后被删除。
密钥的生命周期可以使用EXPIRE命令更新,也可以使用PERSIST命令(或其他严格相关的命令)完全删除。
有。
在Redis2.4版本中,过期时间可能不是很准确,可能在0到1秒之间变化。
从Redis2.6版本开始,过期时间误差为0到1毫秒。
密钥过期信息以绝对Unix时间戳格式存储(Redis2.6及更高版本为毫秒内)。
这意味着即使Redis实例未启动,时间也会过去。
为了使过期时间正常工作,您的计算机时间必须保持稳定。
当您在时钟明显不同步的两台机器上移动RDB文件时,会发生有趣的事情(所有密钥在加载时都会过期,等等)。
物理运行的实例始终检查计算机的时钟。
例如,如果您将密钥的生命周期设置为1000秒,然后将计算机设置为2000秒。
将来,这个密钥将立即过期,并且不会持续1000秒。
Redis密钥有两种过期方式:被动和主动。
当某些客户端尝试访问该密钥并确定该密钥已超时时,就会发生该密钥的手动过期。
当然,仅此还不够,因为某些键将永远不会被再次访问。
无论如何,这个密钥必须过期。
因此,Redis会定期测试随机范围内的过期集合中的少量键。
所有过期的密钥都将从密钥空间中删除。
这是Redis每秒执行10次的操作。
这是一种低概率算法。
默认假设是样本代表整个密钥空间。
直到失败的密钥百分比低于25%为止,它将失败。
也就是说,同时使用内存的过期密钥的最大数量等于每秒写入操作的最大数量除以4。
保持行为一致性以获取正确的密钥。
如果某个键在运行时失败,则会在与AOF文件关联的两个辅助节点上执行DEL操作。
这可以确保失败的进程集中在主实例上,并且不会导致一致性错误。
但是,如果副本连接到主节点并且其密钥不会独立过期(但它正在等待主节点的DEL),它仍然会获取数据集中的所有过期状态。
当副本被选为主控后,它可以像主控一样独立地使这些密钥失效。
如何设置rediskey过期时间
设置密钥的过期时间有3种方式:安装密钥并使用delmand方法设置;使用setorgetset命令清除密钥过期日期。事实上,set和getset命令替换了key对应的值。
,所以也设置了key的过期时间。
因此,需要注意的是,incr、LPUSH和HSET命令不会改变密钥的过期日期。
最初花了多长时间?执行这三个命令后会经过多少时间。
使用persist命令设置密钥的到期日期。