一、背景
在搭建了項目之后,由於需要通過觸發動作,並刪除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