1. 程式人生 > 實用技巧 >Java基礎之年齡、姓名排序

Java基礎之年齡、姓名排序

最近工作中,遇到一個不太難的問題,但是一般情況下 通常,我們使用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