基於SpringBoot進行Redis整合


一、Redis的安裝與配置

1、基本描述

(1)定義

    Redis是一個典型的非關系型數據庫,可以作為消息中間件使用。

(2)版本

    6.2.6

2、安裝與配置

 1 //安裝
 2 1.下載  wget http://download.redis.io/redis-stable.tar.gz
 3 2.解壓  tar –zxvf redis-stable.tar.gz
 4 3.編譯  make
 5 4.安裝  make install
 6 5.查看版本  redis-server -v
 7 
 8 //配置
 9 1.在/etc下創建目錄redis cd /etc   mkdir redis
10 2.在/var下創建目錄redis,以及在redis下創建run、data和log  cd /var   mkdir run data log
11 3.把安裝包解壓目錄里的redis.conf復制到/etc/redis cp redis.conf /etc/redis
12 4.修改redis.conf配置:修改默認端口為6379;修改pid目錄為/var/redis/run/redis.pid;修改log目錄為/var/redis/log/redis.log;修改數據目錄dir為/var/redis/data
13 vi /etc/redis/redis.conf
14 5.啟動redis服務
15 redis-server /etc/redis/redis.conf
16 
17 //測試
18 1.連接redis客戶端 redis-cli
19 2.創建鍵值對 set key value
20 3.獲取鍵值對 get key
21 
22 //其它配置(可選)
23 1.redis可直接通過service redis start/stop腳本命令進行redis服務開始/停止
24 把解壓包下的utils目錄下redis_init_script文件復制到/etc/init.d目錄下;
25 mv redis_init_script redis  //文件重命名;
26 修改上面的redis配置文件,把相關的路徑更改為正確的即可;
27 使用上述的service命令進行測試
28 2.redis開機自啟動
29 chkconfig redis on  //執行此命令即可

3、成果

安裝redis成功=>

連接redis客戶端並創建鍵值對=>

啟動腳本修改成功=>

4、FAQ(問題集錦)

(1)進行配置第五步,即啟動redis服務時一直無響應

原因:redis的運行以console方式

解決方法:需要把redis服務運行改為后台運行,重新編輯redis.conf配置文件,將daemonize no改為daemonize yes,重新啟動redis服務即可。

 

二、SpringBoot整合Redis的基本使用

1、整合步驟

 

 1 1、添加Redis相關依賴
 2     <!-- 添加redis依賴 -->
 3     <dependency>
 4       <groupId>org.springframework.boot</groupId>
 5       <artifactId>spring-boot-starter-data-redis</artifactId>
 6     </dependency>
 7     <!--使用lettuce時,需要額外引入commons-pool2依賴包-->
 8     <dependency>
 9       <groupId>org.apache.commons</groupId>
10       <artifactId>commons-pool2</artifactId>
11     </dependency>
12 2、配置Redis連接信息等
13 #redis連接信息配置
14 spring:
15   redis:
16     host: 192.168.157.131
17     port: 6379
18     password:
19     #jedis:
20     #springboot2.0以上的版本默認使用的是lettuce redis客戶端,如果想使用jedis客戶端,則需把lettuce依賴進行排除以及手動引入jedis依賴
21     lettuce:
22       pool:
23         max-active: 8
24         max-wait: -1
25         max-idle: 500
26         min-idle: 0
27 3、創建Redis配置類
28 @Configuration
29 public class RedisConfig {    //Rdis配置工具,包括序列器配置等
30     @Bean
31     public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
32         RedisTemplate<String,Object> template=new RedisTemplate<>();
33         //關聯
34         template.setConnectionFactory(factory);
35         //設置key的序列化器
36         template.setKeySerializer(new StringRedisSerializer());
37         //設置value的序列器
38         template.setValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));
39         return template;
40     }
41 }
42 4、創建測試類
43 @RunWith(SpringRunner.class)
44 @SpringBootTest
45 public class TestRedis1 {   //Redis處理鍵值對緩存的測試類
46 
47     @Autowired
48     private RedisTemplate<String,String> redisTemplateStr;        //redis存儲緩存工具,注入的是StringRedisTemplate實例,@Autowired根據類型尋找Bean
49     //@Resource    未有手動創建配置的RedisTemplate,使用的是自帶的默認RedisTemplate
50     @Autowired      //手動配置了RedisConfig之后,在spring上下文就存在了RedisTemplate<String,Object>類型的Bean
51     private RedisTemplate<String,Object> redisTemplate;     //注入的是RedisTemplate實例,@Resource根據名稱尋找Bean
52 
53     //測試RedisTemplate<String,String>注入StringRedisTemplate下,設置及獲取緩存
54     @Test
55     public void testStringRedisTemplate(){
56         set("test1","I‘m an enginer!");
57         get("test1");
58     }
59     //測試RedisTemplate<String,String>注入手動配置RedisTemplate下,設置及獲取緩存
60     @Test
61     public void testRedisTemplateObj(){
62         //setRT("test2","I‘m an object!");
63         //getRT("test2");
64         User user=new User();
65         user.setId(1001);
66         user.setName("Zhao Yun");
67         setRT("test3",user);
68         getRT("test3");
69     }
70 
71     //設置緩存
72     public void set(String key,String value){
73          redisTemplateStr.opsForValue().set(key, value);
74          System.out.println("當前存儲鍵值對為=>key="+key+",value="+value);
75     }
76 
77     //獲取緩存
78     public void get(String key){
79         System.out.println("key="+key+",value="+redisTemplateStr.opsForValue().get(key));
80     }
81 
82     //設置緩存
83     public void setRT(String key,Object value){
84         redisTemplate.opsForValue().set(key, value);
85         System.out.println("當前存儲鍵值對為=>key="+key+",value="+value);
86     }
87 
88     //獲取緩存
89     public void getRT(String key){
90         System.out.println("key="+key+",value="+redisTemplate.opsForValue().get(key));
91     }
92 }

 

2、成果

 

//springboot整合redis進行緩存處理成功!!恭喜恭喜!!(使用lettuce客戶端以及StringRedisTemplate實例注入以及StringRedisSerializer序列化器)

 

//springboot整合redis進行緩存處理成功!!恭喜恭喜!!(使用lettuce客戶端以及RedisTemplate實例注入以及默認JdkSerializationRedisSerializer序列化器=>通過配置改造為了Jackson2JsonRedisSerializer即轉換為了json串)

 

 

 

 

 

3、FAQ(問題集錦)

 

1、添加完redis依賴后,進行maven reload時,所有的其它依賴都不見了?

 

 

原因:引入redis依賴出錯導致的(把它刪除掉重新reload就恢復正常了)

 

解決方法:把依賴spring-boot-starter-redis改為spring-boot-starter-data-redis重新進行maven reload即可

 

2、虛擬機能ping通本地windows,但是windows ping不通虛擬機?(起源為secureCRT連接虛擬機失敗,Redis訪問也是失敗)?

 

原因:虛擬機的橋接方式配置錯誤

 

解決方法:虛擬機->編輯->虛擬網絡編輯器->更改設置,按下面的圖示更改網絡類型然后重啟虛擬機即可

 

 

 

 

注:如果上述方法不行,就使用NAT網絡模式,基於主機的VMnet8網絡進行通信,重啟后再確定網絡是否正常?如果想進行靜態ip設置,請參考鏈接:https://blog.csdn.net/huanghuang777/article/details/11891555

 

3、運行test方法后,出現"org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to"?

 

原因:配置redis服務的時候綁定了本地以及開啟了保護模式

 

解決方法:注釋掉bind這條語句,把protected-mode改為no,最后記得重啟redis即可

 

 

4、運行test方法后,出現"Error creating bean with name 'redisConnectionFactory' defined in class path resource.....nested exception is java.lang.NoClassDefFoundError: org/apache/commons/pool2/impl/GenericObjectPoolConfig"?

 

原因:使用lettuce這個Redis客戶端時,需要額外引入commons-pool2依賴

 

解決方法:

 

<!--使用lettuce時,需要額外引入commons-pool2依賴包-->
  <dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
  </dependency>

 

5、運行test方法后,出現”Could not get a resource from the pool; nested exception is io.lettuce.core.RedisConnectionException:“?

 

原因:redis服務未啟動

 

解決方法:重啟redis服務即可,即先stop后start

 

 

6、”org.springframework.data.redis.serializer.SerializationException: Cannot serialize; “?

 

原因:緩存的對象是需要進行序列化后才能存儲,實體未進行序列化

 

解決方法:實體類實現Serialize接口即可

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM