一、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方式
二、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(問題集錦)
原因:引入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接口即可