8.1 緩存
前端發(fā)來請求元咙,服務(wù)器從數(shù)據(jù)庫讀取數(shù)據(jù)返回給前端赡译,一個完整的交互流程就完成了居扒。但是如果有一個請求,在一段時間內(nèi)每次從數(shù)據(jù)庫取回的結(jié)果都一樣暂题,這個請求并發(fā)量增大之后移剪,每次都連接數(shù)據(jù)庫查詢就對數(shù)據(jù)庫造成了很多無謂的性能消耗,這種情況下就適合用緩存解決薪者。第一次請求將數(shù)據(jù)庫查詢的結(jié)果緩存起來纵苛,在一段時間內(nèi)只要是同樣的請求就直接返回結(jié)果,這樣就不需要再去查詢數(shù)據(jù)庫啸胧,降低數(shù)據(jù)庫壓力赶站。緩存過期之后則查詢數(shù)據(jù)庫,然后再緩存結(jié)果纺念。
什么樣的請求適合用緩存贝椿,什么情況不適合用緩存呢?這就需要根據(jù)具體情況分析陷谱,基本規(guī)則是請求頻繁且結(jié)果變化不頻繁的適合用緩存烙博。比如對實時性結(jié)果要求高的情況就不適合,或者每個用戶的返回結(jié)果都不一樣時也不適合烟逊。發(fā)送短信驗證碼很適合用緩存渣窜,因為短信驗證碼一般要求60秒內(nèi)不允許重新發(fā)送,可以把手機(jī)號碼和驗證碼緩存起來宪躯,請求先從緩存里查找乔宿,如果緩存中存在該手機(jī)號則直接取出結(jié)果對比,不存在則調(diào)用發(fā)送短信的接口發(fā)送驗證碼然后緩存访雪。
8.2 云數(shù)據(jù)庫Redis
創(chuàng)建Redis實例
管理控制臺 > 產(chǎn)品與服務(wù) > 云數(shù)據(jù)庫Redis版 > 創(chuàng)建實例
連接Redis
創(chuàng)建完實例之后在實例信息里找到連接信息一欄详瑞,設(shè)置白名單之后就可以看到連接信息掂林。阿里云Redis默認(rèn)只允許VPC內(nèi)訪問,所以我們登錄到服務(wù)器上操作坝橡。登錄服務(wù)器并確保服務(wù)器安全組規(guī)則里已經(jīng)添加6379端口泻帮,通過命令連接:
redis-cli -h r-*.redis.rds.aliyuncs.com -a password
Redis基礎(chǔ)
Redis是一個基于內(nèi)存的Key-Value的數(shù)據(jù)庫,Key值是字符串计寇,Value值可以是字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等類型锣杂。
DEL key01
# 刪除一個鍵
EXPIRE key01 60
# key01緩存60秒
PUT key01 string01
#設(shè)置鍵key01的值是字符串類型
GET key01
#獲取key01的值
HMSET key02 name "Jack" age 18
#設(shè)置鍵key02的值是Hash類型
HGET key02 age
#獲取key02的字段age的值
LPUSH key03 redis;LPUSH key03 mongo
#key03的值是List類型
LRANGE key03 0 10
#獲取key03制定范圍內(nèi)的元素
SADD key04 redis;SADD key04 redis
#key04值是Set類型
SMEMBERS key04
#獲取key04集合中的所有元素
Redis集成
在我們的starter項目里集成Redis,在pom.xml添加依賴
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
新增RedisHelper:
package cn.mx.starter.util;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
@Component
public class RedisHelper {
private Jedis jedis;
@PostConstruct
public void init() {
jedis = new Jedis("r-*.redis.rds.aliyuncs.com", 6379);
jedis.auth("password");
jedis.connect();
}
@PreDestroy
public void destroy() {
jedis.close();
}
public Jedis getJedis() {
return jedis;
}
}
在IndexController里演示如何調(diào)用Jedis:
@Autowired
RedisHelper redisHelper;
@GetMapping("/users/cache")
private String cache() {
Jedis jedis = redisHelper.getJedis();
String name = jedis.get("user");
if (name != null) {
return name;
}
User user = userRepository.findById(1L).orElse(null);
if (user != null) {
name = user.getName();
jedis.set("user", name);
jedis.expire("name", 60);
}
return name;
}
將項目打包并上傳到服務(wù)器59.110.173.162上番宁,并確保服務(wù)器安全組規(guī)則里已經(jīng)添加6379端口元莫,重新加載項目,訪問 http://dev.mxxx.cn/users/cache贝淤,接口從數(shù)據(jù)庫查詢數(shù)據(jù)柒竞,把user作為Key和他的name作為Value存入Redis,在60秒內(nèi)訪問該鏈接則直接從Redis緩存取出數(shù)據(jù)返回播聪。