Java基礎之年齡、姓名排序
阿新 • • 發佈:2020-12-04
最近工作中,遇到一個不太難的問題,但是一般情況下 通常,我們使用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