在spring boot上基于maven使用redis——批量匹配并删除
Posted 幻xiang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在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
以上是关于在spring boot上基于maven使用redis——批量匹配并删除 的主要内容,如果未能解决你的问题,请参考以下文章
Springbootspring-boot-starter-redis包报错 :unknown
如何将基于 java 的注释 maven 项目转换为 Spring Boot?