一、缓存
为了系统性能的提升,我们都会将一部分数据存入缓存中,加速访问速度。数据库只承担数据的存储工作。
二、哪些数据适合放入缓存
- 即时性要求不高,数据一致性要求不高
- 访问量巨大,且更新频率不高的数据,一般读多,写少
可以简单把缓存理解为一个map类型的数据结构,存入的是一个个KV对,其实在没有redis等缓存中间件之前,人们确实是使用map当做缓存使用,因为map是以散列表的形式存在内存中的,能够提供系统的性能。但这样得到的只是本地缓存,只适合在单体应用中,在分布式系统下,每个服务器都用各自的本地缓存的话,效率会大大下降。因此需要一个统一的缓存给系统使用。
三、整合Redis
1.pom中引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.配置redis连接
配置redis服务的地址和端口(默认6379),默认没有密码
spring:
redis:
host: localhost
port: 6379
3.单元测试
查看RedisautoConfiguration的源码,里面封装了两个redis模板,我们一般用stringRedisTemplate存入KV键值对
引入依赖以后,可以自动注入
@SpringBootTest
class MyblogApplicationTests {
@Autowired
StringRedisTemplate redisTemplate;
@Test
void contextLoads() {
ValueOperations<String, String> ops =
redisTemplate.opsForValue();
ops.set("hello","redis"+ UUID.randomUUID().toString());
}
}
在RDM可视化工具中,可以看到我们刚刚存入的数据,说明操作成功
四、Redis传输序列化与反序列化
使用Redis时,我们一般选择用json作为数据类型进行传递
市面上很多json工具,这里以阿里的fastjson作为例子进行演示
1.引入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.72</version>
</dependency>
2.直接在业务中使用
我这里以登录作为简单的例子
public User checkUser(String username, String password) {
User user = new User();
String user1 = redisTemplate.opsForValue().get("user");
if (StringUtils.isEmpty(user1)) {
// 说明缓存中没有
user = userDao.findByUsernameAndPassword(username, SHA256Util.getSHA256StrJava(password));
// 查出来以后放一份到缓存
redisTemplate.opsForValue().set("user", JSON.toJSONString(user));
return user;
}else {
return JSON.parseObject(user1,User.class);
}
}
对照这个图进行理解,用户请求进来,先到redis中查是否有这个数据存在,如果没有就去数据库中查,查出来后放一份在缓存中再返回。如果缓存中有这个数据,则直接从缓存中拿出并返回。
PS:这里查出来的数据一定要序列化(转成json)再存入redis;
从缓存中拿出来的json字符也要反序列化转成我们要的对象再返回