rediscluster字段模糊匹配及删除
点关注不迷路,欢迎再访!
精简博客内容,尽量已行业术语来分享。
努力做到对每一位认可自己的读者负责。
帮助别人的同时更是丰富自己的良机。
一.原理介绍
语法:SCAN cursor [MATCH pattern] [COUNT count]
SCAN 每次执行都只会返回少量元素,所以可以用于生产环境,而不会出现像 KEYS 或者 SMEMBERS 命令带来的可能会阻塞服务器的问题。
SCAN命令是一个基于游标的迭代器。这意味着命令每次被调用都需要使用上一次这个调用返回的游标作为该次调用的游标参数,以此来延续之前的迭代过程
当SCAN命令的游标参数(即cursor)被设置为 0 时, 服务器将开始一次新的迭代, 而当服务器向用户返回值为 0 的游标时, 表示迭代已结束。
二.实现代码
protected static final Logger logger = Logger.getLogger(RemoveAllRedisCacheController.class);
public static final String SERVER_NAME = "tpaic-um_";
private JedisCluster jedisCluster;
public void setJedisCluster(JedisCluster jedisCluster) {
this.jedisCluster = jedisCluster;
}
public void getKeyMethod(HttpServletRequest request, HttpServletResponse response) throws Exception {
List<String> keyAll = new ArrayList<String>();
Map<String, String> model = new HashMap<String, String>();
try {
Map<String, JedisPool> clusterNodes = jedisCluster.getClusterNodes();
for (Map.Entry<String, JedisPool> entry : clusterNodes.entrySet()) {
Jedis jedis = entry.getValue().getResource();
//考虑主从复制,获取主节点
if (!jedis.info("replication").contains("role:slave")) {
List<String> keys = getScan(jedis,SERVER_NAME + "*");
if (keys.size() > 0) {
for (String key : keys) {
if(!keyAll.contains(key)) {
keyAll.add(key);
}
}
}
}
jedis.close();
}
for (int i = 0; i < keyAll.size(); i++) {
jedisCluster.del(keyAll.get(i));
logger.info("刷新成功:"+keyAll.get(i));
}
logger.info("缓存总数:"+keyAll.size());
} catch (Exception e) {
logger.error(e);
}
}
public List<String> getScan(Jedis redisService,String key) {
List<String> list = new ArrayList<String>();
ScanParams params = new ScanParams();
params.match(key);
params.count(1000);
String cursor = "0";
ScanResult<String> scan = redisService.scan(cursor, params);
int num = scan.getCursor();
if(num != 0) {
list.addAll(getCur(redisService, scan, params));
}
list.addAll(scan.getResult());
return list;
}
public List<String> getCur(Jedis redisService, ScanResult<String> scan, ScanParams params) {
int num = scan.getCursor();
List<String> list = new ArrayList<String>();
while(true) {
ScanResult<String> sca = redisService.scan(num, params);
list.addAll(sca.getResult());
num = sca.getCursor();
if(num == 0) {
break;
}
}
return list;
}
三.命令操作
连接:./redis-cli -c -h 节点 -p 端口 -a 密码

2214

被折叠的 条评论
为什么被折叠?



