栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

mybatis自身缓存原理以及利用redis实现分布式缓存

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

mybatis自身缓存原理以及利用redis实现分布式缓存

前言:干货记录学习mybatis实际开发中缓存的使用。
 	环境: springboot2.X  +  mybatis3.x

Mybatis是一款持久层框架,它提供了一级缓存和二级缓存。

名词解释
  • 一级缓存(mybatis默认开启)
    同一个sqlSession中有效,在同一个SqlSession中,执行两次相同的sql查询,第二次不走数据库查询,而是在缓存中获取。
  • 二级缓存(需要开发者自行添加代码开启)
    二级缓存开启后,不同的sqlSession获取同一数据时,可以不走数据库查询直接从缓存中获取。
    缓存原理:PerpetualCache 的 HashMap本地缓存
二级缓存的开启
 

	


 


**注意:被缓存的对象可以被序列化和反序列化,就是实现实现Serializable接口**

使用redis替换mybatis自身的缓存实现(分布式缓存)
//功能简写了,使用时根据自己实际情况修改
public class MyRedisCache implements Cache {
    private final String id;    // 【必须】当前放入缓存的Mapper的 namespace 名称空间
    private final Map cache = new HashMap<>();
    public MyRedisCache(String id) {
        this.id = id;
    }
    // 返回cache的唯一标识
    @Override
    public String getId() {
        return id;
    }
    // 缓存放入值
    // redis --- RedisTemplate  StringRedisTemplate
    @Override
    public void putObject(Object key, Object value) {
        getRedisTemplate().opsForHash().put(key,value);
    }
    // 从缓存中获取值
    @Override
    public Object getObject(Object key) {
        return getRedisTemplate().opsForHash().get(key);
    }
    @Override
    public void clear() {
        System.out.println("清空缓存~~~");
        //清空namespace
        getRedisTemplate().delete(id.toString());//清空缓存
    }
    ... 
}

自定义缓存执行类时注意的问题
  • RedisTemplate对象是自动注入到IOC容器中,然后通过ApplicationContext对象回去容器对象。
    在Spring Boot 内部 提供接口 ApplicationContextAware 获取IOC容器ApplicationContext对象。然后通过applicationContext对象获取Redis操作对象 RedisTemplate 对象。
//用来获取springboot创建好的工厂
@Configuration
public class ApplicationContextUtils implements ApplicationContextAware {
    private static ApplicationContext applicationContext;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
    //提供在工厂中获取对象的方法 工厂中RedisTemplate 默认 name redisTemplate
    public static Object getBean(String beanName){
        return applicationContext.getBean(beanName);
    }
}
  • 通过查看源码得到mybatis做缓存时使用的是Map,那么他的key的设计就很重要了,mybatis是使用mapper的 namespace 和sql做key,我们根据实际情况自己设计,存入redis的key的策略和合适的数据结构存储值(redis的数据结构后续更新)。我使用的是hash结构,redisTemplate.opsForHash().put(namespace,key,value);
最后

感谢您的阅读,各位大佬有什么意见和问题欢迎评论区留言!
觉得文章对你有帮助记得给我点个赞,欢迎大家关注和转发文章!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/281841.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号