在spring boot上基于maven使用redis——批量匹配并删除 (二)

一、背景

    在搭建了项目之后,由于需要通过触发动作,并删除redis中多个key。

二、思路

     在查询了jedis并没有类似的删除方法之后,事情就变得清晰起来。完成上述任务,分为两个步骤,第一,找到要删除的key;第二删除掉他们。

三、 解决方法

     从找到要删除的key来说,有两种方法,一种是通过jedis的keys方法来获得;另外一种是通过scan方法获得。

     使用keys方法,寻找包含指定参数的key,其中“*”是匹配符,要是想找前缀就在其后加*,要是找后缀就在传入参数后面加*,而要是图省事方便,前后加*即可。

 

public Set<String> queryKeys(String key) {

		Jedis jedis = jedisPool.getResource();

		StringBuilder paramKey = new StringBuilder("*").append(key).append("*");

		Set<String> keys = jedis.keys(paramKey.toString());
		return keys;

	}

 

  

 

使用scan方法,寻找包含指定参数的key,其中  第一,需要构建ScanParams(redis.clients.jedis.ScanParams);第二,主要是填充两个参数第一个是match,标明需要匹配的字符串,第二个是count标明要扫描出多少个来,我这里写的是1000,因为目前库中keys远小于1000,相当于全找出来;第三jedis中的部分scan方法是@Deprecated的不建议使用。

   在获得结果集之后,转换出来即可

public List<String> queryKeys(String key) {

		Jedis jedis = jedisPool.getResource();
		// 存入键值对
		ScanParams scanParams = new ScanParams();
		StringBuilder paramKey = new StringBuilder("*").append(key).append("*");
		scanParams.match(paramKey.toString());
		scanParams.count(1000);
		ScanResult<String> sr = jedis.scan("0", scanParams);
		List<String> a = sr.getResult();
		return a;

	}

因为,大家都知道keys的方法会阻塞单线程的redis 在keys少的时候,无所谓,但是在keys多的时候,这个就会是很大的隐患。我们采用redis 就是为了其查询速度快。所以,决定采取后者scan的方法实现

 1 public void delStrings(String key) {
 2 
 3         try {
 4             Jedis jedis = jedisPool.getResource();
 5             // 存入键值对
 6             ScanParams scanParams = new ScanParams();
 7             StringBuilder paramKey = new StringBuilder("*").append(key).append("*");
 8             scanParams.match(paramKey.toString());
 9             scanParams.count(1000);
10             ScanResult<String> sr = jedis.scan("0", scanParams);
11             List<String> a = sr.getResult();
12             for (String delkey : a) {
13                 jedis.del(delkey);
14             }
15             jedis.close();
16         } catch (Exception e) {
17             // TODO: handle exception
18         }
19     }

四 MAVEN的依赖

 

               <dependency>
			<groupId>redis.clients</groupId>
			<artifactId>jedis</artifactId>
			<version>2.9.0</version>
		</dependency>

 

五、后记

  还是写代码有意思  

  

 

 

 

ScanParams 
posted @ 2018-10-23 17:54  幻xiang  阅读(1927)  评论(0编辑  收藏  举报