一、背景
在搭建了项目之后,由于需要通过触发动作,并删除redis中多个key。
二、思路
在查询了jedis并没有类似的删除方法之后,事情就变得清晰起来。完成上述任务,分为两个步骤,第一,找到要删除的key;第二删除掉他们。
三、 解决方法
从找到要删除的key来说,有两种方法,一种是通过jedis的keys方法来获得;另外一种是通过scan方法获得。
使用keys方法,寻找包含指定参数的key,其中“*”是匹配符,要是想找前缀就在其后加*,要是找后缀就在传入参数后面加*,而要是图省事方便,前后加*即可。
public SetqueryKeys(String key) { Jedis jedis = jedisPool.getResource(); StringBuilder paramKey = new StringBuilder("*").append(key).append("*"); Set keys = jedis.keys(paramKey.toString()); return keys; }
使用scan方法,寻找包含指定参数的key,其中 第一,需要构建ScanParams(redis.clients.jedis.ScanParams);第二,主要是填充两个参数第一个是match,标明需要匹配的字符串,第二个是count标明要扫描出多少个来,我这里写的是1000,因为目前库中keys远小于1000,相当于全找出来;第三jedis中的部分scan方法是@Deprecated的不建议使用。
在获得结果集之后,转换出来即可
public ListqueryKeys(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 sr = jedis.scan("0", scanParams); List 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 ScanResultsr = jedis.scan("0", scanParams);11 List a = sr.getResult();12 for (String delkey : a) {13 jedis.del(delkey);14 }15 jedis.close();16 } catch (Exception e) {17 // TODO: handle exception18 }19 }
四 MAVEN的依赖
redis.clients jedis 2.9.0
五、后记
还是写代码有意思
ScanParams