我正在使用 Redis 作为缓存,并且希望使 Redis 中未主动使用的数据过期。目前,为对象设置过期时间会在过期时间过后删除对象。但是,如果在对象过期之前至少读取一次,我希望将对象保留在 Redis 中。
我看到的一种方法是为每个对象存储一个单独的expiry_key,并将过期时间设置为expiry_key而不是原始对象。订阅 expiry_key 上的 del 通知,当收到 del 通知时,检查在过期时间间隔内该对象是否至少被读取一次(通过单独维护的访问日志)。如果没有读取到该对象,则对原对象执行del命令。如果被读取,则使用到期间隔重新创建 expiry_key。
此实现需要额外的系统来管理过期,并且更愿意使用 Redis 在本地进行管理。
有更好的解决方案来解决这个问题吗?
每次读取时重置对象的过期时间会增加对 Redis 的写入次数,因此这不是一个选择。
请注意,redis 缓存刷新是通过更改通知系统异步管理的。
您可以在每次读取后再次设置过期密钥(在密钥上设置 TTL 是 O(1))。
您的系统在事务中执行此操作可能是有意义的:
MULTI
GET mykey
EXPIRE mykey 10
EXEC
您还可以管道化命令。
此模式也在官方文档中进行了描述。
请参阅 http://redis.io/topics/config
中的“将 Redis 配置为缓存”部分我们可以将 maxmemory-policy 设置为 allkeys-lru 以清除 Redis 中的不活动内容。这适用于我所说的用例。
另一种方法是在密钥上定义通知,然后重置其过期时间
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