SpringBoot 中使用Redis緩存

作者:xcbeyond
瘋狂源自夢想,技術成就輝煌!微信公眾號:《程序猿技術大咖》號主,專注后端開發(fā)多年,擁有豐富的研發(fā)經驗,樂于技術輸出、分享,現階段從事微服務架構項目的研發(fā)工作,涉及架構設計、技術選型、業(yè)務研發(fā)等工作。對于Java、微服務、數據庫、Docker有深入了解,并有大量的調優(yōu)經驗。

 在項目中對數據的訪問往往都是直接訪問數據庫的方式,但如果對數據的訪問量很大或者訪問很頻繁的話,將會對數據庫來很大的壓力,甚至造成數據庫崩潰。為了解決這類問題redis數據庫脫穎而出,redis數據庫出現時是以非關系數據庫的光環(huán)展示在廣大程序猿的面前的,后來redis的迭代版本支持了緩存數據、登錄session狀態(tài)(分布式session共享)等。所以又被作為內存緩存的形式應用到大型企業(yè)級項目中。

        本章節(jié)主要講述如何在SpringBoot項目中使用Redis。

1、Redis簡單介紹
Redis 是完全開源免費的,遵守BSD協(xié)議,是一個高性能的key-value非關系性數據庫(NoSql)。
Redis 與其他 key - value 緩存產品有以下三個特點:

Redis支持數據的持久化,可以將內存中的數據保存在磁盤中,重啟的時候可以再次加載進行使用。
Redis不僅僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
Redis支持數據的備份,即master-slave模式的數據備份。
1.1 數據結構介紹
        Redis可以存儲鍵與5種不同數據結構類型之間的映射,這5種數據結構類型分別為String(字符串)、List(列表)、Set(集合)、Hash(散列)和 Zset(有序集合)。
 

 

2.2 Redis 優(yōu)勢
性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
豐富的數據類型 – Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操作。
原子 – Redis的所有操作都是原子性的,意思就是要么成功執(zhí)行要么失敗完全不執(zhí)行。單個操作是原子性的。多個操作也支持事務,即原子性,通過MULTI和EXEC指令包起來。
豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性。
2.3 Redis與其他key-value存儲有什么不同?
Redis有著更為復雜的數據結構并且提供對他們的原子性操作,這是一個不同于其他數據庫的進化路徑。Redis的數據類型都是基于基本數據結構的同時對程序員透明,無需進行額外的抽象。
Redis運行在內存中但是可以持久化到磁盤,所以在對不同數據集進行高速讀寫時需要權衡內存,因為數據量不能大于硬件內存。在內存數據庫方面的另一個優(yōu)點是,相比在磁盤上相同的復雜的數據結構,在內存中操作起來非常簡單,這樣Redis可以做很多內部復雜性很強的事情。同時,在磁盤格式方面他們是緊湊的以追加的方式產生的,因為他們并不需要進行隨機訪問。
2、安裝Redis
       根據不同的需求下載Linux或Windows版本的,目前Redis官網只有Linux版本,但由于大多數開發(fā)者還是基于windows平臺開發(fā)的,所有GitHub上的技術牛人基于linux平臺下的Redis實現了windows版本,給windows開發(fā)帶來了福音。

2.1 下載Windows版本Redis
      直接訪問github網址:https://github.com/MSOpenTech/redis/releases,下載最新的windows X64版本的壓縮包,如下圖所示:
 

 下載第二個.zip,免安裝,解壓就直接可以用,解壓后如下圖:

2.2 啟動Redis
redis.windows.conf為redis配置文件,相關參數可以在這里配置,如:端口等,我這里使用默認參數,暫不修改,默認端口為6379。雙擊redis-server.exe啟動,則出現如下圖所示,則啟動成功。

3、SpringBoot中使用Redis
以之前構建的項目為基準,使用Redis.

3.1 添加Redis依賴包
在項目的pom.xml中添加如下:

<!-- redis依賴包 -->
<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
3.2 配置Redis數據庫連接
在application.properties中配置redis數據庫連接信息,如下:

#redis配置
#Redis服務器地址
spring.redis.host=127.0.0.1
#Redis服務器連接端口
spring.redis.port=6379
#Redis數據庫索引(默認為0)
spring.redis.database=0  
#連接池最大連接數(使用負值表示沒有限制)
spring.redis.jedis.pool.max-active=50
#連接池最大阻塞等待時間(使用負值表示沒有限制)
spring.redis.jedis.pool.max-wait=3000
#連接池中的最大空閑連接
spring.redis.jedis.pool.max-idle=20
#連接池中的最小空閑連接
spring.redis.jedis.pool.min-idle=2
#連接超時時間(毫秒)
spring.redis.timeout=5000
3.3 編寫Redis操作工具類
        將RedisTemplate實例包裝成一個工具類,便于對redis進行數據操作。






com.xcbeyond.springboot.redis.RedisUtils.java

package com.xcbeyond.springboot.redis;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
 
/**
 * redis操作工具類.</br>
 * (基于RedisTemplate)
 * @author xcbeyond
 * 2018年7月19日下午2:56:24
 */
@Component
public class RedisUtils {
 
    @Autowired
    private RedisTemplate<String, String> redisTemplate;
 
    /**
     * 讀取緩存
     * 
     * @param key
     * @return
     */
    public String get(final String key) {
        return redisTemplate.opsForValue().get(key);
    }
 
    /**
     * 寫入緩存
     */
    public boolean set(final String key, String value) {
        boolean result = false;
        try {
            redisTemplate.opsForValue().set(key, value);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
 
    /**
     * 更新緩存
     */
    public boolean getAndSet(final String key, String value) {
        boolean result = false;
        try {
            redisTemplate.opsForValue().getAndSet(key, value);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
 
    /**
     * 刪除緩存
     */
    public boolean delete(final String key) {
        boolean result = false;
        try {
            redisTemplate.delete(key);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
}
3.4 測試
寫一個測試用例類來完成對redis的讀寫。

/springboot/src/test/java/com/xcbeyond/springboot/redis/RedisTest.java

package com.xcbeyond.springboot.redis;
 
import javax.annotation.Resource;
 
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
 * 
 * @author xcbeyond
 * 2018年7月19日下午3:08:04
 */
 
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class RedisTest {
    @Resource
    private RedisUtils redisUtils;
 
    /**
     * 插入緩存數據
     */
    @Test
    public void set() {
        redisUtils.set("redis_key", "redis_vale");
    }
    
    /**
     * 讀取緩存數據
     */
    @Test
    public void get() {
        String value = redisUtils.get("redis_key");
        System.out.println(value);
    }
 
}
執(zhí)行完測試方法set后,可以登錄到redis上查看數據是否插入成功。

(建議使用RedisDesktopManager可視化工具進行查看)
 

4、總結
         本章節(jié)只是簡單的介紹了下在SpringBoot中如何使用Redis,Redis的使用遠遠不止這些,根據實際項目需求將會變得更加復雜,其中事物等都是可以通過redis來處理的。

本章節(jié)代碼已提交至Github(https://github.com/xcbeyond/micro-service/tree/master/springboot),如有需要自行下載。