1. 程式人生 > 資料庫 >Redis 獲取匹配的所有的key

Redis 獲取匹配的所有的key

最近工作中,遇到一個不太難的問題,但是一般情況下 通常,我們使用redis要求的都是key不能相同,但是這次的問題是 值相等的key  不能存在多個。解決的時候,看到redis可以寫正則表示式獲取匹配的key,所有給自己沒有規律的key,加了一個字首,畢竟一個系統 ,快取的資料還是很多的,避免拿到別人的key。接下來,我們來看看程式碼怎麼寫的。

首先寫了一個測試用例,測試自己寫的正則能匹配到值。

import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 * @ClassName: RegexMatches
 * @Description: 測試正則表示式無誤   但是redis  不需要加一點 ‘.’
 * @Author youli
 * @date 2020年12月7日
 */
public class RegexMatches {

    public static void main(String args[]) {
        String str = "card_key51e5f269-aef9-446a-8c86-2f19cae2bc";
        String pattern = "card_key.*";
        
        Pattern r = Pattern.compile(pattern);
        Matcher m = r.matcher(str);
        System.out.println(m.matches());
    }

}

 

 測試返回正確,就說明能匹配。然後我們看下redis裡邊的寫法

public void getRedis(String cardId) {
        // 獲取所有的key
        Set<String> keys = redisTemplate.keys("card_key.*");
        for (String key : keys) {
            // 獲取key對應值
            Object value = redisTemplate.opsForValue().get(key);
            if (value.equals(cardId)) {
                redisTemplate.delete(key);
            }
        }
    }

這麼寫之後,我看正則沒問題,也就沒測試了,後來上伺服器一看,嘛呀,還是那麼多。於是乎,趕緊測試了下,發現

public void getRedis(String cardId) {
        // 獲取所有的key
        Set<String> keys = redisTemplate.keys("card_key*");
        for (String key : keys) {
            // 獲取key對應值
            Object value = redisTemplate.opsForValue().get(key);
            if (value.equals(cardId)) {
                redisTemplate.delete(key);
            }
        }
    }

看到區別沒,就是不要那一點,也就是說這裡直接寫匹配以什麼開頭的就行了,結尾不管有多少個,用"*"代替就好。

看看redis連結客戶端

 

 

 

 兩個不同的key,但是相同的值。

執行後的結果

 

 結果相同的key就只有一個了。

程式碼除錯可以看到獲取的key