淺談Spring Data Redis讀不到設(shè)進(jìn)去的值
目標(biāo)
精通 Spring Data Redis 操作流程。
Spring Data提供了對(duì)市場(chǎng)上主流數(shù)據(jù)庫(kù)支持:
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)
而在使用時(shí),難免會(huì)不動(dòng)聲色的寫出一堆 bug。
1 注意讀、取一致性
當(dāng)使用 Spring Data Redis 時(shí),我們有時(shí)候會(huì)在項(xiàng)目升級(jí)的過(guò)程中,發(fā)現(xiàn)存儲(chǔ)后的數(shù)據(jù)有讀取不到的情況;另外,還會(huì)出現(xiàn)解析出錯(cuò)的情況。
案例
使用了 Redis 提供的兩種 Template:
- RedisTemplate
- stringRedisTemplate
但當(dāng)使用后者去存一個(gè)數(shù)據(jù)后,發(fā)現(xiàn)使用前者取不到對(duì)應(yīng)數(shù)據(jù):
這不很顯然嗎?是因?yàn)檫@倆 Template 不同呀!
發(fā)散一下思維,試想若我們是不同項(xiàng)目的開(kāi)發(fā)。一個(gè)項(xiàng)目只負(fù)責(zé)存儲(chǔ),另外一個(gè)項(xiàng)目只負(fù)責(zé)讀取,兩個(gè)項(xiàng)目之間缺乏溝通。如此看來(lái),這種問(wèn)題是不是就很常見(jiàn)了?
解析
我們不可能直接將數(shù)據(jù)存取到 Redis,畢竟一些數(shù)據(jù)是對(duì)象類型,例如 String或自定義對(duì)象。因此需要在存取前對(duì)數(shù)據(jù)進(jìn)行序列化或反序列化。
帶著key去存取數(shù)據(jù)時(shí),會(huì)執(zhí)行
AbstractOperations#rawKey
在執(zhí)行存儲(chǔ) K.V 到 Redis或從 Redis 讀數(shù)據(jù)前,對(duì) key 進(jìn)行序列化操作:
可見(jiàn),若存在 keySerializer,則利用它序列化 key。
對(duì)于 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); } } }
所以最后對(duì) 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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring定時(shí)任務(wù)注解@Scheduled詳解
這篇文章主要介紹了Spring定時(shí)任務(wù)注解@Scheduled詳解,@Scheduled注解是包org.springframework.scheduling.annotation中的一個(gè)注解,主要是用來(lái)開(kāi)啟定時(shí)任務(wù),本文提供了部分實(shí)現(xiàn)代碼與思路,需要的朋友可以參考下2023-09-09java、spring、springboot中整合Redis的詳細(xì)講解
這篇文章主要介紹了java、spring、springboot中整合Redis的詳細(xì)講解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04SpringBoot上傳文件并配置本地資源映射來(lái)訪問(wèn)文件的實(shí)例代碼
這篇文章主要介紹了SpringBoot上傳文件并配置本地資源映射來(lái)訪問(wèn)文件的實(shí)例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04Spring?Boot使用Hibernate-Validator校驗(yàn)參數(shù)時(shí)的長(zhǎng)度校驗(yàn)方法詳解
這篇文章主要給大家介紹了關(guān)于Spring?Boot使用Hibernate-Validator校驗(yàn)參數(shù)時(shí)的長(zhǎng)度校驗(yàn)方法的相關(guān)資料,在Spring Boot中可以使用Spring Boot Validation來(lái)對(duì)參數(shù)名稱進(jìn)行校驗(yàn),需要的朋友可以參考下2023-08-08Activiti如何啟動(dòng)流程并使流程前進(jìn)
這篇文章主要介紹了Activiti如何啟動(dòng)流程并使流程前進(jìn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03SpringBoot?@GroupSequenceProvider注解實(shí)現(xiàn)bean多屬性聯(lián)合校驗(yàn)的示例代碼
這篇文章主要介紹了SpringBoot?@GroupSequenceProvider注解實(shí)現(xiàn)bean多屬性聯(lián)合校驗(yàn),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08