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作為快取
在基礎環境確定好了之後,我們專案的目錄結構如下:
專案結構與之前相同
可參考《
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]