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