我正在编写一个django管理命令来处理一些redis缓存。基本上,我需要选择所有的键,确认到某个模式(例如:“前缀:*”)并删除它们。
我知道我可以使用cli来实现这一点:
redis-cli KEYS "prefix:*" | xargs redis-cli DEL
但我需要在应用程序内完成这项工作。所以我需要使用python绑定(我使用py redis)。我尝试将列表输入delete,但失败了:
from common.redis_client import get_redis_client
cache = get_redis_client()
x = cache.keys('prefix:*')
x == ['prefix:key1','prefix:key2'] # True
现在
cache.delete(x)
#返回0。未删除任何内容
我知道我可以在x上迭代:
for key in x:
cache.delete(key)
但这将使redis失去惊人的速度和滥用其能力。有没有py redis的pythonic解决方案,没有迭代和/或cli?
谢谢!
下面是使用py-redis的完整工作示例:
您还可以执行
scan_iter
将所有键放入内存,然后将所有键传递给delete
进行批量删除,但对于较大的命名空间,可能会占用大量内存。所以最好为每个键运行一个delete
。干杯!
更新:
在写了答案之后,我开始使用redis的流水线特性在一个请求中发送所有命令并避免网络延迟:
更新2(最佳性能):
如果使用
scan
而不是scan_iter
,则可以控制块大小,并使用自己的逻辑遍历光标。这似乎也要快得多,尤其是在处理许多密钥时。如果你添加流水线,你会得到一点性能提升,10-25%取决于块大小,以内存使用为代价,因为你不会发送execute命令到Redis,直到一切都生成。所以我坚持扫描:以下是一些基准:
使用繁忙的Redis集群的5k块:
5k块和一个空闲的dev redis(localhost):
使用扫描迭代器:https://pypi.python.org/pypi/redis
我认为
很好很简洁。
delete
一次只需要一个键,所以必须循环。否则,这个previous question and answer将指向基于lua的解决方案。
相关问题 更多 >
编程相关推荐