rediscluster字段模糊匹配及删除

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 密码
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值