我想删除与特定模式不匹配的Redis键。 Redis数据看起来像这样-
prefix9_key1
prefix9_key2
prefix11_key1
prefix11_key2
prefix2_key1
prefix2_key2
这些前缀值是随机生成的数字(例如1123、3422、9879)。
我知道我当前的前缀是什么(假设它是prefix11)。但是没有办法知道之前使用的前缀是什么。我想删除所有不使用当前前缀值的键(prefix2 *和prefix9 *)。
我读了很多帖子,提到删除与模式匹配的键。我想删除与特定模式不匹配的键。
答案 0 :(得分:0)
来自docs:
h [^ e] llo匹配hallo,hlblo,...但不匹配
但是,您给出的具体示例有些棘手。这是获取所需过滤条件的方法:
=>redis-cli keys \*
1) "pre1_234"
2) "pre3_234"
3) "pre11_asv"
4) "pre2_234"
=>redis-cli keys 'pre[^1]*' | redis-cli keys 'pre?[^1]*'
1) "pre1_234"
2) "pre3_234"
3) "pre2_234"
对我来说, redis-cli键'pre [^ 1] [^ 1] '*应该已经提供了所需的输出。但这不起作用。模式匹配器在第一个[^ 1]处短路,因此pre1_234不在输出中。正则表达式的变化无穷:)
您可以在一次Redis调用中使用lua脚本进行原子删除。 See this。
答案 1 :(得分:0)
为此您需要一个lua
UDF(在下面的示例中,使用jedis作为Redis客户端),
String DELETE_SCRIPT = "local keys = redis.call('keys', '%s')" +
" for i,k in ipairs(keys) do" +
" local res = redis.call('del', k)" +
" end";
您的模式将是一个以prefix[^11]*
之类的前缀输入到方法的字符串
public void deleteOthers (String pattern) {
String luaScript = String.format(DELETE_SCRIPT, pattern);
jedis.eval(luaScript);
}
调用此方法就像
deleteOthers("prefix[^11]*");