如何通过Java代码批量删除指定前缀的Redis键值对
为了通过java代码删除远端redis指定前缀的key的键值对,下面提供keys和scan两种方法的代码。
scan命令允许使用游标从keyspace中检索键。对比keys命令,scan虽然无法一次性返回所有匹配结果,但却规避了阻塞系统这个高风险,从而也让一些操作可以放在主节点上执行。如果你的redis版本允许使用scan,请使用scan。
/** * 删除指定前缀的key */ @Test public void testSetDel() { Jedis jedis = new Jedis("redis主机ip", 端口号); jedis.auth("密码"); try { String givenKey = "KEY_*";//想要删除的制定前缀的key // logger.info("开始使用 scan 查询数据 ------------ "); // this.getByScan(givenKey, jedis); // logger.info("开始使用 scan 删除数据 ------------ "); // this.delSetValues(givenKey, jedis); logger.info("开始使用 keys 删除数据 ------------ "); this.delValuesByKeys(givenKey, jedis); Set<String> keys = jedis.keys(givenKey); logger.info("**********是否存在相同前缀的key,result:{}", !CollectionUtils.isEmpty(keys)); } catch (Exception e) { logger.error("删除指定前缀的key对应的键值失败 "); e.printStackTrace(); } finally { if (jedis != null) { logger.info("关闭jedis连接"); jedis.close(); } } }
/** * java redis 通过keys删除指定前缀的key对应的键值对 * * @param givenKey * @return */ private Boolean delValuesByKeys(String givenKey, Jedis jedis) throws Exception { logger.info("开始模糊删除set中的数据,givenKey = " + givenKey); Set<String> keys = jedis.keys(givenKey); logger.info("共" + keys.size() + "条数据"); keys.stream().forEach(s -> { logger.info("当前 key 是 :" + s); jedis.del(s); }); return true; }
/** * java redis 通过scan删除指定前缀的key对应的键值对 * * @param givenKey * @return */ private Boolean delSetValues(String givenKey, Jedis jedis) throws Exception { logger.info("开始模糊删除set中的数据,givenKey = " + givenKey); List<String> keys = getByScan(givenKey, jedis); logger.info("即将删除" + keys.size() + "条key,详情是 " + keys); String[] array = keys.toArray(new String[0]); jedis.del(array); return true; } // 使用 scan查询,但是要看远程redis是否支持这个命令 private List<String> getByScan(String key, Jedis jedis) { List<String> list = new ArrayList<>(); ScanParams params = new ScanParams(); params.match(key); params.count(100); String cursor = "0"; while (true) { ScanResult scanResult = jedis.scan(cursor, params); List<String> eles = scanResult.getResult(); if (!CollectionUtils.isEmpty(eles)) { list.addAll(eles); } cursor = scanResult.getStringCursor(); if ("0".equals(cursor)) { break; } } logger.info(" getByScan 查到的数据集是共" + list.size() + "条,详情: ============ " + list); return list; }