1. 程式人生 > >SpringBoot + Redis 實現快取機制

SpringBoot + Redis 實現快取機制

SpringBoot + Mybtis +Redis 快取使用

往期回顧:

上一節簡單的介紹了SpringBoot + Properties

實現分散式服務動態配置內外部檔案,

application.properties配置檔案欲被

SpringBoot自動載入,需要放置到指定的位置:

src/main/resource目錄下。

@Component註解:

目的是為了JavaBean可以被SpringBoot

專案啟動時候被掃描到並載入到Spring容器之中。

@ConfigurationProperties(prefix="key")

屬性繫結註解

CommandLineRunner和ApplicationRunner,

他們的執行時機為容器啟動完成的時候

詳見:

專案結構

注:專案構建通過: http://start.spring.io/ 快速構建web 專案,
具體操作可以參考《SpringBoot使用SpringDataJPA完成資料查詢 -Demo》。
本次專案搭建應用的元件是springboot + dubbo + mybatis + redis
演示是基於之前構建的專案為基礎
詳情可以參考:
SpringBoot + Dubbo + Mybatis 分層實現分散式服務
本次專案簡單敘述如何在springboot框架當中使用Redis作為快取
在基礎環境確定好了之後,我們專案的目錄結構如下:
專案結構與之前相同
可參考《

SpringBoot + Dubbo + Mybatis 分層實現分散式服務

hdd-doorplate-dubbo-server

我們需要在dubbo的服務層Pom檔案當中引入Spring Boot Redis 依賴

<!-- Spring Boot Redis 依賴 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-redis</artifactId>
    <version>${spring-boot-starter-redis-version}</version>
</dependency>

然後在我們的配置檔案application.properties當中配置reids

## Redis 配置
## Redis資料庫索引(預設為0)
spring.redis.database=0
## Redis伺服器地址
spring.redis.host=127.0.0.1
## Redis伺服器連線埠
spring.redis.port=6379
## Redis伺服器連線密碼(預設為空)
spring.redis.password=
## 連線池最大連線數(使用負值表示沒有限制)
spring.redis.pool.max-active=8
## 連線池最大阻塞等待時間(使用負值表示沒有限制)
spring.redis.pool.max-wait=-1
## 連線池中的最大空閒連線
spring.redis.pool.max-idle=8
## 連線池中的最小空閒連線
spring.redis.pool.min-idle=0
## 連線超時時間(毫秒)
spring.redis.timeout=0

配置完成之後修改DoorplateServerImpl實現的方法

獲取資料邏輯為:
如果快取存在,從快取中獲取資料資訊
如果快取不存在,從 DB 中獲取資料資訊,然後插入快取

// 註冊為 Dubbo 服務
@Service(version = "1.0.0")
public class DoorplateServerImpl implements DoorplateServer {
    private static final Logger LOGGER = LoggerFactory.getLogger(DoorplateServerImpl.class);
    @Resource
    private DoorplateDao doorplateDao;

    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public List<String> list() {
        List<String> list = new ArrayList<String>();
        list.add("城市中心運動公園");
        return list;
    }

    @Override
    public Doorplate listById(String id) {

        String key = "doorplate_" + id;
        ValueOperations<String, Doorplate> operations = redisTemplate.opsForValue();

        // 快取存在
        boolean hasKey = redisTemplate.hasKey(key);
        if (hasKey) {
            Doorplate doorplate = operations.get(key);

            LOGGER.info("查詢中: 從快取中獲取了資料 >> " + doorplate.toString());
            return doorplate;
        }
        // 從 DB 中獲取城市資訊
        Doorplate doorplate =doorplateDao.findById(id);

        // 插入快取
        operations.set(key, doorplate);
        LOGGER.info("查詢中: 快取沒有,插入快取 >> " + doorplate.toString());

        return doorplate;

    }
}

Spring封裝了RedisTemplate物件來進行對Redis的各種操作,它支援所有的Redis原生的api。RedisTemplate位於spring-data-redis包下。

RedisTemplate中定義了對5種資料結構操作:

redisTemplate.opsForValue();//操作字串
redisTemplate.opsForHash();//操作hash
redisTemplate.opsForList();//操作list
redisTemplate.opsForSet();//操作set
redisTemplate.opsForZSet();//操作有序set

測試

同樣,我們啟動Dubbo服務,Redis服務,Zookeeper註冊中心,Web服務。
然後訪問介面

http://127.0.0.1:6661/user/listById?id=1

返回結果:

{"id":"1","name":"房屋","address":"城市中心運動公園"}

後臺輸出為:
--查詢中: 快取沒有,插入快取

2018-11-11 16:30:28.976  INFO 25304 --- [:20880-thread-2] c.s.h.d.dubbo.impl.DoorplateServerImpl   : 查詢中: 快取沒有,插入快取 >> [email protected]

再次訪問應該是從快取中拿取:
--查詢中: 從快取中獲取了資料

2018-11-11 16:30:32.016  INFO 25304 --- [:20880-thread-3] c.s.h.d.dubbo.impl.DoorplateServerImpl   : 查詢中: 從快取中獲取了資料 >> [email protected]