Redis 删除模式太慢

  for i, name in ipairs(redis.call('KEYS', 'cache:user_transaction_logs:*:8866666')) do redis.call('DEL', name); end"

如何优化这个 Redis 查询?

我们在 Rails 中使用 Redis 作为缓存存储。每当用户成功交易时,接收者和发起者的交易历史记录都会从 Redis 中过期。

点赞
用户3160475
用户3160475

查询无法进行优化 - 应该完全替换,因为除了在非生产环境上进行调试目的之外,不建议使用 KEYS

相比于临时获取相关键名的方法,更好的做法是将它们管理在一个数据结构中(例如集合或列表),并在执行删除操作时从中读取。

# 示例代码
key_set = set()
key_set.add("key1")
key_set.add("key2")
key_set.add("key3")

# ...

for key in key_set:
    redis_client.delete(key)
2017-02-13 08:20:37
用户7539706
用户7539706

你需要改变存储缓存条目的方法,键应该看起来像 cache:user_transaction_logs:{user_id}。然后你就可以通过其键(user_id)轻松删除该条目。

如果一个 user_id 需要多个缓存条目,请使用 Redis 哈希表(https://redis.io/commands#hash),然后再次使用一个命令 DELETE 删除该 user_id 下的所有条目,或使用 HDEL 删除需要的条目。

另外,使用Redis数据库编号(默认为0,可用的编号为1-15)并将不同的功能放置在不同的数据库编号上是一个不错的主意。在这种情况下,如果您需要清除整个功能的缓存,可以使用一个命令 FLUSHDB

2017-02-13 16:10:40