【发布时间】:2016-02-07 06:59:29
【问题描述】:
我的 redis 集合包含许多键
我希望能够将它们全部刷新,除了以以下开头的所有键:
“配置::”
这可能吗?
【问题讨论】:
标签: redis
我的 redis 集合包含许多键
我希望能够将它们全部刷新,除了以以下开头的所有键:
“配置::”
这可能吗?
【问题讨论】:
标签: redis
你可以这样做
redis-cli KEYS "*" | grep -v "configurations::" | xargs redis-cli DEL
列出所有键到redis,从列表中删除包含“configurations::”的键并从redis中删除它们
编辑 正如@Sergio Tulentsev 注意到的那样,它的密钥不适用于生产。我使用这个 python 脚本来删除生产 redis 上的键。在调用脚本之前,我停止了从 master 到 slave 的复制。
#!/usr/bin/env python
import redis
import time
pattern = "yourpattern*"
poolSlave = redis.ConnectionPool(host='yourslavehost', port=6379, db=0)
redisSlave = redis.Redis(connection_pool=poolSlave)
poolMaster = redis.ConnectionPool(host='yourmasterhost', port=6379, db=0)
redisMaster = redis.Redis(connection_pool=poolMaster)
cursor = '0'
while cursor != 0:
cursor, data = redisSlave.scan(cursor, pattern, 1000)
print "cursor: "+str(cursor)
for key in data:
redisMaster.delete(key)
print "delete key: "+key
# reduce call per second on production server
time.sleep(1)
【讨论】:
SCAN & DEL 方法(由@khanou 提出)是最好的临时解决方案。或者,您可以使用 Redis 集保留所有 configurations:: 键名称的索引(只要您创建新的 configurations:: 键,只需将 SADD 键的名称添加到它)。一旦你有了这个集合,你就可以SSCAN 它来更有效地获取所有相关的键名(尽管当你DEL 时不要忘记从它SREM)。
【讨论】:
是的,这是可能的。枚举所有键,评估每个键,如果符合删除条件则删除。
如果这是您所要求的,则没有内置的 redis 命令。
也许可以编写一个 Lua 脚本来执行此操作(它会在您的应用程序中查看它是一个命令),但它仍然是相同的方法。
【讨论】: