1、什么是缓存?
打个比方,图书馆是大量的书籍(数据源)的集合,当你想找一本书时,可能需要在书架上花费一些时间寻找。如果图书馆在常用书的旁边设立了一个“快速借阅区”(缓存区),那么经常需要借阅的书籍(如畅销书或教材)就会被放在这里,以便读者能够更快地找到它们。这样,读者就不需要每次都去主书架(原始数据源)上寻找这些书了,提高了效率。
2、缓存的作用
通俗的讲就是:速度快,好用!但是每个事物都是双面性的。
好作用 | 副作用 |
1. 降低后端负载 :无需每次访问后端数据库 | 1. 数据一致性成本提高 :可能存在数据库数据改变,但是缓存区数据没有改变,导致数据不一致 |
2. 提高读写效率,降低反 应时间 | 代码维护和运维成本提高 |
3、添加redis缓存
要使用hutool提供的JSONUtil,需要引入依赖:
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.17</version>
</dependency>
对于缓存对象集合,可以使用JSON.toJsonStr(String,String)手动把集合转成JSON字符串,存储在redis中,取出数据的时候使用JSON.toList(String,Class<T>),toList返回值为List<Class<T>>。
import cn.hutool.json.JSONUtil;
import com.Redis_stu.entity.Result;
import com.Redis_stu.entity.ShopType; //实体类
import com.Redis_stu.mapper.queryMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class queryShopTypeService {
@Autowired
private queryMapper mapper;
@Autowired
private StringRedisTemplate redisTemplate;
public Result query(){
//查询缓存
String jsons = redisTemplate.opsForValue().get("shopTypes");
//判断是否命中缓存
//***命中
if(jsons!=null){
//缓存的数据类型为对象
//ShopType shopTypes = JSONUtil.toBean(jsons,shopTypes.class);
//缓存的数据类型为List<ShopTpye>
List<ShopType> shopTypes = JSONUtil.toList(jsons, ShopType.class);
return Result.success(shopTypes);
}
//***没命中
//数据库查询
List<ShopType> ls = mapper.query();
String jsonList = JSONUtil.toJsonStr(ls);
//将数据加入缓存
redisTemplate.opsForValue().set("shopTypes",jsonList);
return Result.success(ls);
}
}