緩存的應用場景
[什麼是緩存?]
在互聯網場景下,尤其 2C 端產品(比如社交類的微信,手機類的小米. 這類產品的開發)在大流量場景下,需要將一些經常展現和不會頻繁變更的數據,存放在存取速率更快的地方。
緩存就是一個存儲器,在技術選型中,常用 Redis 作為緩存資料庫。緩存主要是在獲取資源方便性能優化的關鍵方面。Redis 是一個高性能的 key-value 資料庫。
[緩存的應用場景有哪些呢?]
比如常見的電商場景,根據商品 ID 獲取商品信息時,店鋪信息和商品詳情信息就可以緩存在 Redis,直接從 Redis 獲取。減少了去數據庫查詢的次數。但會出現新的問題,就是如何對緩存進行更新?
大致流程如下:
獲取商品詳情舉例
a. 從商品 Cache 中獲取商品詳情,如果存在,則返回獲取 Cache 資料返回。
b. 如果不存在,則從商品 DB 中獲取。獲取成功後,將資料存到 Cache 中。則下次獲取商品詳情,就可以從 Cache 就可以得到商品詳情資料。
c. 從商品 DB 中更新或者刪除商品詳情成功後,則從緩存中刪除對應商品的詳情緩存
更新缓存的策略
參考《緩存更新的套路》,緩存更新的模式有四種:
1、Cache aside
2、Read through
3、Write through
4、Write behind caching
這裡使用的是 「Cache Aside」 策略,此策略可從三個維度來說明:
失效:應用程序先從cache取數據,沒有得到,則從數據庫中取數據,成功後,放到緩存中。
命中:應用程序從cache中取數據,取到後返回。
更新:先把數據存到數據庫中,成功後,再讓緩存失效
實作
[執行環境]
Mac OS 10.12.x
JDK 8 +
Redis 3.2.8
Spring Boot 1.5.1.RELEASE
程式碼下載(github):https://github.com/ntausr4/Test-Tech-SpringBoot-mybatis-Redis
程式相關說明:
* @comment 首先這裡注入了 RedisTemplate 對象。
* 聯想到 Spring 的 JdbcTemplate ,RedisTemplate 封裝了 RedisConnection,具有連接管理,序列化和 Redis 操作等功能。
* 還有針對 String 的支持對象 StringRedisTemplate。
* Redis 操作視圖接口類用的是 ValueOperations,對應的是 Redis String/Value 操作。
* 還有其他的操作視圖,ListOperations、SetOperations、ZSetOperations 和 HashOperations 。ValueOperations
* 插入緩存是可以設置失效時間,這裡設置的失效時間是 10 s。
* 1.建立資料庫
CREATE DATABASE springbootdb;
* 2.建立資料表
DROP TABLE IF EXISTS `city`;
CREATE TABLE `city` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '城市编号',
`province_id` int(10) unsigned NOT NULL COMMENT '省份编号',
`city_name` varchar(25) DEFAULT NULL COMMENT '城市名称',
`description` varchar(25) DEFAULT NULL COMMENT '描述',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
* 3.插入數據
INSERT city VALUES (1 ,1,'新北市','BY ERRUI 的家在新北市');
4.根據 ID,獲取城市信息
GET http://127.0.0.1:8080/api/city/1
5.更新程式信息
PUT http://127.0.0.1:8080/api/city
6.刪除程式信息
DELETE http://127.0.0.1:8080/api/city/2
大功告成!