亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

深入理解 Redis Template及4種序列化方式

 更新時(shí)間:2021年03月24日 14:20:11   作者:小小工匠  
這篇文章主要介紹了深入理解 Redis Template及4種序列化方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

概述

使用Spring 提供的 Spring Data Redis 操作redis 必然要使用Spring提供的模板類(lèi) RedisTemplate, 今天我們好好的看看這個(gè)模板類(lèi) 。

RedisTemplate

在這里插入圖片描述

看看4個(gè)序列化相關(guān)的屬性 ,主要是 用于 KEY 和 VALUE 的序列化 。 舉個(gè)例子,比如說(shuō)我們經(jīng)常會(huì)將POJO 對(duì)象存儲(chǔ)到 Redis 中,一般情況下會(huì)使用 JSON 方式序列化成字符串,存儲(chǔ)到 Redis 中 。

Spring提供的Redis數(shù)據(jù)結(jié)構(gòu)的操作類(lèi)

  • ValueOperations 類(lèi),提供 Redis String API 操作
  • ListOperations 類(lèi),提供 Redis List API 操作
  • SetOperations 類(lèi),提供 Redis Set API 操作
  • ZSetOperations 類(lèi),提供 Redis ZSet(Sorted Set) API 操作
  • GeoOperations 類(lèi),提供 Redis Geo API 操作
  • HyperLogLogOperations 類(lèi),提供 Redis HyperLogLog API 操作

StringRedisTemplate

再看個(gè)常用的 StringRedisTemplate

RedisTemplate<K, V> 支持泛型,StringRedisTemplate K V 均為String類(lèi)型。

org.springframework.data.redis.core.StringRedisTemplate 繼承 RedisTemplate 類(lèi),使用 org.springframework.data.redis.serializer.StringRedisSerializer 字符串序列化方式。

在這里插入圖片描述

RedisSerializer 序列化 接口

RedisSerializer接口 是 Redis 序列化接口,用于 Redis KEY 和 VALUE 的序列化

在這里插入圖片描述

RedisSerializer 接口的實(shí)現(xiàn)類(lèi) 如下

在這里插入圖片描述

歸類(lèi)一下

  • JDK 序列化方式 (默認(rèn))
  • String 序列化方式J
  • SON 序列化方式
  • XML 序列化方式

JDK 序列化方式 (默認(rèn))

org.springframework.data.redis.serializer.JdkSerializationRedisSerializer ,默認(rèn)情況下,RedisTemplate 使用該數(shù)據(jù)列化方式。

我們來(lái)看下源碼 RedisTemplate#afterPropertiesSet()

在這里插入圖片描述 

Spring Boot 自動(dòng)化配置 RedisTemplate Bean 對(duì)象時(shí),就未設(shè)置默認(rèn)的序列化方式。

絕大多數(shù)情況下,不推薦使用 JdkSerializationRedisSerializer 進(jìn)行序列化。主要是不方便人工排查數(shù)據(jù)。

我們來(lái)做個(gè)測(cè)試

在這里插入圖片描述

運(yùn)行單元測(cè)試

在這里插入圖片描述

在這里插入圖片描述

看不懂呀 ,老哥

KEY 前面帶著奇怪的 16 進(jìn)制字符 , VALUE 也是一串奇怪的 16 進(jìn)制字符 。。。。。

為什么是這樣一串奇怪的 16 進(jìn)制? ObjectOutputStream#writeString(String str, boolean unshared) 實(shí)際就是標(biāo)志位 + 字符串長(zhǎng)度 + 字符串內(nèi)容

KEY 被序列化成這樣,線上通過(guò) KEY 去查詢對(duì)應(yīng)的 VALUE非常不方便,所以 KEY 肯定是不能被這樣序列化的。

VALUE 被序列化成這樣,除了閱讀可能困難一點(diǎn),不支持跨語(yǔ)言外,實(shí)際上也沒(méi)還OK。不過(guò),實(shí)際線上場(chǎng)景,還是使用 JSON 序列化居多。

String 序列化方式

org.springframework.data.redis.serializer.StringRedisSerializer ,字符串和二進(jìn)制數(shù)組的直接轉(zhuǎn)換

在這里插入圖片描述

絕大多數(shù)情況下,我們 KEY 和 VALUE 都會(huì)使用這種序列化方案。

JSON 序列化方式

org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer 使用 Jackson 實(shí)現(xiàn) JSON 的序列化方式,并且從 Generic 單詞可以看出,是支持所有類(lèi)。

public GenericJackson2JsonRedisSerializer(@Nullable String classPropertyTypeName) {

			.....
			..... 
		if (StringUtils.hasText(classPropertyTypeName)) {
			mapper.enableDefaultTypingAsProperty(DefaultTyping.NON_FINAL, classPropertyTypeName);
		} else {
			mapper.enableDefaultTyping(DefaultTyping.NON_FINAL, As.PROPERTY);
		}
	}

classPropertyTypeName 不為空的話,使用傳入對(duì)象的 classPropertyTypeName 屬性對(duì)應(yīng)的值,作為默認(rèn)類(lèi)型(Default Typing) ,否則使用傳入對(duì)象的類(lèi)全名,作為默認(rèn)類(lèi)型(Default Typing)。

我們來(lái)思考下,在將一個(gè)對(duì)象序列化成一個(gè)字符串,怎么保證字符串反序列化成對(duì)象的類(lèi)型呢?Jackson 通過(guò) Default Typing ,會(huì)在字符串多冗余一個(gè)類(lèi)型,這樣反序列化就知道具體的類(lèi)型了

在這里插入圖片描述

先說(shuō)個(gè)結(jié)論

標(biāo)準(zhǔn)JSON

{
 "id": 100,
 "name": "小工匠",
 "sex": "Male"
}

使用 Jackson Default Typing 機(jī)制序列化

{
 "@class": "com.artisan.domain.Artisan",
 "id": 100,
 "name": "小工匠",
 "sex": "Male"
}

示例

測(cè)試一把

【配置類(lèi)】

 @Bean
 public RedisTemplate<String, Object> redisTemplate() {
  // 創(chuàng)建 RedisTemplate 對(duì)象
  RedisTemplate<String, Object> template = new RedisTemplate<>();

  // 設(shè)置 RedisConnection 工廠。 它就是實(shí)現(xiàn)多種 Java Redis 客戶端接入的秘密工廠
  template.setConnectionFactory(connectionFactory);

  // 使用 String 序列化方式,序列化 KEY 。
  template.setKeySerializer(RedisSerializer.string());

  // 使用 JSON 序列化方式(庫(kù)是 Jackson ),序列化 VALUE 。
  template.setValueSerializer(RedisSerializer.json());

  return template;
 }

【單元測(cè)試】

 @Test
 public void testJacksonSerializer() {
  Artisan artisan = new Artisan();
  artisan.setName("小工匠");
  artisan.setId(100);
  artisan.setSex("Male");
  // set
  redisTemplate.opsForValue().set("artisan", artisan);
 }

【結(jié)果】

在這里插入圖片描述

是不是多了@class 屬性,反序列化的對(duì)象的類(lèi)型就可以從這里獲取到。

@class 屬性看似完美解決了反序列化后的對(duì)象類(lèi)型,但是帶來(lái) JSON 字符串占用變大,所以實(shí)際項(xiàng)目中,我們很少采用 Jackson2JsonRedisSerializer

XML 序列化方式

org.springframework.data.redis.serializer.OxmSerializer使用 Spring OXM 實(shí)現(xiàn)將對(duì)象和 String 的轉(zhuǎn)換,從而 String 和二進(jìn)制數(shù)組的轉(zhuǎn)換。 沒(méi)見(jiàn)過(guò)哪個(gè)項(xiàng)目用過(guò),不啰嗦了

到此這篇關(guān)于深入理解 Redis Template及4種序列化方式的文章就介紹到這了,更多相關(guān)Redis Template序列化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • redis反序列化報(bào)錯(cuò)原因分析以及解決方案

    redis反序列化報(bào)錯(cuò)原因分析以及解決方案

    這篇文章主要介紹了redis反序列化報(bào)錯(cuò)原因分析以及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Redis批量刪除指定前綴的Key兩種方法

    Redis批量刪除指定前綴的Key兩種方法

    redis作為緩存服務(wù)器在項(xiàng)目中經(jīng)常使用,使用redis存儲(chǔ)數(shù)據(jù)時(shí),我們經(jīng)常會(huì)將key分組,這篇文章主要給大家介紹了關(guān)于Redis批量刪除指定前綴的Key兩種方法,需要的朋友可以參考下
    2024-01-01
  • redis數(shù)據(jù)的兩種持久化方式對(duì)比

    redis數(shù)據(jù)的兩種持久化方式對(duì)比

    Redis是我們開(kāi)發(fā)中常用的數(shù)據(jù)庫(kù),今天和大家分享的就是redis持久化的2種方式:RDB(Redis DataBase)和AOF(Apend Only File),希望對(duì)大家學(xué)習(xí)redis有幫助,一起來(lái)看看吧。
    2017-08-08
  • Redis 命令的詳解及簡(jiǎn)單實(shí)例

    Redis 命令的詳解及簡(jiǎn)單實(shí)例

    這篇文章主要介紹了Redis 命令的詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,這里提供基礎(chǔ)語(yǔ)法及使用實(shí)例,需要的朋友可以參考下
    2017-08-08
  • Redis中Zset類(lèi)型常用命令的實(shí)現(xiàn)

    Redis中Zset類(lèi)型常用命令的實(shí)現(xiàn)

    Zset是Redis的一種有序集合數(shù)據(jù)類(lèi)型,Zset通過(guò)壓縮列表和跳躍表兩種底層編碼方式支持小數(shù)據(jù)集和大數(shù)據(jù)集,支持多種操作,包括添加、查詢、刪除元素以及集合運(yùn)算等,具有不同的時(shí)間復(fù)雜度,感興趣的可以了解一下
    2024-10-10
  • Python利用redis限制用戶重復(fù)刷新帶來(lái)的數(shù)據(jù)問(wèn)題

    Python利用redis限制用戶重復(fù)刷新帶來(lái)的數(shù)據(jù)問(wèn)題

    在網(wǎng)站開(kāi)發(fā)中,我們經(jīng)常會(huì)遇到需要控制用戶重復(fù)刷新頁(yè)面的情況,本文就來(lái)介紹了Python利用redis限制用戶重復(fù)刷新帶來(lái)的數(shù)據(jù)問(wèn)題,感興趣的可以了解一下
    2024-03-03
  • 關(guān)于Redis解決Session共享問(wèn)題

    關(guān)于Redis解決Session共享問(wèn)題

    這篇文章主要介紹了Redis解決Session共享問(wèn)題,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • Redis分析慢查詢操作的實(shí)例教程

    Redis分析慢查詢操作的實(shí)例教程

    這篇文章主要給大家介紹了關(guān)于Redis如何分析慢查詢操作的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • 詳解如何利用Redis實(shí)現(xiàn)生成唯一ID

    詳解如何利用Redis實(shí)現(xiàn)生成唯一ID

    隨著下單流量逐漸上升,為了降低數(shù)據(jù)庫(kù)的訪問(wèn)壓力,需要通過(guò)請(qǐng)求唯一ID+redis分布式鎖來(lái)防止接口重復(fù)提交。今天我們就一起來(lái)看探討一下,如何通過(guò)服務(wù)端來(lái)完成請(qǐng)求唯一?ID?的生成
    2022-11-11
  • 基于Redis緩存數(shù)據(jù)常見(jiàn)的三種問(wèn)題及解決

    基于Redis緩存數(shù)據(jù)常見(jiàn)的三種問(wèn)題及解決

    這篇文章主要介紹了基于Redis緩存數(shù)據(jù)常見(jiàn)的三種問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06

最新評(píng)論