RedisTemplate的key預設序列化器問題

2021-08-20 20:19:20 字數 2005 閱讀 4462

redis的客戶端換成了spring-boot-starter-data-redis,碰到了乙個奇怪的問題,

在同乙個方法中

1.先hset,再hget,正常獲得資料。

在不同的方法中 先hset,再hget獲取不到資料,通過redis的monitor監控發現了命令的問題:

實際我的key為jk_hash:csrk,hashkey為user,但是根據上圖所示,實際執行的命令多了好多其他字元,這是什麼原因呢?

在伺服器端先確認發現實際有這個hash,通過hset可以得到正確的資料,所以第一次執行hset的時候命令是正常的,問題可能出現在hget上面,先開啟原始碼看一下

@suppresswarnings("unchecked")

public hv get(k key, object hashkey)

}, true);

return (hv) deserializehashvalue(rawhashvalue);

}

從這裡可以看到實際上傳給redis的都是byte資料,而byte陣列是rawkey和rawhashkey生成的,先看下rawkey方法

@suppresswarnings("unchecked")

byte rawkey(object key)

return keyserializer().serialize(key);

}

然後進一步跟蹤keyserializer()方法

redisserializer keyserializer()
public redisserializer> getkeyserializer()
最後跟蹤到是redistemplate中的屬性keyserializer導致的,而通過列印keyserializer的class發現 預設使用的是org.springframework.data.redis.serializer.jdkserializationredisserializer,但它是如何進行初始化的呢,預設的建構函式中並沒有對該屬性進行初始化。

根據redistemplate的類關係發現它是繼承redisaccessor的,而此類是實現的org.springframework.beans.factory.initializingbean介面,這個介面有個特性,凡是繼承該介面的類,在初始化bean的時候會執行afterpropertiesset方法。

而afterpropertiesset方法中,確實對keyserializer進行了初始化:

public void afterpropertiesset()

if (enabledefaultserializer)

if (valueserializer == null)

if (hashkeyserializer == null)

if (hashvalueserializer == null)

}if (enabledefaultserializer && defaultused)

if (scriptexecutor == null)

initialized = true;

}在這裡可以看到預設使用的正是org.springframework.data.redis.serializer.jdkserializationredisserializer,而問題正在這裡,通過查詢可以發現序列化器有這些,而在這裡我們需要使用的是stringredisserializer

加入如下**:

@autowired(required = false)

public void setredistemplate(redistemplate redistemplate)

重新進行測試,方法1hset,方法2hget,方法2能拿到正確的資料,完畢。

RedisTemplate操作Redis常用

redistemplate中定義了對5種資料結構操作 redistemplate.opsforvalue 操作字串 redistemplate.opsforhash 操作hash redistemplate.opsforlist 操作list redistemplate.opsforset 操作se...

RedisTemplate模板的使用(二)

在redistemplate中提供了幾個常用的介面方法的使用,分別是 private valueoperationsvalueops private listoperationslistops private setoperationssetops private zsetoperationszse...

使用RedisTemplate時set的key亂碼

在使用redistemplate時,程式get set key都沒有問題 但是在redis client 查詢該key時 總是查不到 最後發現是該key亂碼了導致查詢不到 解決方法 bean public redistemplateredistemplate redisconnectionfacto...