什么是缓存(Cache)
1.定义:就是计算机内存中的一段数据
2.特点:读写快,断电即失
3.缓存解决的问题:
- 提高网站吞吐量和运行效率
- 减轻数据库访问压力
- 注意使用缓存时一定是数据库中数据极少发生修改,更多用于查询这种情况 比如收货地址等
4.本地缓存和分布式缓存区别:
- 本地缓存:存在应用服务器内存中的数据称为本地缓存
- 分布式缓存:存储在当前应用服务器内存之外的数据称为分布式缓存
- 集群:将同一种服务的多个节点放在一起共同对系统提供服务的过程称之为集群
- 分布式:有多个不同服务集群共同对系统提供服务,就称为分布式系统
利用mybatis中自身本地缓存结合redis实现分布式缓存
- mybatis中应用级缓存(二级缓存) SqlSessionFactory级别缓存 所有会话共享
- mybatis二级缓存也就是本地缓存,在xml文件中用标签开启,在第一次查询完数据库后会把数据加入到缓存中,之后查询相同的数据会先走缓存
- mybatis结合redis解决了缓存穿透的问题:如果查询了数据库中不存在的值,会在缓存中存储一个null值返回,之后无论查多少次都会返回这个null值,而不用再次经过数据库
- 查看Cache标签缓存实现:mybatis底层默认使用的是org.apache.ibatis.cache.impl.PerpetualCache实现
- 自定义RedisCache实现
- 1.通过mybatis默认Cache源码可知,可以使用自定义Cache类,通过实现Cache接口,并对里面的方法进行实现
- 2.使用RedisCache实现 《cache type=“xxxx.RedisCache” /》 (全路径名)
工具类
package com.baizhi.cache;
import com.baizhi.util.ApplicationContextUtils;
import org.apache.ibatis.cache.Cache;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
public class RedisCache implements Cache {
//当前放入缓存的mapper的namespace
private final String id;
//必须存在构造方法
public RedisCache(String id) {
System.out.println(id);
this.id = id;
}
//返回cache唯一标识