Redis的key过期设置、查询、清理

1.redis过期时间介绍

有时候我们并不希望redis的key一直存在。例如缓存,验证码等数据,我们希望它们能在一定时间内自动的被销毁。redis提供了一些命令,能够让我们对key设置过期时间,并且让key过期之后被自动删除

2.redis过期时间相关命令

1.EXPIRE PEXPIRE 

    EXPIRE 接口定义:EXPIRE key "seconds"
    接口描述:设置一个key在当前时间"seconds"(秒)之后过期。返回1代表设置成功,返回0代表key不存在或者无法设置过期时间。

 
    PEXPIRE 接口定义:PEXPIRE key "milliseconds"
    接口描述:设置一个key在当前时间"milliseconds"(毫秒)之后过期。返回1代表设置成功,返回0代表key不存在或者无法设置过期时间。

1

2

3

4

5

6

127.0.0.1:6379> set aa bb

OK

127.0.0.1:6379> EXPIRE aa 60

(integer) 1

127.0.0.1:6379> EXPIRE aa 600

(integer) 1

 

2.EXPIREAT PEXPIREAT

    EXPIREAT 接口定义:EXPIREAT key "timestamp"
    接口描述:设置一个key在"timestamp"(时间戳(秒))之后过期。返回1代表设置成功,返回0代表key不存在或者无法设置过期时间。


    PEXPIREAT 接口定义:PEXPIREAT key "milliseconds-timestamp"
    接口描述:设置一个key在"milliseconds-timestamp"(时间戳(毫秒))之后过期。返回1代表设置成功,返回0代表key不存在或者无法设置过期时间

1

2

3

4

5

6

127.0.0.1:6379> set aa bb

OK

127.0.0.1:6379> EXPIREAT aa 1586941008

(integer) 1

127.0.0.1:6379> PEXPIREAT aa 1586941008000

(integer) 1

 

3.TTL PTTL

    TTL 接口定义:TTL key
    接口描述:获取key的过期时间。如果key存在过期时间,返回剩余生存时间(秒);如果key是永久的,返回-1;如果key不存在或者已过期,返回-2。


    PTTL 接口定义:PTTL key
    接口描述:获取key的过期时间。如果key存在过期时间,返回剩余生存时间(毫秒);如果key是永久的,返回-1;如果key不存在或者已过期,返回-2。

1

2

3

4

5

6

7

8

9

10

127.0.0.1:6379> set aa bb

OK

127.0.0.1:6379> EXPIRE  aa 60

(integer) 1

127.0.0.1:6379> ttl aa

(integer) 58

127.0.0.1:6379> ttl aa

(integer) 56

127.0.0.1:6379> pttl aa

(integer) 40395

4.PERSIST

    PERSIST 接口定义:PERSIST key
    接口描述:移除key的过期时间,将其转换为永久状态。如果返回1,代表转换成功。如果返回0,代表key不存在或者之前就已经是永久状态。

1

2

3

4

5

6

7

8

9

10

127.0.0.1:6379> set aa bb

OK

127.0.0.1:6379> EXPIRE  aa 600

(integer) 1

127.0.0.1:6379> ttl aa

(integer) 596

127.0.0.1:6379> PERSIST aa

(integer) 1

127.0.0.1:6379> ttl aa

(integer) -1

5.SETEX

  SETEX 接口定义:SETEX key "seconds" "value"
  接口描述:SETEX在逻辑上等价于SET和EXPIRE合并的操作,区别之处在于SETEX是一条命令,而命令的执行是原子性的,所以不会出现并发问题。

1

2

3

4

5

6

127.0.0.1:6379> SETEX aa 100 bb

OK

127.0.0.1:6379> pttl aa

(integer) 95834

127.0.0.1:6379> ttl aa

(integer) 81

 

3.redis如何清理过期key 

  redis出于性能上的考虑,无法做到对每一个过期的key进行即时的过期监听和删除。但是redis提供了其它的方法来清理过期的key。

  1.被动清理(或者称惰性过期)

  当用户主动访问一个过期的key时,redis会将其直接从内存中删除。

  2.主动清理(或者称定期过期)

  在redis的持久化中,我们知道redis为了保持系统的稳定性,健壮性,会周期性的执行一个函数。在这个过程中,会进行之前已经提到过的自动的持久化操作,同时也会进行内存的主动清理。
  在内存主动清理的过程中,redis采用了一个随机算法来进行这个过程:简单来说,redis会随机的抽取N(默认100)个被设置了过期时间的key,检查这其中已经过期的key,将其清除。同时,如果这其中已经过期的key超过了一定的百分比M(默认是25),则将继续执行一次主动清理,直至过期key的百分比在概率上降低到M以下。

4.redis内存不足时的策略

  redis是一个基于内存的数据库,如果存储的数据量很大,达到了内存限制的最大值(设置maxmemory),将会出现内存不足的问题。redis允许用户通过配置maxmemory-policy参数,指定redis在内存不足时的解决策略

  • noeviction(默认策略):对于写请求不再提供服务,直接返回错误(DEL请求和部分特殊请求除外)
  • allkeys-lru:从所有key中使用LRU算法进行淘汰
  • volatile-lru:从设置了过期时间的key中使用LRU算法进行淘汰
  • allkeys-lfu:从所有key中使用LFU算法进行淘汰
  • volatile-lfu:从设置了过期时间的key中使用LFU算法进行淘汰
  • allkeys-random:从所有key中随机淘汰数据
  • volatile-random:从设置了过期时间的key中随机淘汰
  • volatile-ttl:在设置了过期时间的key中,根据key的过期时间进行淘汰,越早过期的越优先被淘汰

当使用volatile-lru、volatile-random、volatile-ttl这三种策略时,如果没有key可以被淘汰,则和noeviction一样返回错误。

LRU和LFU:https://blog.csdn.net/haoranhaoshi/article/details/109838400

Redis中内存满时的LRU是靠数据的访问时间的对比,访问时间在获取时并不是获取系统时间,而是一个定时(100ms)刷新时间的线程提供的。 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Redis中可以使用过期键(expire key)来设置键的过期时间,当键过期时,可以使用回调函数(callback function)来处理键过期的事件。 在Redis中,可以使用“键空间通知”(keyspace notification)来设置过期键的回调函数。通过键空间通知,可以订阅Redis中的某些事件,包括键的过期事件。当一个键过期时,Redis会触发一个键空间通知,可以通过设置相应的回调函数来处理这个事件。 设置过期键的回调函数可以通过以下步骤完成: 1. 在Redis配置文件中启用键空间通知(keyspace notification)功能。 2. 使用Redis的客户端库(如Python Redis)订阅键空间通知中的过期事件。 3. 定义一个回调函数来处理过期事件。回调函数可以在Redis客户端库中注册。 4. 当一个键过期时,Redis会触发一个过期事件,并向订阅者发送一个键空间通知。在回调函数中可以处理这个事件。 示例代码如下(使用Python Redis客户端库): ```python import redis def callback_function(key): print("Key {} has expired".format(key)) r = redis.Redis(host='localhost', port=6379) # 开启键空间通知 r.config_set('notify-keyspace-events', 'Ex') # 订阅过期事件 p = r.pubsub() p.psubscribe('__keyevent@0__:expired') # 注册回调函数 p.subscribe(callback_function) # 阻塞等待过期事件 p.run_in_thread(sleep_time=0.1) ``` 在这个示例中,首先使用Redis客户端库连接到Redis服务器,并启用键空间通知功能。然后,订阅键空间通知中的过期事件,并注册一个回调函数来处理这个事件。最后,使用Redis客户端库的run_in_thread()方法来阻塞等待过期事件,直到程序被终止。 ### 回答2: 在Redis中,当一个key过期时,不会自动触发任何回调函数。然而,我们可以通过一些方法来实现类似回调的功能。 一种常见的方法是使用Redis的发布/订阅功能。我们可以在key过期时,发布一个通知消息。订阅者可以通过订阅该通知频道来接收该消息,并执行相应的操作。 另一种方法是使用Redis的Lua脚本。我们可以在设置key的同时,设置一个相应的过期时间,并在脚本中添加一些逻辑来处理过期事件。当key过期时,脚本会被自动调用,并执行脚本中定义的回调函数。 此外,我们还可以使用Redis的持久化功能来实现类似的回调。我们可以在key过期时,在AOF或RDB持久化文件中记录一个回调指令。当Redis重新启动时,它会根据持久化文件中的指令执行相应的操作。 总之,Redis本身没有直接提供回调的功能,但我们可以通过发布/订阅、Lua脚本或持久化等方式,来实现类似的功能。这些方法可以根据具体的需求来选择和应用。 ### 回答3: 当Rediskey过期时,Redis提供了一种回调机制来通知客户端或应用程序。这个回调机制是通过Redis的"notify-keyspace-events"配置来实现的。 在Redis的配置文件中,可以设置"notify-keyspace-events"参数来定义回调的行为。该参数可以设置为以下几种选项的组合: 1. "K":键空间通知,当有键过期或被删除时触发回调。 2. "E":键事件通知,当有键被修改时触发回调。 3. "g":一般命令通知,当有与键相关的一般命令(如DEL、RENAME等)被执行时触发回调。 4. "x":过期事件通知,当有一个key过期时触发回调。 5. "E":删除事件通知,当有一个key被删除时触发回调。 例如,如果想要在key过期时触发回调,可以将"notify-keyspace-events"设置为“Ex”,其中E表示键事件通知,x表示过期事件通知。 在应用程序中,可以通过订阅Redis的事件通道来接收过期key的回调。使用程序可以使用Redis的SUBSCRIBE命令订阅__keyevent@*__:*通道,然后监听特定的过期事件通道(如__keyevent@0__:expired)来接收过期key的回调信息。 当过期事件发生时,Redis将在该事件通道的SUBSCRIBE客户端上发布一条消息,其中包含过期key信息。应用程序可以通过监听这些消息来实现自定义的回调逻辑,比如清理相关的资源或执行特定的业务逻辑。 总之,当Rediskey过期时,可以通过配置Redis的通知参数和监听Redis的事件通道来实现回调机制,从而实现对过期key发生的事件的处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值