摘要:如何通過springboot來整合操作Redis。
本文分享自華為雲社群《SpringBoot連線Redis操作教程》,作者: 灰小猿。
今天來和大家分享一個如何通過springboot來整合操作Redis。
一、SpringBoot連線Redis
springboot連線Redis時需要在pom檔案中匯入所需的jar包依賴,依賴如下:
<!-- 加入jedis依賴 --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency>
(1)使用Jedis類直接連線Redis伺服器
在springboot環境下連線redis的方法有很多,首先最簡單的就是直接通過jedis類來連線,
jedis類就相當於是redis的客戶端表示。
連線方法如下:
/** * redis連線測試01 */ @Test public void redisTest01() { //連線本地的 Redis 服務 Jedis jedis = new Jedis("localhost"); // 如果 Redis 服務設定了密碼,需要用下面這行程式碼輸入密碼 // jedis.auth("123456"); System.out.println("連線成功"); //檢視服務是否執行 System.out.println("服務正在執行: "+jedis.ping()); }
執行後結果:
通過這種方式進行連線時,springboot會自動的去本地尋找redis伺服器進行連線,如果沒有找到那麼就會報錯,
如果你去閱讀jedis的底層原始碼,你會發現Jedis類有多種構造方法,
常用的幾個是
使用預設地址和埠
//不傳值,那麼使用預設的127.0.0.1地址,6379埠就訪問 public Jedis()
使用指定地址和預設埠
//只傳入目的地址,那麼使用指定的地址和預設的埠號去訪問 public Jedis(String host)
使用指定地址和埠
//傳入目的地址和埠號,那麼使用指定的地址和埠號去訪問 public Jedis(String host, int port)
(2)通過配置檔案進行連線
在springboot中,當然是可以通過配置檔案的形式來設定各種連線引數了,Redis也是一樣的,
在yml檔案中進行如下配置:
注意:這是沒有使用連線池的,如果使用連線池,需要在下邊增加配置,關於使用連線池的可以繼續往下看。
##redis配置資訊 spring: redis: database: 0 #redis資料庫索引,預設為0 host: 127.0.0.1 #redis伺服器地址 port: 6379 #redis伺服器連線埠 password: #redis伺服器連線密碼,預設為null timeout: 5000 #redis連線超時時間
通過配置檔案來進行配置之後,我們就可以使用springboot中的一個工具類來操作Redis的操作了,springboot會自動讀取配置檔案中的配置資訊,然後通過該配置資訊去連線Redis伺服器,springboot中提供操作Redis的工具類有兩個,分別是:StringRedisTemplate和RedisTemplate,
StringRedisTemplate和RedisTemplate的區別如下
- 在進行序列化時,RedisTemplate使用的是 JdkSerializationRedisSerializer,而StringRedisTemplate使用的是StringRedisSerializer
- StringRedisTemplate繼承了RedisTemplate<String,String>,而RedisTemplate 定義為 RedisTemplate<K, V>,所有StringRedisTemplate就限定了K,V為String型別的
相同處體現在他們對Redis的操作上,
RedisTemplate和StringRedisSerializer都定義了五種對Redis的操作,分別對應這Redis中的五種資料型別。
redisTemplate.opsForValue(); //操作字串 redisTemplate.opsForHash(); //操作hash redisTemplate.opsForList(); //操作list redisTemplate.opsForSet(); //操作set redisTemplate.opsForZSet(); //操作有序set
那麼在使用的時候,這兩個類應該如何選擇呢?
如果你的redis資料庫裡面本來存的是字串資料,或者你要存取的資料就是字串型別資料的時候,那麼你就使用StringRedisTemplate即可,
》但是如果你的資料是複雜的物件型別,而取出的時候又不想做任何的資料轉換,直接從Redis裡面取出一個物件,那麼使用RedisTemplate是更好的選擇。
接下來我以StringRedisSerializer為例子,來給大家演示一下使用StringRedisSerializer操作Redis的方法,
/** * springboot主從連線測試, * 使用springRedisTemplate操作 */ @Test public void redisTest06() { // 操作字元型 stringRedisTemplate.opsForValue().set("test06","Test06"); System.out.println(stringRedisTemplate.opsForValue().get("test06")); // 設定key的過期時間,30秒 stringRedisTemplate.expire("test06", 30 * 1000, TimeUnit.MILLISECONDS); // 根據key獲取過期時間 Long test06ExpireTime = stringRedisTemplate.getExpire("test06"); System.out.println("根據key獲取過期時間:" + test06ExpireTime); // 根據key獲取過期時間,並且換算成指定單位 Long test06ExpireTimeToUnit = stringRedisTemplate.getExpire("test06", TimeUnit.SECONDS); System.out.println("根據key獲取過期時間,並且換算成指定單位:" + test06ExpireTimeToUnit); // 檢查key是否存在,返回布林型別 Boolean test06IsExist = stringRedisTemplate.hasKey("test06"); System.out.println("檢查key是否存在,返回布林型別:" + test06IsExist); }
在上面的操作中,有一點關於獲取和設定key過期時間的操作,當時在操作的時候對其進行了一下探究,在這裡分享給大家
stringRedisTemplate中獲取過期時間的getExpire()方法的說明
如果最開始沒有設定過期時間,那麼就返回-1,資料在沒有達到Redis資料最大限額的情況下會一直存在.
如果設定了過期時間,但是資料還未過期,就返回剩餘時間,如果到了過期時間,那麼資料會被刪除
如果資料被刪除或者不存在,那麼就返回-2.