`
worldly
  • 浏览: 43723 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

设置Redis的key的过期时间

阅读更多

        key上设置一个过期时间(timeout),一旦时间到了,这个key将会被自动删除。这种特性术语通常叫做Redis的不稳定性。

        一旦设置了过期时间,这个key只能被命令清除、删除或者重写其内容。这些命令包含del、set、getset以及所有的*store命令。这些命令只能改变key对应的value的存储值而不改变过期时间的设置。举个例子,使用incr改变key对应的value、使用lpush添加一个新的元素到lists中、使用hset设置field对应value的值等等这些操作都不影响已经对key设置的过期时间的属性。

       设置了过期时间的key依然可以使用persist命令重新持久化。

       如果key设置了过期时间,并且尚未被删除,使用rename命令重新命名后,该过期时间将转移到新的key上。事实上,rename命令重命名key后,原始的key对应属性全部发生转移。

       如果调用expire或者pexpire时传给一个负值作为参数以及expireat或者pexpireat调用的时候时间戳已经过去,那么该key将直接被删除而不是等待过期。

       刷新过期时间

       对一个设置了过期时间的key仍然可以调用expire更新其过期时间。这

       新版本和低于2.1.3版本的区别   

       在2.1.3版本之前,如果设置时间触发了修改value的工作,则key将会被删除,这会影响主从复制,之后的版本已经做了修正。

       返回值

       返回一个整数值

        1)如果过期时间被设置成功,返回1

        2)如果设置失败或者key不存在,则返回0

       

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> set mykey "Hello"
OK
127.0.0.1:6379> expire mykey 20
(integer) 1
127.0.0.1:6379> ttl mykey
(integer) 16
127.0.0.1:6379> expire m 10
(integer) 0
127.0.0.1:6379> ttl mykey
(integer) -2
127.0.0.1:6379> ttl m
(integer) -2

        假设你有一个web服务并且对用户访问过的最新N页数据感兴趣,每60秒记录一次并放在lists中。这样整个list中就会包含有用的信心,如用户对哪个产品感兴趣。这在Redis中非常容易实现:

MULTI
RPUSH pagewviews.user:<userid> http://.....
EXPIRE pagewviews.user:<userid> 60
EXEC

        如果用户超过60秒钟未访问网站,则这个key就会被删除,最终只能记录后来的。

        这个模式也可以使用incr代替rpush实现:

multi
incr     pageview.user:<userid>:<productid> http:......
expire   pageview.user:<userid>:<productid> 60
exec

       Redis Expires

       keys的过期时间,Redis并没有设置有效时间,换句话说,这个key将会一直存在直到用户显式删除,如del命令。expire的命令家族将会给key设置一个过期时间,这使得key存储将花费更多的时间。一旦被设置了过期时间,时间一到,key将会被删除。

       expire命令可以重新设置key的存活时间。persist命令则会持久化key。

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> set str a
OK
127.0.0.1:6379> ttl str
(integer) -1
127.0.0.1:6379> expire str 20
(integer) 1
127.0.0.1:6379> ttl str
(integer) 13
127.0.0.1:6379> set str b
OK
127.0.0.1:6379> ttl str
(integer) -1
127.0.0.1:6379> expire str 100
(integer) 1
127.0.0.1:6379> ttl str
(integer) 97
127.0.0.1:6379> persist str
(integer) 1
127.0.0.1:6379> ttl str
(integer) -1

        Expire的精度

       在Redis 2.4过期时间的设置并不是高精度的,误差在0到1秒的误差。从2.6开始精度提高到0到1毫秒。

       expire 和persist

       过期时间的设置是以unix时间的绝对秒存储的(2.6以上版本是绝对毫秒)。也就是说,即使Redis 服务已经停止了,时间也还在流逝。

       为了精确度,计算机时间必须保持稳定。如果将rdb文件在两台有较大时差的服务器上移动,有趣的事情将会发生,就像所有的keys均被设置了过期时间一样。

       即使实在同一台正在运行的数据库实例上,它将总是检查计算机的时间设置。如果你设置某个key的过期时间是1000秒后,然后设置系统时间延后2000秒,那么该key则立即被删除而不是由1000秒的存活时间。

       Expire在Redis中keys的实现

       在实现方式上,有两中方法:被动和主动的。

       被动方式是指,设置了过期时间的keys只有在客户端访问的时候才会被发现并对其执行删除从操作。

       这种方法当然是不够好,因为有些keys是不会被再次访问到的。所以定期随机地检测keys的,对过期的keys执行清楚操作,以便于存key空间中删除。

       明确来说,Redis每分钟执行10次检测:

       1)在所有的建中随机找到20个设置了过期时间的keys

       2)删除其中已经过期的keys

       3)如果超过25%的keys被删除,那么从1)开始再次执行,知道被删除的keys比例降低到25%以下

       这意味着,任何给定的时刻,被过期删除的keys的数量最大等于每秒钟写操作执行次数除以4的最大值。

       过期清楚keys时复制链接和AOF文件的处理  

       为了保持一致性并获得较好的性能。当一个key过期时,删除AOF文件的del操作在master和slaves之间同步执行,这样不存在一致性错误的可能。

       然而,slaves是不可以单独的执行del操作的,而是等待master发送过来的del指令,而此时会携带全部的过期设置信息,所以当slave被选中成为master时,它就可以单独地清楚过期的keys,完全像一个master一样。

        

 

分享到:
评论

相关推荐

    Redis集群下过期key监听的实现代码

    于是想,既然不能监听集群,那我可以建立多个redis连接,分别对每个redis的key过期进行监听。以上做法可能不尽人意,目前也没找到好的解决方案,如果有好的想法,请留言告知哦!不多说,直接贴我自己的代码! 2. ...

    监听redis过期key,做对应业务处理

    需要注意的是,Spring Data Redis默认并不直接支持Key过期事件的监听,而是通过Redis的`EXPIRE`命令设置Key的过期时间。当Key过期时,Redis会自动删除,而Spring Data Redis的缓存事件监听器会在缓存被清除时触发`...

    java操作Redis缓存设置过期时间的方法

    Java 操作 Redis 缓存设置过期时间的方法 Java 操作 Redis 缓存设置过期时间是指在 Java 应用程序中使用 Redis 缓存时设置缓存项的过期时间,以便自动删除缓存项。下面将详细介绍 Java 操作 Redis 缓存设置过期...

    Redis清理过期key的方法.doc

    volatile-random、volatile-lru、volatile-ttl、volatile-lfu 是从设置了过期时间的 key 中挑选进行淘汰的策略。 LRU 算法 LRU 算法的设计原则是如果一个数据近期没有被访问到,那么之后一段时间都不会被访问到。...

    redis命令集合,redis命令详解

    EXPIRE设置某个key的过期时间(秒),(EXPIRE bruce 1000:设置bruce这个key1000秒后系统自动删除)注意:如果在还没有过期的时候,对值进行了改变,那么那个值会被清除。 TTL查找某个key还有多长时间过期,返回时间秒 ...

    Redis获取某个前缀的key脚本实例

    在Redis中,获取带有特定前缀的key是一项常见的需求,特别是在进行数据统计、清理或监控时。传统的`keys`命令虽然能快速找到所有匹配前缀的key,但在大型数据库中,由于其全量扫描的特性,可能导致服务器阻塞。因此...

    监听redis的key的变化

    - **配置**:在Redis配置文件中启用Keyspace Notifications,设置`notify-keyspace-events`参数。不同的字母组合表示不同的事件类型,如K代表键被修改,E代表键被删除等。 - **事件类型**:包括键空间事件(如所有...

    Redis_Key操作命令

    通过这些命令,我们可以对Redis数据库中的Key进行管理,包括查找、删除、移动、重命名以及设置过期时间等操作,从而更好地利用Redis的数据存储能力。了解和熟练掌握这些命令对于使用Redis至关重要。

    Python操作Redis之设置key的过期时间实例代码

    请注意,设置过期时间后,即使在key过期前,Redis仍然可以返回key的值。一旦key过期,Redis会在后台异步删除key,因此,尝试访问过期key可能在某些情况下返回`None`,但在其他情况下可能会返回key的旧值,这取决于...

    spring-redis-session 自定义 key 和过期时间

    Spring-Redis-Session 自定义 key 和过期时间 Spring-Redis-Session 是一个基于 Spring 框架的会话管理模块,它使用 Redis 作为会话存储介质,提供了灵活的会话管理机制。在本文中,我们将详细介绍 Spring-Redis-...

    Redis语法,Key值设计及常用案例介绍

    5. 设置过期时间:`EXPIRE key seconds`,例如 `EXPIRE user:123 86400` 设定键24小时内过期。 二、Redis Key设计原则 1. 简洁性:Key应尽可能短,但保持可读性,例如使用`user:123`而非`username_of_user_123`。 ...

    Redis热点key及大key解决方案.docx

    ### Redis热点Key与大Key解决方案 #### 一、热点Key问题及解决方案 **问题描述**: 在使用Redis作为缓存时,热点Key是指那些访问频率非常高但更新频率相对较低的键值对。这类键的存在可能导致所有请求集中在少数几...

    redis中key的设置方法步骤

    4. **`EXPIRE key seconds`** - 为Key设置一个过期时间,单位是秒。例如,`EXPIRE mykey 60`会让`mykey`在60秒后自动失效。 5. **`EXPIREAT key timestamp`** - 类似于`EXPIRE`,但使用Unix时间戳。 6. **`PEXPIRE ...

    spring boot+redis 监听过期Key的操作方法

    本文主要介绍了使用 Spring Boot 和 Redis 监听过期 Key 的操作方法,这种方法在订单业务中非常有用,可以用来设置订单的有效期限,到了有效期限后如果还未支付,就需要修改订单状态。 为什么需要监听过期 Key 在...

    redis过期监听.docx

    在主程序中,我们创建`Redis2`的实例,并通过`setOption1`设置读取超时为-1,确保在处理过期键事件时不会超时。接着,订阅`__keyevent@0__:expired`模式,并提供一个回调函数,该函数将在键过期时执行: ```php $...

    python redis 批量设置过期key过程解析

    本文将深入探讨如何使用Python的redis库来批量设置Redis中的key过期时间。 首先,我们需要导入`redis`库,它是Python官方提供的用于操作Redis的客户端库。以下是一个简单的示例,展示如何创建Redis客户端并连接到...

    redis过期策略和内存淘汰机制.pdf

    这些命令可以用来设置key的过期时间,以便在特定的时间点删除key。 内存淘汰机制(Eviction Policy) Redis提供了多种内存淘汰机制,包括: 1. volatile-lru:淘汰最近最少使用的key。 2. volatile-lfu:淘汰最近...

Global site tag (gtag.js) - Google Analytics