【问题标题】:delete redis keys NOT matching a pattern using Java使用 Java 删除与模式不匹配的 redis 键
【发布时间】:2019-05-28 20:42:08
【问题描述】:

我想删除与特定模式不匹配的 redis 键。 Redis 数据长这样 -

prefix9_key1
prefix9_key2
prefix11_key1
prefix11_key2
prefix2_key1
prefix2_key2

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

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

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

【问题讨论】:

    标签: redis


    【解决方案1】:

    来自docs

    h[^e]llo 匹配 halo, hbllo, ... 但不匹配 hello

    但是,您给出的具体示例有点棘手。以下是获得所需过滤的方法:

    =>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 keys 'pre[^1][^1]'* 应该已经给出了所需的输出。但它不起作用。模式匹配器在第一个 [^1] 处短路,因此 pre1_234 不是输出的一部分。正则表达式的变幻莫测:)

    您可以在一次调用 Redis 时使用 lua 脚本进行原子删除。 See this.

    【讨论】:

      【解决方案2】:

      为此,您需要一个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]*");
      

      【讨论】:

      • 前缀[^11]* 将不起作用。见我上面的回答。 prefix[^11]* 和 prefix[^1][^1]* 都会忽略像 'prefix1_key4' 这样的键。此外,Redis 遵循 glob 样式的模式。其中,“[abc] 匹配括号中的一个字符”en.wikipedia.org/wiki/Glob_(programming)
      猜你喜欢
      • 2020-02-18
      • 1970-01-01
      • 2011-04-29
      • 2019-05-11
      • 2023-03-21
      • 2015-09-10
      • 1970-01-01
      • 1970-01-01
      • 2013-12-12
      相关资源
      最近更新 更多