Redis 通過key前綴獲取所有匹配的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

 


免責聲明!

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



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