大家好,今天来为大家分享redis设置过期时间的一些知识点,和Redis的过期策略的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!
本文目录
一、如何设置rediskey过期时间
1、设置redis key过期时间的 *** 有三种:
2、设置key,使用delmand *** 设置;用set or getset命令会将key的expiration清空,事实上set和getset命令是替换了key对应的value,所以key的过期时间也被设置。所以,需要注意的是:incr,LPUSH,HSET命令是不会改变key的过期时间的。原来是多久,这三条命令执行完之后还是多久;使用persist命令设置key的过期时间。
二、redis 怎么设置过期时间为每天24:00
PEXPIREAT KEY_NAME TIME_IN_MILLISECONDS_IN_UNIX_TIMESTAMP
设置成功返回 1。当 key不存在或者不能为 key设置过期时间时(比如在低于 2.1.3版本的 Redis中你尝试更新 key的过期时间)返回 0。
redisKey:是redis的key值 over_time是当天的24点
var over_time=(Timer.getDayHour(Timer.now(), 0, 0, 0)* Timer._M_SEC)+ Timer.OneDay;
Timer._M_SEC= 1000这里设置的 ms数
Timer.OneDay= 24*60*60*1000;//86400000
Timer.now():当前时间可以根据不同的语言更换对应的取值方式
*@Brief:获取指定时间(秒数)当天某时候的秒数
*@param{Number} timeStampe时间毫秒数
Timer.getDayHour= function(timeStampe, hour, min, sec){
var nowDate= new Date(timeStampe);
return Math.floor(nowDate.getTime()/ _M_SEC);
三、Redis过期键删除策略和内存淘汰策略
1、 惰性删除+定期删除
2、 键过期后并不会立即删除,而是等到使用它时,先判断该键是否已经过期,如果过期则删除
3、 对内存不友好,对CPU友好
4、 redis每隔一段时间随机检测一部分数据(并不是全部)是否过期,如果已过期则删除
5、 redis.conf中的hz参数用来配置每秒执行几次定期删除,默认值是10,即100ms/次
6、 redis.conf中的maxmemory-samples参数用来指定每次检测几条数据,默认5
7、 对CPU不友好,对内存友好
8、 redis.conf中的maxmemory参数配置了redis的更大内存,maxmemory-policy配置了内存淘汰策略,当redis内存达到更大后,会根据内存淘汰策略淘汰部分数据。
9、 redis提供了8种内存淘汰策略:
10、 no-eviction:当内存达到更大后,新数据不能写入,会报错
11、 allkeys-lru:当内存达到更大后,淘汰最近最少使用的数据(最常用的策略)
12、 allkeys-random:当内存达到更大后,随机淘汰
13、 allkeys-lfu:当内存达到更大后,淘汰最少使用的数据
14、 volatitle-lru:当内存达到更大后,从设置了过期键的数据中,淘汰最近最少使用的数据
15、 volatitle-random:当内存达到更大后,从设置了过期键的数据中,随机淘汰
16、 volatitle-lfu:当内存达到更大后,从设置了过期键的数据中,淘汰最少使用的数据
17、 volatitle-ttl:当内存达到更大后,淘汰最早过期的数据
18、 标准的LRU算法需要维护一个链表,当某个数据被使用时就把它放到链表头部,这样就保证了链表是按照使用时间排序的,当需要淘汰数据时,就从链表尾部删除部分数据。
19、 标准LRU算法要进行大量的计算,redis采取了近似LRU算法的操作。
20、 redis给每个键维护了一个24bit的属性字段,用来记录最后一次使用的时间戳。redis根据maxmemory-samples随机抽取一部分数据,将最旧的数据淘汰,指到内存降下来。后来redis又引入了淘汰池,淘汰池内的数据量等于maxmemory-samples,每次淘汰时将随机抽取的数据和淘汰池中的数据合并,淘汰最旧的数据,然后将剩余最旧的数据维护到淘汰池中,等待下次循环。
21、 为什么需要LFU算法?
22、 现在假设这种场景:redis中有两个键A和B,其使用频率如上面所示,当到达$时,因为A的使用时间比B晚,按照LRU算法会淘汰B,但是从使用频率上看,B明显比A使用的更频发,应该淘汰A。
23、 为了解决上面的问题,Redis引入了LFU算法,淘汰最少使用的数据。原理如下:
24、 LFU给每个数据维护了一个计数器,每次使用都会使计数器增加,淘汰使用次数最少的键。但是这样又有新的问题:
25、 ①新的key如果计数器为0,可能就会一直被淘汰
26、 redis解决方案:redis给每个新的键的计数器一个初始值
27、 ②某个键可能前一段时间被频繁使用,但是一段时间后使用频率就会下降。
28、 redis解决方案:如果某个键一段时间不使用,计数器会减小
四、Redis过期时间
给一个 key设置超时时间。在一个超时时间结束后,这个键将会被自动删除。一个拥有关联过期时间的键在Redis术语里通常被认为不稳定的。
只有删除或者覆盖键的内容的命令,包括 DEL, SET, GETSET和所有的*STORE命令,才会把过期时间清除。这意味着从理论上讲,所有改变键上存储的值而不是使用新的值来替换的操作,都将会保持过期时间不变。例如,使用 INCR增加一个键的值,使用 LPUSH讲一个新的值放到列表中,或者使用 HSET改变一个哈希的字段的值都将会使过期时间保持不变。
使用 PERSIST命令将一个键变成持久化的键,过期时间也会被清除。
如果一个键被 RENAME重命名,关联的生存时间将会被转移到新的键名上。
如果一个键被 RENAME重命名,就像在一个已经存在的键 Key_A,它被一个调用 RENAME Key_B Key_A所覆盖,原始的 Key_A是否关联过期时间是没关系的,新的键 Key_A将会继承 Key_B的所有特征。
注意,使用负数调用 EXPIRE/ PEXPIRE,或者使用过去的时间调用 EXPIREAT/ PEXPIREAT将会使键被删除,而不是过期(相应的,弹出的 key event将会是 del,而不是 expired)。
可以使用一个已经有过期时间集的键作为参数来调用 EXPIRE。在这种情况下,一个键的生存时间已经更新为一个新值。对此很多应用,下面的 Navigation session模式一节记录了一个例子。
在Redis 2.1.3之前的版本中,使用一个命令改变一个拥有过期时间的键的值,效果跟彻底移除这个键一样。这种语义是必须的,因为复制层的限制现在已经确定了。
EXPIRE将会返回0,并且不会使用一个过期时间 *** 来改变一个键的过期时间。
redis> SET mykey"Hello World"
想象你有一个网页服务,并且你对用户最近访问的N个页面有兴趣,这样每个临近的页面视图的执行时间不会超过前一个页面视图执行的60秒。理论上来讲,你可以认为用户访问的页面 *** 为 Navigation session,其中就可以包含用户在寻找哪些他或她感兴趣的产品信息,因此你可以推荐关联的产品。
你可以非常容易的使用下面的策略在Redis中建模这种类型:每次用户访问一个页面你就调用下面的命令:
如果用户闲置超过60秒,这个键将会被删除,只有访问时间差值小于60秒的页面才会被记录。
这个模式可以很容易的修改为使用 INCR做计数器来替代使用 RPUSH的列表。
通常情况下创建Redis的键时不关联生存时间。这个键将会简单的一直生存,除非用户显示的删除它,例如使用 DEL命令。
EXPIRE家族命令能够把一个过期时间关联到一个给定的键,代价是这个键会使用额外的内存。当一个键设置了过期时间,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.
为了获得正确的行为而不牺牲一致性,当一个键失效, 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 return 101; redis<2.1.3 return 1;
5. redis对过期键采用了lazy expiration:在访问key的时候判定key是否过期,如果过期,则进行过期处理。其次,每秒对volatile keys进行抽样测试,如果有过期键,那么对所有过期key进行处理。
关于redis设置过期时间,Redis的过期策略的介绍到此结束,希望对大家有所帮助。