Redis 作为缓存 - 重置过期时间

问题描述 投票:0回答:4

我正在使用 Redis 作为缓存,并且希望使 Redis 中未主动使用的数据过期。目前,为对象设置过期时间会在过期时间过后删除对象。但是,如果在对象过期之前至少读取一次,我希望将对象保留在 Redis 中。

我看到的一种方法是为每个对象存储一个单独的expiry_key,并将过期时间设置为expiry_key而不是原始对象。订阅 expiry_key 上的 del 通知,当收到 del 通知时,检查在过期时间间隔内该对象是否至少被读取一次(通过单独维护的访问日志)。如果没有读取到该对象,则对原对象执行del命令。如果被读取,则使用到期间隔重新创建 expiry_key。

此实现需要额外的系统来管理过期,并且更愿意使用 Redis 在本地进行管理。

有更好的解决方案来解决这个问题吗?

每次读取时重置对象的过期时间会增加对 Redis 的写入次数,因此这不是一个选择。

请注意,redis 缓存刷新是通过更改通知系统异步管理的。

caching redis
4个回答
18
投票

您可以在每次读取后再次设置过期密钥(在密钥上设置 TTL 是 O(1))。

您的系统在事务中执行此操作可能是有意义的:

MULTI
GET mykey
EXPIRE mykey 10
EXEC

您还可以管道化命令。

此模式也在官方文档中进行了描述。


3
投票

请参阅 http://redis.io/topics/config

中的“将 Redis 配置为缓存”部分

我们可以将 maxmemory-policy 设置为 allkeys-lru 以清除 Redis 中的不活动内容。这适用于我所说的用例。


0
投票

另一种方法是在密钥上定义通知,然后重置其过期时间

看这里


0
投票

Python 示例

import redis 

redis_client = redis.StrictRedis(host='localhost', port=9379, db=0)
key = "mydata" 
data = 1234   
redis_client.set(key, data, ex=3600) # expires in 1 hour 
© www.soinside.com 2019 - 2024. All rights reserved.