在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连接,分别对每个redis的key过期进行监听。以上做法可能不尽人意,目前也没找到好的解决方案,如果有好的想法,请留言告知哦!不多说,直接贴我自己的代码! 2. ...
需要注意的是,Spring Data Redis默认并不直接支持Key过期事件的监听,而是通过Redis的`EXPIRE`命令设置Key的过期时间。当Key过期时,Redis会自动删除,而Spring Data Redis的缓存事件监听器会在缓存被清除时触发`...
Java 操作 Redis 缓存设置过期时间的方法 Java 操作 Redis 缓存设置过期时间是指在 Java 应用程序中使用 Redis 缓存时设置缓存项的过期时间,以便自动删除缓存项。下面将详细介绍 Java 操作 Redis 缓存设置过期...
volatile-random、volatile-lru、volatile-ttl、volatile-lfu 是从设置了过期时间的 key 中挑选进行淘汰的策略。 LRU 算法 LRU 算法的设计原则是如果一个数据近期没有被访问到,那么之后一段时间都不会被访问到。...
EXPIRE设置某个key的过期时间(秒),(EXPIRE bruce 1000:设置bruce这个key1000秒后系统自动删除)注意:如果在还没有过期的时候,对值进行了改变,那么那个值会被清除。 TTL查找某个key还有多长时间过期,返回时间秒 ...
在Redis中,获取带有特定前缀的key是一项常见的需求,特别是在进行数据统计、清理或监控时。传统的`keys`命令虽然能快速找到所有匹配前缀的key,但在大型数据库中,由于其全量扫描的特性,可能导致服务器阻塞。因此...
- **配置**:在Redis配置文件中启用Keyspace Notifications,设置`notify-keyspace-events`参数。不同的字母组合表示不同的事件类型,如K代表键被修改,E代表键被删除等。 - **事件类型**:包括键空间事件(如所有...
通过这些命令,我们可以对Redis数据库中的Key进行管理,包括查找、删除、移动、重命名以及设置过期时间等操作,从而更好地利用Redis的数据存储能力。了解和熟练掌握这些命令对于使用Redis至关重要。
请注意,设置过期时间后,即使在key过期前,Redis仍然可以返回key的值。一旦key过期,Redis会在后台异步删除key,因此,尝试访问过期key可能在某些情况下返回`None`,但在其他情况下可能会返回key的旧值,这取决于...
Spring-Redis-Session 自定义 key 和过期时间 Spring-Redis-Session 是一个基于 Spring 框架的会话管理模块,它使用 Redis 作为会话存储介质,提供了灵活的会话管理机制。在本文中,我们将详细介绍 Spring-Redis-...
5. 设置过期时间:`EXPIRE key seconds`,例如 `EXPIRE user:123 86400` 设定键24小时内过期。 二、Redis Key设计原则 1. 简洁性:Key应尽可能短,但保持可读性,例如使用`user:123`而非`username_of_user_123`。 ...
### Redis热点Key与大Key解决方案 #### 一、热点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 的操作方法,这种方法在订单业务中非常有用,可以用来设置订单的有效期限,到了有效期限后如果还未支付,就需要修改订单状态。 为什么需要监听过期 Key 在...
在主程序中,我们创建`Redis2`的实例,并通过`setOption1`设置读取超时为-1,确保在处理过期键事件时不会超时。接着,订阅`__keyevent@0__:expired`模式,并提供一个回调函数,该函数将在键过期时执行: ```php $...
本文将深入探讨如何使用Python的redis库来批量设置Redis中的key过期时间。 首先,我们需要导入`redis`库,它是Python官方提供的用于操作Redis的客户端库。以下是一个简单的示例,展示如何创建Redis客户端并连接到...
这些命令可以用来设置key的过期时间,以便在特定的时间点删除key。 内存淘汰机制(Eviction Policy) Redis提供了多种内存淘汰机制,包括: 1. volatile-lru:淘汰最近最少使用的key。 2. volatile-lfu:淘汰最近...