淺談Spring Data Redis讀不到設(shè)進(jìn)去的值
目標(biāo)
精通 Spring Data Redis 操作流程。
Spring Data提供了對市場上主流數(shù)據(jù)庫支持:
Spring Data Commons Spring Data JPA Spring Data KeyValue Spring Data LDAP Spring Data MongoDB Spring Data Redis Spring Data REST Spring Data for Apache Cassandra Spring Data for Apache Geode Spring Data for Apache Solr Spring Data for Pivotal GemFire Spring Data Couchbase (community module) Spring Data Elasticsearch (community module) Spring Data Neo4j (community module)
而在使用時,難免會不動聲色的寫出一堆 bug。
1 注意讀、取一致性
當(dāng)使用 Spring Data Redis 時,我們有時候會在項目升級的過程中,發(fā)現(xiàn)存儲后的數(shù)據(jù)有讀取不到的情況;另外,還會出現(xiàn)解析出錯的情況。
案例

使用了 Redis 提供的兩種 Template:
- RedisTemplate
- stringRedisTemplate
但當(dāng)使用后者去存一個數(shù)據(jù)后,發(fā)現(xiàn)使用前者取不到對應(yīng)數(shù)據(jù):

這不很顯然嗎?是因為這倆 Template 不同呀!
發(fā)散一下思維,試想若我們是不同項目的開發(fā)。一個項目只負(fù)責(zé)存儲,另外一個項目只負(fù)責(zé)讀取,兩個項目之間缺乏溝通。如此看來,這種問題是不是就很常見了?
解析
我們不可能直接將數(shù)據(jù)存取到 Redis,畢竟一些數(shù)據(jù)是對象類型,例如 String或自定義對象。因此需要在存取前對數(shù)據(jù)進(jìn)行序列化或反序列化。
帶著key去存取數(shù)據(jù)時,會執(zhí)行
AbstractOperations#rawKey
在執(zhí)行存儲 K.V 到 Redis或從 Redis 讀數(shù)據(jù)前,對 key 進(jìn)行序列化操作:

可見,若存在 keySerializer,則利用它序列化 key。
對于 StringRedisSerializer,它指定的 StringRedisSerializer:
public class StringRedisSerializer implements RedisSerializer<String> {
private final Charset charset;
@Override
public byte[] serialize(@Nullable String string) {
return (string == null ? null : string.getBytes(charset));
}
}
若使用 RedisTemplate,則使用的JDK序列化:
public class JdkSerializationRedisSerializer implements RedisSerializer<Object> {
@Override
public byte[] serialize(@Nullable Object object) {
if (object == null) {
return SerializationUtils.EMPTY_ARRAY;
}
try {
return serializer.convert(object);
} catch (Exception ex) {
throw new SerializationException("Cannot serialize", ex);
}
}
}
所以最后對 K 的讀取處理,采用的JDK序列化:

反序列化結(jié)果的確不同。
那如何指定 RedisSerializer 的?
以 StringRedisSerializer 為例。StringRedisTemplate構(gòu)造器直接指定了KeySerializer為 RedisSerializer.string():

RedisSerializer.string():


修正
一定要注意一致性,例如讀寫的序列化方法需要一致:
- 檢查自己所有的數(shù)據(jù)操作,是否使用了相同的 RedisTemplate
- 即使相同,也要檢查所指定各種Serializer是否完全一致
到此這篇關(guān)于淺談Spring Data Redis讀不到設(shè)進(jìn)去的值的文章就介紹到這了,更多相關(guān)Spring Data Redis讀不到值 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringCloud Gateway網(wǎng)關(guān)功能介紹與使用
SpringCloud Gateway 是 Spring Cloud 的一個全新項目,它旨在為微服務(wù)架構(gòu)提供一種簡單有效的統(tǒng)一的 API 路由管理方式。這篇文章主要介紹了SpringCloud Gateway網(wǎng)關(guān)作用,需要的朋友可以參考下2022-12-12
java使用Runtime執(zhí)行系統(tǒng)命令遇到的問題
這篇文章主要介紹了java使用Runtime執(zhí)行系統(tǒng)命令遇到的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
Spring實戰(zhàn)之讓Bean獲取Spring容器操作示例
這篇文章主要介紹了Spring實戰(zhàn)之讓Bean獲取Spring容器操作,結(jié)合實例形式分析了Bean獲取Spring容器的相關(guān)原理、實現(xiàn)方法及操作注意事項,需要的朋友可以參考下2019-11-11
MAC?在類路徑或引導(dǎo)類路徑中找不到程序包?java.lang問題
這篇文章主要介紹了MAC?在類路徑或引導(dǎo)類路徑中找不到程序包?java.lang問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11
mybatis相同的sql查詢第二次查不出結(jié)果問題
這篇文章主要介紹了mybatis相同的sql查詢第二次查不出結(jié)果問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01

