第8章 Redis
8.1 缓存
前端发来请求,服务器从数据库读取数据返回给前端,一个完整的交互流程就完成了。但是如果有一个请求,在一段时间内每次从数据库取回的结果都一样,这个请求并发量增大之后,每次都连接数据库查询就对数据库造成了很多无谓的性能消耗,这种情况下就适合用缓存解决。第一次请求将数据库查询的结果缓存起来,在一段时间内只要是同样的请求就直接返回结果,这样就不需要再去查询数据库,降低数据库压力。缓存过期之后则查询数据库,然后再缓存结果。
什么样的请求适合用缓存,什么情况不适合用缓存呢?这就需要根据具体情况分析,基本规则是请求频繁且结果变化不频繁的适合用缓存。比如对实时性结果要求高的情况就不适合,或者每个用户的返回结果都不一样时也不适合。发送短信验证码很适合用缓存,因为短信验证码一般要求60秒内不允许重新发送,可以把手机号码和验证码缓存起来,请求先从缓存里查找,如果缓存中存在该手机号则直接取出结果对比,不存在则调用发送短信的接口发送验证码然后缓存。
8.2 云数据库Redis
创建Redis实例
管理控制台 > 产品与服务 > 云数据库Redis版 > 创建实例
6-18.jpg 6-19.jpg连接Redis
创建完实例之后在实例信息里找到连接信息一栏,设置白名单之后就可以看到连接信息。阿里云Redis默认只允许VPC内访问,所以我们登录到服务器上操作。登录服务器并确保服务器安全组规则里已经添加6379端口,通过命令连接:
redis-cli -h r-*.redis.rds.aliyuncs.com -a password
Redis基础
Redis是一个基于内存的Key-Value的数据库,Key值是字符串,Value值可以是字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
DEL key01
# 删除一个键
EXPIRE key01 60
# key01缓存60秒
PUT key01 string01
#设置键key01的值是字符串类型
GET key01
#获取key01的值
HMSET key02 name "Jack" age 18
#设置键key02的值是Hash类型
HGET key02 age
#获取key02的字段age的值
LPUSH key03 redis;LPUSH key03 mongo
#key03的值是List类型
LRANGE key03 0 10
#获取key03制定范围内的元素
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里演示如何调用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;
}
将项目打包并上传到服务器59.110.173.162上,并确保服务器安全组规则里已经添加6379端口,重新加载项目,访问 http://dev.mxxx.cn/users/cache,接口从数据库查询数据,把user作为Key和他的name作为Value存入Redis,在60秒内访问该链接则直接从Redis缓存取出数据返回。