在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 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM