本文繼上文開始講述了Redis在IDEA中如何應用以及集成進入spring開發環境,以及如何使用Redis客戶端。上一個文章:Redis學習篇1:初識Redis
https://blog.csdn.net/jialuosi/article/details/139057088
一、Redis在java中的客戶端
二、SpringDataRedis
三、SpringDataRedis快速入門
3.1、使用SpringDataRedis
3.2、序列化與反序列化
3.3、StringRedisTemplate
一、Redis在java中的客戶端
-
Jedis和Lettuce:這兩個主要是提供了Redis命令對應的API,方便我們操作Redis,而SpringDataRedis又對這兩種做了抽象和封裝,因此我們后期會直接以SpringDataRedis來學習。
-
Redisson:是在Redis基礎上實現了分布式的可伸縮的java數據結構,例如Map.Queue等,而且支持跨進程的同步機制:Lock.Semaphore等待,比較適合用來實現特殊的功能需求。
上述兩種是相當于原生的java客戶端,在目前大部分都是spring的開發環境下,早已不流行使用,接下來我們著重的講一下SpringDataRedis。
二、SpringDataRedis
SpringData是Spring中數據操作的模塊,包含對各種數據庫的集成,其中對Redis的集成模塊就叫做SpringDataRedis,官網地址:Spring Data Redis
-
提供了對不同Redis客戶端的整合(Lettuce和Jedis)
-
提供了RedisTemplate統一API來操作Redis
-
支持Redis的發布訂閱模型
-
支持Redis哨兵和Redis集群
-
支持基于Lettuce的響應式編程
-
支持基于JDK.JSON.字符串.Spring對象的數據序列化及反序列化
-
支持基于Redis的JDKCollection實現
我們在學習篇1中曾經提到過,Redis不同于MySQL,他在不同的環境下查詢語句并不相同,之前操作String用set,get等,操作Hash用hset,hget等,但是在SpringDataRedis中提供了RedisTemplate工具類,其中封裝了各種對Redis的操作。并且將不同數據類型的操作API封裝到了不同的類型中:
關說不練沒意義,我們繼續往下看如何在項目中集成SpringDataRedis。
三、SpringDataRedis快速入門
3.1、使用SpringDataRedis
想要使用SpringDataRedis非常簡單,只需要執行以下三個使用步驟:
-
引入spring-boot-starter-data-redis依賴
-
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
-
-
在application.yml配置Redis信息
-
server:port: 8081 spring:redis:host: 127.0.0.1port: 6379 password: 123456 #沒有則不用填lettuce:pool:max-active: 8 #最大連接max-idle: 8 #最大空閑連接min-idle: 0 #最小空閑連接max-wait: 100ms #連接等待時間
-
-
注入RedisTemplate
-
@SpringBootTest class RedisDemoApplicationTests {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;@Testvoid testString() {// 寫入一條String數據redisTemplate.opsForValue().set("name", "jialuosi");// 獲取string數據Object name = redisTemplate.opsForValue().get("name");System.out.println(name);} }
-
3.2、序列化與反序列化
????????RedisTemplate可以接收任意Object作為值寫入Redis,只不過寫入前會把Object序列化為字節形式,默認是采用JDK序列化,得到的結果是這樣的:(值就是我們存入的name的value:jialuosi)
這種序列化的方式,其缺點已經非常的明顯:可讀性非常差,內存占用較大。所以該如何解決呢?
方案一:
自定義RedisTemplate
修改RedisTemplate的序列化器為GenericJackson2JsonRedisSerializer
缺點:為了在反序列化時知道對象的類型,JSON序列化器會將類的class類型寫入json結果中,存入Redis,會帶來額外的內存開銷。
方案二:
使用StringRedisTemplate
寫入Redis時,手動把對象序列化為JSON
讀取Redis時,手動把讀取到的JSON反序列化為對象
因為種種原因,方案一也有很多的問題,所以我們之間講解方案二、避免白雪。
3.3、StringRedisTemplate
????????為了減少內存的消耗,我們可以采用手動序列化的方式,換句話說,就是不借助默認的序列化器,而是我們自己來控制序列化的動作,同時,我們只采用String的序列化器,這樣,在存儲value時,我們就不需要在內存中就不用多存儲數據,從而節約我們的內存空間。
????????這種用法比較普遍,因此SpringDataRedis就提供了RedisTemplate的子類:StringRedisTemplate,它的key和value的序列化方式默認就是String方式。
而關于如何序列化以及反序列化可以看我的這篇文章:JAVA:淺談JSON與JSON轉換https://blog.csdn.net/jialuosi/article/details/139005572
下面是實操代碼,其中實體類只賦值了ID以及名字,從? ?序列化為JSON數據存入Redis? ?到? ? 從Redis中取出JSON然后反序列化為實體類對象? ?的過程。?
?