首页 > 数据库 >MyBatis的二级缓存整合redis

MyBatis的二级缓存整合redis

时间:2023-02-14 02:13:51浏览次数:44  
标签:IUserMapper redis mybatis 二级缓存 MyBatis java

MyBatis 自带的二级缓存存在的问题

在前面我们使用 @CacheNamespace​ 实现了 430.MyBatis的二级缓存 ,这个底层使用 HashMap​ 来实现。在 单机环境 下没有问题,但是在 分布式环境 下就不行了。

MyBatis 二级缓存在分布式环境下的问题解决

为了解决这个问题,可以使用 分布式缓存 保存 MyBatis 二级缓存的数据。

怎么自定义 MyBatis 的二级缓存

可以在 @CacheNamespace​ 上面加上 implementation , 例如,默认的缓存可以写成:

@CacheNamespace(implementation = PerpetualCache.class)

使用 redis 作为 MyBatis 的二级缓存

使用 redis 作为 MyBatis 二级缓存的步骤如下:

导入 mybatis-redis 的 pom 包

<dependency>
    <groupId>org.mybatis.caches</groupId>
    <artifactId>mybatis-redis</artifactId>
    <version>1.0.0-beta2</version>
</dependency>

修改,IUserMapper ​,加上相关注解

请参考:https://github.com/terwer/senior-java-engineer-road/blob/main/p7-skill/framework/mybatis/mybatis-annotation/src/main/java/com/terwergreen/mapper/IUserMapper.java#L25

@CacheNamespace(implementation = RedisCache.class)
public interface IUserMapper {

resource根目录 ​加上 redis.properties​ 配置文件

host=localhost
port=6379
password=
database=0

特别提醒:这里的 配置 不要写错了。

注意: 查询方法 ​也得地加上 @Options(useCache = true)​ 注解

@Options(useCache = true)
@Select("select * from user where id=#{id}")
User findUserById(Integer id);

测试:

请参考:https://github.com/terwer/senior-java-engineer-road/blob/main/p7-skill/framework/mybatis/mybatis-annotation/src/test/java/com/terwergreen/mapper/SecondCacheTest.java#L30

@Test
public void secondLevelCache() {
    SqlSession sqlSession1 = sqlSessionFactory.openSession();
    SqlSession sqlSession2 = sqlSessionFactory.openSession();

    IUserMapper userMapper1 = sqlSession1.getMapper(IUserMapper.class);
    IUserMapper userMapper2 = sqlSession2.getMapper(IUserMapper.class);

    User user1 = userMapper1.findUserById(1);
    // 清空一级缓存
    sqlSession1.close();
    User user2 = userMapper2.findUserById(1);
    System.out.println(user1 == user2);
}

结果:

Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6b81ce95]
==>  Preparing: select * from user where id=?
==> Parameters: 1(Integer)
<==    Columns: id, username, password, birthday
<==        Row: 1, lisi, 123, 2019-12-12
<==      Total: 1
Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6b81ce95]
Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6b81ce95]
Returned connection 1803669141 to pool.
Cache Hit Ratio [com.terwergreen.mapper.IUserMapper]: 0.5
false

查看 redis 缓存

标签:IUserMapper,redis,mybatis,二级缓存,MyBatis,java
From: https://www.cnblogs.com/tangyouwei/p/mybatis-s-secondary-cache-integrated-redis-z9qyjo.htm

相关文章

  • MyBatis的二级缓存整合redis
    MyBatis自带的二级缓存存在的问题在前面我们使用@CacheNamespace​实现了430.MyBatis的二级缓存,这个底层使用HashMap​来实现。在单机环境下没有问题,但是在分布......
  • MyBatis的二级缓存整合redis
    MyBatis自带的二级缓存存在的问题在前面我们使用@CacheNamespace​实现了430.MyBatis的二级缓存,这个底层使用HashMap​来实现。在单机环境下没有问题,但是在分布......
  • MyBatis的二级缓存整合redis
    MyBatis自带的二级缓存存在的问题在前面我们使用@CacheNamespace​实现了430.MyBatis的二级缓存,这个底层使用HashMap​来实现。在单机环境下没有问题,但是在分布......
  • MyBatis的二级缓存整合redis
    MyBatis自带的二级缓存存在的问题在前面我们使用@CacheNamespace​实现了430.MyBatis的二级缓存,这个底层使用HashMap​来实现。在单机环境下没有问题,但是在分布......
  • MyBatis的二级缓存整合redis
    MyBatis自带的二级缓存存在的问题在前面我们使用@CacheNamespace​实现了430.MyBatis的二级缓存,这个底层使用HashMap​来实现。在单机环境下没有问题,但是在分布......
  • Mybatis09 - 自定义映射 resultMap
    字段名与属性名不一致实体类publicclassEmp{privateIntegerempId;privateStringempName;privateIntegerage;privateStringgender;......
  • Mybatis10 - 多对一
    多表联查员工-部门一对多:员工中有一个属性存储部门对象部门-员工多对一:部门中有一个属性存储员工对象集合一次查询,通过员工id查询员工信息以及所在部门信息方法一:r......
  • Mybatis11 - 一对多
    一次查询,通过部门id查询部门信息以及该部门所有员工信息方法一:resultMap中使用collection标签,专门处理实体类集合属性的一对多关系接口类方法DeptgetDeptAndEmpBy......
  • Mybatis02 - 创建工程
    1、物理建模CREATEDATABASE`mybatis-example`;USE`mybatis-example`;CREATETABLE`t_emp`(emp_idINTAUTO_INCREMENT,emp_nameCHAR(100),emp_salaryD......
  • Mybatis04 - 核心配置文件 mybatis-config.xml
    mybatis-config.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTDConfig3.0//EN""http://mybatis.......