首页 > 其他分享 >Mybatis二级缓存

Mybatis二级缓存

时间:2023-09-23 13:22:06浏览次数:51  
标签:RedisMybatisCache Object 二级缓存 template Mybatis public

Mybatis二级缓存

还记得我们在学习Mybatis讲解的缓存机制吗,我们当时介绍了二级缓存,它是Mapper级别的缓存,能够作用与所有会话。但是当时我们提出了一个问题,由于Mybatis的默认二级缓存只能是单机的,如果存在多台服务器访问同一个数据库,实际上二级缓存只会在各自的服务器上生效,但是我们希望的是多台服务器都能使用同一个二级缓存,这样就不会造成过多的资源浪费。

image

我们可以将Redis作为Mybatis的二级缓存,这样就能实现多台服务器使用同一个二级缓存,因为它们只需要连接同一个Redis服务器即可,所有的缓存数据全部存储在Redis服务器上。我们需要手动实现Mybatis提供的Cache接口,这里我们简单编写一下:

//实现Mybatis的Cache接口
public class RedisMybatisCache implements Cache {

    private final String id;
    private static RedisTemplate<Object, Object> template;

   	//注意构造方法必须带一个String类型的参数接收id
    public RedisMybatisCache(String id){
        this.id = id;
    }

  	//初始化时通过配置类将RedisTemplate给过来
    public static void setTemplate(RedisTemplate<Object, Object> template) {
        RedisMybatisCache.template = template;
    }

    @Override
    public String getId() {
        return id;
    }

    @Override
    public void putObject(Object o, Object o1) {
      	//这里直接向Redis数据库中丢数据即可,o就是Key,o1就是Value,60秒为过期时间
        template.opsForValue().set(o, o1, 60, TimeUnit.SECONDS);
    }

    @Override
    public Object getObject(Object o) {
      	//这里根据Key直接从Redis数据库中获取值即可
        return template.opsForValue().get(o);
    }

    @Override
    public Object removeObject(Object o) {
      	//根据Key删除
        return template.delete(o);
    }

    @Override
    public void clear() {
      	//由于template中没封装清除操作,只能通过connection来执行
				template.execute((RedisCallback<Void>) connection -> {
          	//通过connection对象执行清空操作
            connection.flushDb();
            return null;
        });
    }

    @Override
    public int getSize() {
      	//这里也是使用connection对象来获取当前的Key数量
        return template.execute(RedisServerCommands::dbSize).intValue();
    }
}

缓存类编写完成后,我们接着来编写配置类:

@Configuration
public class MainConfiguration {
    @Resource
    RedisTemplate<Object, Object> template;

    @PostConstruct
    public void init(){
      	//把RedisTemplate给到RedisMybatisCache
        RedisMybatisCache.setTemplate(template);
    }
}

最后我们在Mapper上启用此缓存即可:

//只需要修改缓存实现类implementation为我们的RedisMybatisCache即可
@CacheNamespace(implementation = RedisMybatisCache.class)
@Mapper
public interface MainMapper {

    @Select("select name from student where sid = 1")
    String getSid();
}

最后我们提供一个测试用例来查看当前的二级缓存是否生效:

@SpringBootTest
class SpringBootTestApplicationTests {


    @Resource
    MainMapper mapper;

    @Test
    void contextLoads() {
        System.out.println(mapper.getSid());
        System.out.println(mapper.getSid());
        System.out.println(mapper.getSid());
    }

}

手动使用客户端查看Redis数据库,可以看到已经有一条Mybatis生成的缓存数据了。

标签:RedisMybatisCache,Object,二级缓存,template,Mybatis,public
From: https://www.cnblogs.com/liuzonglin/p/17724266.html

相关文章

  • Mybatis 批量插入报ORA-00933: SQL 命令未正确结束
    MySQL中,批量插入数据到表,会在一定程度提高效率。insertintotable(column1,column2)values(value1,value2),(value1,value2)对于List<Map<String,Object>>类型的参数,使用mybatis实现上面语句需要用到动态SQL–foreach。<insertid="batchInsert"> insertinto${table_na......
  • MyBatis中 # 和 $ 区别
    在使用mybatis框架开发项目编写SQL语句的时候,经常需要用到变量替换值,那么用来替换变量值的操作经常用到$和#这两个符号,同样在一些Java面试中也经常被问到它们的区别。那么它们在使用上面有什么区别呢?下面根据使用情况分析总结,两者的区别。#占位符的特点1.MyBatis处理#{}占位......
  • 02-mybatis_plus
    Mybatis_plus基础参考资料b站视频:https://www.bilibili.com/video/BV17E411N7KN/?spm_id_from=333.999.0.0&vd_source=73cf57eb7e9ae1ddd81e6b44cf95dbeb代码和笔记:https://gitee.com/kuangstudy/kuang_livenote/tree/master/【遇见狂神说】MyBatisPlus视频笔记MyBatisPlus......
  • mybatis实现多字段动态排序
    背景在复杂项目中,可能会对数据表多个字段进行排序,不理解的话可结合需求看。需求现在有一张User表男同学先按age降序排序,后按height降序排序,最后按id升序排序女同学先按age升序排序,后按weight降序排序,最后按id升序排序不合理?现实可能就是这么的不合理。实现排序对(字段......
  • Mybatis大于、小于....转义写法
    描述转义前转义后大于>&gt;大于等于>=&gt;=小于<&lt;小于等于<=&lt;=和&&amp;单引号'&apos;双引号"&quot;......
  • Mybatis 05 注解实现增删改查
    UserMapperpublicinterfaceUserMapper{/*注解实现增删改查*/@Select("select*fromtb_user")List<User>selectAll2();@Insert("insertintotb_uservalues(null,#{username},#{password},#{gender},#{addr})")voidinsert......
  • Mybatis 04 一对一,一对多,多对多关联映射
    一对一一个员工对应一个部门实体类emppackagecom.entity;importjava.io.Serializable;importjava.math.BigDecimal;publicclassEmpVoimplementsSerializable{privateIntegerempno;privateStringename;privateStringjob;privateInte......
  • MyBatis中#和$的区别
    MyBatis中#{}和${}的用法说一下为什么要写这篇文章,最近面试有被问到,一下子想不出来有啥区别,想记录一下加深自己的理解,同时自己也经常用MyBatis-Plus忽略了XML文件的编写和使用,所以需要加深一下这块的知识一、例子1、#{}将传入的数据当作一个字符串,会对传入的数据加上一个双......
  • MyBatis
    MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apachesoftwarefoundation迁移到了googlecode,并且改名为MyBatis。2013年11月迁移到Github。iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQLMaps和DataAc......
  • mybatis
    MyBatis简介(了解)什么是MyBatisMyBatis本是apache的一个开源项目iBatis,2010年这个项目由apachesoftwarefoundation迁移到了googlecode,并且改名为MyBatis。2013年11月迁移到Github。MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需......