淺談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 時,我們有時候會在項(xiàng)目升級的過程中,發(fā)現(xiàn)存儲后的數(shù)據(jù)有讀取不到的情況;另外,還會出現(xiàn)解析出錯的情況。
案例
使用了 Redis 提供的兩種 Template:
- RedisTemplate
- stringRedisTemplate
但當(dāng)使用后者去存一個數(shù)據(jù)后,發(fā)現(xiàn)使用前者取不到對應(yīng)數(shù)據(jù):
這不很顯然嗎?是因?yàn)檫@倆 Template 不同呀!
發(fā)散一下思維,試想若我們是不同項(xiàng)目的開發(fā)。一個項(xiàng)目只負(fù)責(zé)存儲,另外一個項(xiàng)目只負(fù)責(zé)讀取,兩個項(xiàng)目之間缺乏溝通。如此看來,這種問題是不是就很常見了?
解析
我們不可能直接將數(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)文章
java、spring、springboot中整合Redis的詳細(xì)講解
這篇文章主要介紹了java、spring、springboot中整合Redis的詳細(xì)講解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04SpringBoot上傳文件并配置本地資源映射來訪問文件的實(shí)例代碼
這篇文章主要介紹了SpringBoot上傳文件并配置本地資源映射來訪問文件的實(shí)例代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04Spring?Boot使用Hibernate-Validator校驗(yàn)參數(shù)時的長度校驗(yàn)方法詳解
這篇文章主要給大家介紹了關(guān)于Spring?Boot使用Hibernate-Validator校驗(yàn)參數(shù)時的長度校驗(yàn)方法的相關(guān)資料,在Spring Boot中可以使用Spring Boot Validation來對參數(shù)名稱進(jìn)行校驗(yàn),需要的朋友可以參考下2023-08-08SpringBoot?@GroupSequenceProvider注解實(shí)現(xiàn)bean多屬性聯(lián)合校驗(yàn)的示例代碼
這篇文章主要介紹了SpringBoot?@GroupSequenceProvider注解實(shí)現(xiàn)bean多屬性聯(lián)合校驗(yàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-08-08