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