使用Java删除与模式不匹配的Redis键

时间:2019-01-02 06:45:38

标签: redis

我想删除与特定模式不匹配的Redis键。 Redis数据看起来像这样-

prefix9_key1
prefix9_key2
prefix11_key1
prefix11_key2
prefix2_key1
prefix2_key2

这些前缀值是随机生成的数字(例如1123、3422、9879)。

我知道我当前的前缀是什么(假设它是prefix11)。但是没有办法知道之前使用的前缀是什么。我想删除所有不使用当前前缀值的键(prefix2 *和prefix9 *)。

我读了很多帖子,提到删除与模式匹配的键。我想删除与特定模式不匹配的键。

2 个答案:

答案 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]*");