哪些数据适合放入缓存?
即时性,数据一致性要求不高
访问量大且更新频率不高的数据(读多写少)
本地缓存,就是将缓存放到一个Map集合里面
Map存在于内存中,速度很快
但是明显不适合分布式的多个项目,
无法保证数据的一致性
分布式缓存需要将缓存提取出来,分布式多个项目之间共用,使用redis缓存中间件
使用
整合redis的相关知识
1.pom中引入redis
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.配置redis
spring:
redis:
host: 192.168.56.10
port: 6379
3.使用springboot自动配置好的StringRedisTemplate来操作redis
@Test
public void testStringRedisTemplate(){
ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();
//保存
ops.set("hello","world"+ UUID.randomUUID().toString());
//获取
String s = ops.get("hello");
log.info(s); //结果是:worlde6d1cbc1-9fe8-4a24-9264-234b88c566e5
}
4.代码中的实际应用
public Map<String, List<Catelog2Vo>> getCatelogJson(){
//1.先从缓存读取数据 -- StringRedisTemplate 存的是<String,String>类型
String catelogJson = redisTemplate.opsForValue().get("catelogJson");
if (StringUtils.isEmpty(catelogJson)){
//2.缓存中没有数据,去查数据库
Map<String, List<Catelog2Vo>> catelogJsonFromDb = getCatelogJsonFromDb();
//3.将查到的数据放入缓存,将对象转为json放到缓存中
String s = JSON.toJSONString(catelogJsonFromDb);
redisTemplate.opsForValue().set("catelogJson",s);
}
//4.如果缓存中有数据,此时存的数据是json,将json转为我们想要的对象
Map<String, List<Catelog2Vo>> result
= JSON.parseObject(catelogJson, new TypeReference<Map<String, List<Catelog2Vo>>>() {
});
return result;
}
//从数据库查询并封装分类数据
public Map<String, List<Catelog2Vo>> getCatelogJsonFromDb() {
...省略
}
5.报错以及解决
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
即先排除lettuce,再引入jedis
在项目中可以直接使用redisTemplate,那么redisTemplate和lettuce和jedis是什么关系呢?
lettuce,jedis是操作redis的底层客户端,Spring对他俩进行了再次封装,封装成了redisTemplate