其实redis失效时间的问题并不复杂,但是又很多的朋友都不太了解redis在项目中的实际应用,因此呢,今天小编就来为大家分享redis失效时间的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!
本文目录
一、Redis过期时间
给一个 key设置超时时间。在一个超时时间结束后,这个键将会被自动删除。一个拥有关联过期时间的键在Redis术语里通常被认为不稳定的。
只有删除或者覆盖键的内容的命令,包括 DEL, SET, GETSET和所有的*STORE命令,才会把过期时间清除。这意味着从理论上讲,所有改变键上存储的值而不是使用新的值来替换的 *** 作,都将会保持过期时间不变。例如,使用 INCR增加一个键的值,使用 LPUSH讲一个新的值放到列表中,或者使用 HSET改变一个哈希的字段的值都将会使过期时间保持不变。
使用 PERS *** T命令将一个键变成持久化的键,过期时间也会被清除。
如果一个键被 RENAME重命名,关联的生存时间将会被转移到新的键名上。
如果一个键被 RENAME重命名,就像在一个已经存在的键 Key_A,它被一个调用 RENAME Key_B Key_A所覆盖,原始的 Key_A是否关联过期时间是没关系的,新的键 Key_A将会继承 Key_B的所有特征。
注意,使用负数调用 EXPIRE/ PEXPIRE,或者使用过去的时间调用 EXPIREAT/ PEXPIREAT将会使键被删除,而不是过期(相应的,弹出的 key *** nt将会是 del,而不是 expired)。
可以使用一个已经有过期时间集的键作为参数来调用 EXPIRE。在这种情况下,一个键的生存时间已经更新为一个新值。对此很多应用,下面的 N *** igation session模式一节记录了一个例子。
在Redis 2.1.3之前的版本中,使用一个命令改变一个拥有过期时间的键的值,效果跟彻底移除这个键一样。这种语义是必须的,因为 *** 层的 *** 现在已经确定了。
EXPIRE将会返回0,并且不会使用一个过期时间 *** 来改变一个键的过期时间。
redis> SET mykey"Hello World"
想象你有一个网页服务,并且你对用户最近访问的N个页面有兴趣,这样每个临近的页面视图的执行时间不会超过前一个页面视图执行的60秒。理论上来讲,你可以认为用户访问的页面 *** 为 N *** igation session,其中就可以包含用户在寻找哪些他或她感兴趣的产品信息,因此你可以推荐关联的产品。
你可以非常容易的使用下面的策略在Redis中建模这种类型:每次用户访问一个页面你就调用下面的命令:
如果用户闲置超过60秒,这个键将会被删除,只有访问时间差值小于60秒的页面才会被记录。
这个模式可以很容易的修改为使用 INCR做计数器来替代使用 RPUSH的列表。
通常情况下创建Redis的键时不关联生存时间。这个键将会简单的一直生存,除非用户显示的删除它,例如使用 DEL命令。
EXPIRE家族命令能够把一个过期时间关联到一个给定的键,代价是这个键会使用额外的内存。当一个键设置了过期时间,Redis将会确保当指定的时间过去之后移除这个键。
一个键的生存时间可以被 EXPIRE命令更新,或者被 PERS *** T命令完全移除(或其他严格相关的命令)。
在Redis2.4版本中,过期时间可能不是非常精确的,并且它可能是在0到1秒之间的出入。从Redis2.6版本开始,过期时间误差是从0到1毫秒。
键的过期信息以绝对的Unix时间戳形式保存(Redis2.6以及更新的版本毫秒内)。这意味着甚至当Redis实例未启动时时间就流走了。
为了过期时间能工作的很好,计算机时间必须保持稳定。如果你从两个时钟巨大不同步的计算机上移动一个RDB文件,有趣的事情将会发生(像所有的键在加载时变成过期)。
实际上运行中的实例将一直会检查计算机的时钟,举例来说,如果你给一个键设置1000秒的生存时间,然后在未来将你的计算机设置在2000秒以后,这个键将会立即失效,而不是持续1000秒。
Redis键将会通过两种方式过期:一个被动的方式,和一个主动的方式。
一个键的被动过期是很简单的,当一些客户端尝试访问它,然后这个键被发现超时了。
当然,这是不够的,因为有一些键将永远不会被再次访问。这些键无论如何都应该被过期。所以,Redis会定期的在过期的 *** 中随机范围 *** 试少量的键。所有的已过期的键将会被从键空间被删除。
这就是Redis会在每秒做10次的事情:
这是一个小概率的算法,基本的设想是我们的样本 *** 整个键空间,然后我们继续失效直到将要失效的键百分比小于25%。
这意味着在任何一个时刻,正在使用内存的已经过期的更大数量的键等于每秒更大写 *** 作数量除以4.
为了获得正确的行为而不牺牲一致 *** ,当一个键失效, DEL *** 作会同时在AOF文件和附属的副节点执行。这种方式失效进程是在主实例集中的,也不会出现一致 *** 错误。
然而,当副本已经连接到主节点后将不会 *** 的失效键(但将会等待来自主节点的 DEL),他们仍将会获取数据集中的全部过期状态,所以当一个副本被 *** 为主节点后,它将能够 *** 的失效这些键,完全像一个主节点。
二、redis需要设置过期时间吗
redis通过expire命令来设置key的过期时间。
语法:redis.expire(key, expiration)
1.在小于2.1.3的redis版本里,只能对key设置一次expire。redis2.1.3和之后的版本里,可以多次对key使用expire命令,更新key的expire time。
2. redis术语里面,把设置了expire time的key叫做:volatile keys。意思就是不稳定的key。
3.如果对key使用set或del命令,那么也会移除expire time。尤其是set命令,这个在编写程序的时候需要注意一下。
4. redis2.1.3之前的老版本里,如果对volatile keys做相关写入 *** 作(LPUSH,LSET),和其他一些触发修改value的 *** 作时,redis会删除该key。也就是说:
redis2.1.3之后的版本里面没有这个约束,可以任意修改。
//redis2.2.2 ret *** n 101; redis<2.1.3 ret *** n 1;
5. redis对过期键采用了lazy expiration:在访问key的时候判定key是否过期,如果过期,则进行过期处理。其次,每秒对volatile keys进行抽样测试,如果有过期键,那么对所有过期key进行处理。
三、如何设置rediskey过期时间
1、设置redis key过期时间的 *** 有三种:
2、设置key,使用del *** nd *** 设置;用set or getset命令会将key的expiration清空,事实上set和getset命令是替换了key对应的value,所以key的过期时间也被设置。所以,需要注意的是:incr,LPUSH,HSET命令是不会改变key的过期时间的。原来是多久,这三条命令执行完之后还是多久;使用persist命令设置key的过期时间。
四、redis怎么删数据
Redis常用的删除策略有以下三种:
1.被动删除(惰 *** 删除):当读/写一个已经过期的Key时,会触发惰 *** 删除策略,直接删除掉这个Key;
2.主动删除(定期删除):Redis会定期巡检,来清理过期Key;
3.当内存达到 *** xmemory配置时候,会触发Key的删除 *** 作;
在 Redis中,常规 *** 作由 redis.c/serverCron实现,它主要执行以下 *** 作:
1.更新服务器的各类统计信息,比如时间、内存占用、数据库占用情况等。
3.对不合理的数据库进行大小调整。
4.关闭和清理连接失效的客户端。
5.尝试进行 AOF或 RDB持久化 *** 作。
6.如果服务器是主节点的话,对附属节点进行定期同步。
如果处于集群模式的话,对集群进行定期同步和连接测试。
Redis将 serverCron作为时间事件来运行,从而确保它每隔一段时间就会自动运行一次,又因为 serverCron需要在 Redis服务器运行期间一直定期运行,所以它是一个循环时间事件:serverCron会一直定期执行,直到服务器关闭为止。
如果Redis中每天过期大量Key(比如几千万),那么必须得考虑过期Key的清理:
增加Redis主动清理的频率(通过调大hz参数)
手动清理过期Key,最简单的 *** 是进行scan *** 作,scan *** 作会触发之一种被动删除,scan *** 作时候别忘了加count;
dbsize命令返回的Key数量,包含了过期Key
randomkey命令返回的Key,不包含过期Key
scan命令返回的Key,包含过期Key
db6:keys=1034937352,expires=9947314 *** , *** g_ttl=507838502
expires指的是设置了过期时间的Key数量
*** g_ttl指设置了过期时间的Key的平均过期时间(单位:毫秒)
文章分享结束,redis失效时间和redis在项目中的实际应用的 *** 你都知道了吗?欢迎再次光临本站哦!