RedisTemplate操作Redis詳解之連接Redis及自定義序列化

連接到Redis


使用Redis和Spring時的首要任務之一是通過IoC容器連接到Redis。為此,需要java連接器(或綁定)。無論選擇哪種庫,你都只需要使用一組Spring Data Redis API(在所有連接器中行為一致):org.springframework.data.redis.connection軟件包及其RedisConnection與RedisConnectionFactory接口,用于處理和檢索與Redis的活動連接。

RedisConnection和RedisConnectionFactory

RedisConnection提供了Redis通信和核心構建塊,因為它處理與Redis后端的通信。它還會自動將基礎鏈接庫異常轉換為Spring一致的DAO異常層次結構,以便您可以在不更改任何代碼的情況下切換連接器,因為操作語義保持不變。

當按照上篇文檔配置好Redis后,IOC會加載ConnectionFactory,我們可以直接注入,然后創建連接操作Redis。

RedisConnection提供了Redis 各大數據類型的操作API:

public interface RedisConnection extends RedisCommands, AutoCloseable {default RedisGeoCommands geoCommands() {return this;}default RedisHashCommands hashCommands() {return this;}default RedisHyperLogLogCommands hyperLogLogCommands() {return this;}default RedisKeyCommands keyCommands() {return this;}default RedisListCommands listCommands() {return this;}default RedisSetCommands setCommands() {return this;}default RedisScriptingCommands scriptingCommands() {return this;}default RedisServerCommands serverCommands() {return this;}default RedisStreamCommands streamCommands() {return this;}default RedisStringCommands stringCommands() {return this;}default RedisZSetCommands zSetCommands() {return this;}
}
    @AutowiredLettuceConnectionFactory lettuceConnectionFactory;@Testvoid lettuceConnectionFactoryTest() {RedisConnection connection = lettuceConnectionFactory.getConnection();Boolean result = connection.set("k".getBytes(), "1".getBytes());System.err.println(result);byte[] bytes = connection.get("k".getBytes());assert bytes != null;System.err.println("k:" + new String(bytes));}

RedisTemplate簡介

大多數用戶可能會使用RedisTemplate及其相應的軟件包org.springframework.data.redis.core。實際上,由于模版具有豐富的功能集,因此它是Redis模塊的中心類。該模板為Redis交互提供了高級抽象,雖然RedisConnection提供了接受和返回二進制值(byte數組)的低級方法,但是模板負責序列化和連接管理,使用戶無需處理此類細節。

此外,該模板提供了操作視圖(根據Redis命令參考進行分組),提供了豐富的,通用的接口,用于針對某種類型或某些鍵(通過keyBound接口),如下表所述:

界面?描述
按鍵類型操作
GeoOperationsRedis的地理空間操作的,比如GEOADD,GEORADIUS...
HashOperationsRedis哈希操作
HyperLogLogOperationsRedis的HyperLogLog操作,例如PFADD,PFCONT,...
ListOperationsRedis列表操作
SetOperationsRedis設置操作
ValueOperationsRedis字符串(或值)操作
ZSetOperationsRedis zset(或排序集)操作
關鍵綁定操作
BoundGeoOperationsRedis鍵綁定地理空間操作
BoundHashOperationsRedis哈希鍵綁定操作
BoundKeyOperationsRedis按鍵綁定操作
BoundListOperationsRedis列表鍵綁定操作
BoundSetOperations

Redis設置鍵綁定操作

BoundValueOperationsRedis字符串(或值)鍵綁定操作
BoundZSetOperationsRedis zset(或排序集)鍵綁定操作

序列化器

自帶序列化器

RedisTemplate大多數操作都使用基于Java的序列化器。這意味著模板編寫或讀取的任何對象都將通過Java進行序列化和反序列化。你可以在模板上更改序列化機制,Redis模塊提供了幾種實現,可在org.springframework.data.redis.serializer軟件包中找到,您還可以將任何序列化器設置為null,并通過將enableDefaultSerializer屬性設置為來將RedisTemplate與原始字節數組一起使用False。請注意,模板要求所有鍵都不為空。但是,只要基礎串行器接受這些值,它們就可以為空。

從框架的角度來看,Redis中存儲的數據僅為字節。盡管Redis本身支持各種類型,但在大多數情況下,它們是指數據的存儲方式而不是數據的表示方式。由用戶決定是否將信息轉換為字符串或任何其他對象。

在Spring Data中,用戶(自定義)類型和原始數據之間的轉換(反之亦然)在org.springframework.data.redis.serializer包中的Redis中進行處理。

該軟件包包含兩種類型的序列化器,它們負責序列化過程:

  • 基于的兩路串行器RedisSerializer。
  • 使用RedisElementReader和的元素讀取器和寫入器RedisElementWriter。

框架自帶各種序列化器:

名稱說明
OxmSerializer通過Spring OXM支持將其用于對象/XML映射
ByteArrayRedisSerializerByte數組序列化
GenericJackson2JsonRedisSerializer以JSON格式去存儲數據,會保存序列化的對象的包名和類名,反序列化時以這個作為標示就可以反序列化成指定的對象。效率低,占用內存高
GenericToStringSerializer可以將任何對象泛化為字符串并序列化
StringRedisSerializer簡單的字符串序列化
JdkSerializationRedisSerializerJDK序列化,默認用于RedisCache和RedisTemplate
Jackson2JsonRedisSerializer以JSON格式去存儲數據,需要指明序列化的類Class,可以使用Object.class
自定義序列化器

RedisTemplate默認使用JDK序列化,可以使用自帶其他的序列化,或者自己實現第三方序列化方式,比如:

  • google:Protobuf
  • faceBook:Thrift
  • kryo
  • hessian
  • fst
  • Jackson
  • Gson
  • FastJson
Protobuf序列化

ProtoBuf(Google Protocol Buffer)是由Google公司用于數據交換的序列結構化數據格式,具有跨平臺、跨語言、可擴展特性,類型于常用的XML及JSON,但具有更小的傳輸體積、更高的編碼、編碼能力,特別適合于數據存儲、網絡數據傳輸等對存儲體積、實時性要求高的領域。

優點:性能好,效率高。支持向后兼容和向前兼容。支持多種編程語言(Java,C++,python);

缺點:二進制格式導致可讀性差(二進制格式)

RedisTemplate使用Protobuf

1、添加POM;

  <dependency><groupId>io.protostuff</groupId><artifactId>protostuff-runtime</artifactId><version>1.7.4</version></dependency><dependency><groupId>io.protostuff</groupId><artifactId>protostuff-core</artifactId><version>1.7.4</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>

1、?實現RedisSerializer接口;

@Slf4j
public class ProtoStuffRedisSerializer<T> implements RedisSerializer<T> {// RuntimeSchema是一個包含業務對象所有信息的類,包括類信息、字段信息private static final Schema<ProtoStuffWrapper> schema = RuntimeSchema.getSchema(ProtoStuffWrapper.class);/*** 序列化:對象=》字節數組** @param t 需要序列化的對象t* @return 二進制* @throws SerializationException 序列化異常*/@Overridepublic byte[] serialize(T t) throws SerializationException {if (t == null) {return null;}// 開辟了512字節緩存,用來存放業務對象序列化之后存放的地方,如果空間不足,會自動擴展擴展LinkedBuffer buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE);byte[] bytes;try {// 序列化bytes = ProtostuffIOUtil.toByteArray(new ProtoStuffWrapper<>(t), schema, buffer);} finally {buffer.clear();}return bytes;}/*** 反序列化 字節數組=》對象** @param bytes 字節數組* @return 對象* @throws SerializationException 序列化異常*/@Overridepublic T deserialize(byte[] bytes) throws SerializationException {if (bytes == null || bytes.length == 0) {return null;}try {ProtoStuffWrapper<T> protoStuffWrapper = new ProtoStuffWrapper<>();// 反序列ProtostuffIOUtil.mergeFrom(bytes, protoStuffWrapper, schema);return protoStuffWrapper.getT();} catch (Exception e) {throw new RuntimeException(e);}}/*** 序列化包裝類,深度克隆,避免無法獲取schema** @param <T> 業務對象*/public static class ProtoStuffWrapper<T> implements Cloneable {private T t;ProtoStuffWrapper() {}ProtoStuffWrapper(T t) {this.t = t;}public T getT() {return t;}public void setT(T t) {this.t = t;}@Override@SuppressWarnings("unchecked")public ProtoStuffWrapper<T> clone() {try {return (ProtoStuffWrapper<T>) super.clone();} catch (CloneNotSupportedException e) {return new ProtoStuffWrapper<T>();}}}
}

1、?創建RedisTemplate,設置序列化;

 /*** 創建RedisTemplate** @param redisConnectionFactory 連接工廠* @param <T>                    值類型* @return RedisTemplate*/@Bean(name = "redisTemplate")public <T> RedisTemplate<String, T> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<String, T> redisTemplate = new RedisTemplate<>();// 設置連接工廠redisTemplate.setConnectionFactory(redisConnectionFactory);// String序列化對象RedisSerializer<String> stringRedisSerializer = RedisSerializer.string();// ProtoStuff序列化ProtoStuffRedisSerializer<T> protoStuffRedisSerializer = new ProtoStuffRedisSerializer<>();// 序列化配置=>KeyredisTemplate.setKeySerializer(stringRedisSerializer); // 所有Key都設置為字符串,方便閱讀redisTemplate.setHashKeySerializer(protoStuffRedisSerializer); //  設置Hash數據結構中的Key// 序列化配置=>ValueredisTemplate.setValueSerializer(protoStuffRedisSerializer); // 所有ValueredisTemplate.setHashValueSerializer(protoStuffRedisSerializer);  //  Hash數據結構中的ValueredisTemplate.afterPropertiesSet();return redisTemplate;}

1、?添加測試實體類;

@ToString
@Data
public class User {String userName;String password;int age;
}

1、?添加測試類測試;

@Testvoid protoStuffTest() {User user = new User();user.setAge(20);user.setUserName("韓梅梅");user.setPassword("123456");redisTemplate.boundValueOps("k").set(user);User user1 = redisTemplate.boundValueOps("k").get();redisTemplate.boundHashOps("hash").putIfAbsent("kkk","vvv");System.err.println(user1.toString());}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/12253.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/12253.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/12253.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

面對.halo勒索病毒,如何有效防范與應對?

導言&#xff1a; 隨著網絡技術的不斷發展&#xff0c;網絡安全問題也日益凸顯。其中&#xff0c;勒索病毒作為一種極具破壞性的網絡攻擊手段&#xff0c;近年來在全球范圍內頻發。其中&#xff0c;.halo勒索病毒作為勒索病毒家族中的一員&#xff0c;其危害性和傳播性不容忽視…

StNet: Local and Global Spatial-Temporal Modeling for Action Recognition 論文閱讀

StNet: Local and Global Spatial-Temporal Modeling for Action Recognition 論文閱讀 Abstract1 Introduction2 Related Work3 Proposed Approach4 Experiments5 Conclusion 文章信息&#xff1a; 原文鏈接&#xff1a;https://ojs.aaai.org/index.php/AAAI/article/view/4…

Flutter 中的 Spacer 小部件:全面指南

Flutter 中的 Spacer 小部件&#xff1a;全面指南 在Flutter布局系統中&#xff0c;Spacer是一個Flex組件&#xff0c;用于占據可用空間&#xff0c;從而推動其他Widget到布局的開始或結束位置。Spacer通常與Row、Column或Flex一起使用&#xff0c;以實現靈活的布局設計。本文…

二叉樹專題(有關二叉樹的相關學習)

二叉樹 1.數概念及結構 1.1樹的結構 樹是一種非線性的數據結構&#xff0c;它是由n&#xff08;n>0&#xff09;個有限結點組成一個具有層次關系的集合。把它叫做樹是因 為它看起來像一棵倒掛的樹&#xff0c;也就是說它是根朝上&#xff0c;而葉朝下的。 有一個特殊的結…

ollama離線部署llama3(window系統)

首先介紹下ollama是什么&#xff1f;Ollama是一個開源的大型語言模型服務工具&#xff0c;旨在為用戶提供本地化的運行環境&#xff0c;滿足個性化的需求。具體來說&#xff0c;Ollama是一個功能強大的開源框架&#xff0c;可以簡化在Docker容器中部署和管理大型語言模型&a…

【C++】內聯函數、auto、范圍for

文章目錄 1.內聯函數2.auto關鍵字2.1auto簡介2.2auto的注意事項2.3auto不能推導的場景 3.基于范圍的for循環(C11)4.指針空值nullptr(C11) 1.內聯函數 概念&#xff1a; 以inline修飾的函數叫做內聯函數&#xff0c;編譯時C編譯器會在調用內聯函數的地方展開&#xff0c;沒有函…

商場綜合體能源監管平臺,實現能源高效管理

商場作為大型綜合體建筑&#xff0c;其能源消耗一直是備受關注的問題。為了有效管理商場能耗&#xff0c;提高商場能源效率&#xff0c;商場綜合體能源監管平臺應運而生。 商場綜合體能源監管平臺可通過軟硬件一起進行節能監管&#xff0c;硬件設備包括各種傳感器、監測儀表和…

Matter 1.3版標準新出爐,支持更多智能家居/家電/能源等設備

5月8日&#xff0c;CSA連接標準聯盟正式發布了Matter 1.3標準&#xff0c;過去CSA一直保持約每六個月一次的標準更新節奏。 圖源CSA連接標準聯盟官方 獲得一系列改進的Matter 1.3標準&#xff0c;將提升設備的互操作性&#xff0c;擴展支持的設備類別&#xff0c;并增強整個智…

Android 幾種系統升級方式詳解

目錄 ◆ 概述 ● 幾種啟動模式 ● MISC分區 ● CACHE分區 ● 幾種系統升級方式 ◆ Recovery升級 ● 升級包構成&#xff0c;簽名&#xff0c;制作 ● 升級腳本 ● 升級過程 ◆ OTA升級 ● 升級包構成&#xff0c;制作 ● 升級腳本 ● 升級過程 ◆ fastboot升級 ◆ ADB升級 幾…

【研發日記】Matlab/Simulink技能解鎖(七)——兩種復數移相算法

復數移相&#xff0c;也稱為復數相位旋轉&#xff0c;就是在原有復數的基礎上&#xff0c;不改變模數&#xff0c;只把相位角做一定的偏移。 文章目錄 前言 三角函數移相 復數乘法移相 分析和應用 總結 前言 見《【研發日記】Matlab/Simulink技能解鎖(二)——在Function編…

(三)Spring教程——依賴注入與控制反轉

Spring框架是為了簡化企業級應用開發而創建的&#xff0c;其強大之處在于對Java SE和Java EE開發進行全方位的簡化&#xff0c;Spring還對常用的功能進行封裝&#xff0c;可以極大地提高Java EE的開發效率。 依賴注入是Spring的核心技術之一&#xff0c;也被稱為“控制反轉”&a…

【Linux】自動化編譯工具——make/makefile(超細圖例詳解!!)

目錄 一、前言 二、make / Makefile背景介紹 &#x1f95d;Makefile是干什么的&#xff1f; &#x1f347;make又是什么&#xff1f; 三、demo實現【見見豬跑&#x1f416;】 四、依賴關系與依賴方法 1、概念理清 2、感性理解【父與子&#x1f468;】 3、深層理解【程序…

【JavaEE】HTTP 協議

文章目錄 一、HTTP 協議1、HTTP 是什么2、理解 "應用層協議"3、理解 HTTP 協議的工作過程4、HTTP 協議格式5、HTTP 請求 (Request)5.1 認識 URL 6、 二、HTTPS1、HTTPS是什么2、"加密" 是什么3、HTTPS 的工作過程3.1 對稱加密3.2 非對稱加密3.3 證書3.4 完…

零樣本身份保持:ID-Animator引領個性化視頻生成技術新前沿

在最新的研究進展中&#xff0c;由Xuanhua He及其團隊提出的ID-Animator技術&#xff0c;為個性化視頻生成領域帶來了突破性的創新。這項技術的核心在于其零樣本&#xff08;zero-shot&#xff09;人物視頻生成方法&#xff0c;它允許研究者和開發者根據單一的參考面部圖像生成…

深度解刨性能測試工具Locust

&#x1f345; 視頻學習&#xff1a;文末有免費的配套視頻可觀看 &#x1f345; 關注公眾號【互聯網雜貨鋪】&#xff0c;回復 1 &#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 Locust安裝 …

Python3 筆記:range() 函數

range() 函數返回數字序列&#xff0c;默認從 0 開始&#xff0c;默認以 1 遞增&#xff0c;并以指定的數字結束。 它的語法格式&#xff1a;range(start,end,step) start是起始值&#xff0c;end是終止值&#xff0c;step是間隔值 上述語句可以產生一個[start,…, end-1]列…

gin框架學習筆記(三) ——路由請求與相關參數

參數種類與參數處理 查詢參數 在講解查詢參數的定義之前&#xff0c;我們先來看一個例子&#xff0c;當我打開了CSDN&#xff0c;我現在想查看我的博客瀏覽量&#xff0c;那么我就需要點擊我的頭像來打開我的個人主頁,像下面這樣: 我們現在把瀏覽器的網址取下來&#xff0c;…

【35分鐘掌握金融風控策略27】貸中風控策略與客戶運營體系

目錄 貸中風控策略與客戶運營體系 貸中風控日標 貸中風控數據源 貸中風控策略與客戶運營體系 貸中是風控的第二道防線&#xff0c;貸中階段風控的重點工作就是存量客戶風控及運營。在當下&#xff0c;新客市場趨于飽和且獲客成本越來越高&#xff0c;所以&#xff0c;在做好…

基于Java的俄羅斯方塊游戲的設計與實現

關于俄羅斯方塊項目源碼.zip資源-CSDN文庫https://download.csdn.net/download/JW_559/89300281 基于Java的俄羅斯方塊游戲的設計與實現 摘 要 俄羅斯方塊是一款風靡全球&#xff0c;從一開始到現在都一直經久不衰的電腦、手機、掌上游戲機產品&#xff0c;是一款游戲規則簡單…

物聯網設計競賽_1_邊緣人工智能云計算

邊緣人工智能&#xff1a; 本質上邊緣人工智能&#xff0c;直接會在邊緣設備上運行機器學習算法&#xff0c;例如物聯網設備或邊緣服務器上&#xff0c;這樣可以減少數據傳輸延遲&#xff0c;提高響應速度。 云計算&#xff1a; 云計算模型中&#xff0c;數據通常被發送到遠…