SpringBoot連接Redis
下面就開始練習連接Redis,這裏也是沒有集成web模塊。web模塊感覺這些東西也沒有必要。連接池這裏可以講一下,上一篇MySQL的連接池放在Mybatis那裏再講,估計也快了,如果不出意外的話。。。
首先安裝Redis和配置Redis的信息,這裏不再累述,我之前的博客也有。剛纔看了一下,我之前的博客講的還挺詳細的,我這次有可能重複了,儘量講講之前沒有講到的。
仍然是添加依賴,因爲Redis官方開發了一個連接工具Jedis,這個工具挺好用的。
<!-- Redis依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 不添加這個依賴會導致RedisTemplate無法注入 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
下面就是配置Redis連接和連接池信息。
#Redis依賴
# Redis服務器地址
spring.redis.host=127.0.0.1
# Redis數據庫索引(默認爲0)
spring.redis.database=0
# Redis服務器連接端口
spring.redis.port=6379
# Redis服務器連接密碼(默認爲空)
spring.redis.password=自己的密碼
# 連接超時時間(毫秒)
spring.redis.timeout=1000
## 連接池最大連接數(使用負值表示沒有限制)
spring.redis.lettuce.pool.max-active=200
## 連接池最大阻塞等待時間(使用負值表示沒有限制)
spring.redis.lettuce.pool.max-wait=-1
## 連接池中的最大空閒連接
spring.redis.lettuce.pool.max-idle=10
## 連接池中的最小空閒連接
spring.redis.lettuce.pool.min-idle=0
下面就開始編寫代碼,需要注意的是代碼中引用的類是StringRedisTemplate,有一些不同的地方。
-
RedisTemplate,RedisTemplate是最基本的操作類,它默認的序列化方式是JdkSerializationRedisSerializer,在存值時,鍵值會被序列化爲字節數組,可讀性差,取值時也是一樣,如果redis中存的值正常的字符串形式,取值時將返回null。
-
StringRedisTemplateStringRedisTemplate繼承於 RedisTemplate<String, String>,默認的序列化方式是StringRedisSerializer,存值取值都是按照字符串的形式。
代碼如下,但是中間遇到了一些問題,解決起來很蛋疼。下面說說,最開始使用的是上面的依賴,但是啓動一直報錯,一開始懷疑注入的方式不對,把
@Resource
換成@Autowired
,結果還是不行,又懷疑方法不能正常調用(菜鳥的智障懷疑),後來又排除了。在網上找了一圈,懷疑redis版本的問題,換成了jedis,結果就可以了。然後就認爲是依賴的版本問題,生菜(最新redis使用的)和目前的SpringBoot融合的不是很好。package com.psq.train.redis; import com.psq.train.mysql.TestUser; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import javax.annotation.Resource; /** * RedisTrain.java * Description: Redis練習 * * @author Peng Shiquan * @date 2020/5/31 */ @Component public class RedisTrain { /** * 使用StringRedisTemplate,類似於RedisTemplate<String,String> */ @Resource private StringRedisTemplate stringRedisTemplate; /** * Description: Redis練習的主方法 * * @param * @return void * @Author: Peng Shiquan * @Date: 2020/5/31 */ @PostConstruct public void redisTrainmain() { TestUser testUser = new TestUser(); testUser.setId(3); testUser.setName("張三"); testUser.setPassword("1234567"); System.err.println("下面開始Redis插入"); redisTrainInsert(testUser); System.err.println("下面開始查詢"); redisTrainSelect(testUser.getName()); } /** * Description: redis插入方法 * * @param testUser * @return void * @Author: Peng Shiquan * @Date: 2020/6/1 */ public void redisTrainInsert(TestUser testUser) { String key = testUser.getName(); String value = testUser.toString(); stringRedisTemplate.opsForValue().set(key, value); System.err.println("存儲成功,存儲對象爲:key:" + key + ",value:" + value); } /** * Description: redis查詢方法 * * @param name * @return void * @Author: Peng Shiquan * @Date: 2020/6/1 */ public void redisTrainSelect(String name) { System.err.println("需要查詢的name爲:" + name); System.err.println(name); String value = stringRedisTemplate.opsForValue().get(name); System.err.println("查詢到到結果爲:" + value); } }
-
Lettuce
和Jedis
的都是連接Redis Server
的客戶端程序。Jedis
在實現上是直連redis server
,多線程環境下非線程安全,除非使用連接池,爲每個Jedis實例增加物理連接。Lettuce
基於Netty的連接實例(StatefulRedisConnection),可以在多個線程間併發訪問,且線程安全,滿足多線程環境下的併發訪問,同時它是可伸縮的設計,一個連接實例不夠的情況也可以按需增加連接實例。我也這樣認爲,直到我再次啓動的時候,發現下面一個問題。
如上圖,最後顯示的是一個密碼的問題,是客戶端配置了密碼,但是服務端沒有配置密碼,我又查看了redis啓動的時候,沒有使用正確的配置文件。
配置了密碼後,一切都解決了。真是一個SB問題,果然是老了。。。
剩下就遺留了一個問題,我看別人的demo都寫了一個redis配置類,估計是爲了定製自己的RedisTemplate
,我這裏沒有什麼定製的,就是簡單的用了一下,所以沒有寫redis配置類。如果我說錯了,大家也指點一下。
就這樣吧,結束。