MyBatis 使用 Redis 缓存

1. 前言

MyBatis 缓存一节中,我们介绍了 MyBatis 的多级缓存。MyBatis 的二级缓存可在多个会话中共享缓存,但是这也加大了内存的使用空间,如果二级缓存空间占有量过多势必会导致程序运行空间的不足,因此我们需要将二级缓存转移到专业的缓存服务器上。

Redis 是一个高性能的 kv 数据库,被广泛的使用在缓存服务上,MyBatis 项目开发者提供了 Redis 缓存的实现。本小节我们将一起来学习如何在 MyBatis 中集成 Redis 缓存。

2. 准备

2.1 添加依赖

在项目的 pom.xml 文件中添加上 mybatis-redis 依赖:

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

mybatis-redis 目前还只有 beta 版,相信不久后就可以到正式版了。

2.2 Redis服务器

请确保你拥有一台可用的 Redis 服务器,并能够正常运行。如下:

127.0.0.1:6379> ping
PONG

2.3 Redis配置文件

在 src/main/resources 目录下新增 redis.properties 配置文件,并向其中添加如下配置:

host=localhost
port=6379
connectionTimeout=5OOO
soTimeout=5OOO
password=123456
database=O
clientName=

注意,请根据自己的环境来修改配置,如密码和主机。

3. 使用

3.1 配置

在对应的 mapper 配置文件中,如 UserMapper.xml 文件添加上对应的缓存配置。如下:

<cache type="org.mybatis.caches.redis.RedisCache" />

3.2 调用

配置好以后,我们就可以直接在程序中调用了。

SqlSession session1 = sqlSessionFactory.openSession();
UserMapper userMapper1 = session1.getMapper(UserMapper.class);
User user1 = userMapper1.selectUserById(1);
System.out.println(user1);
SqlSession session2 = sqlSessionFactory.openSession();
UserMapper userMapper2 = session2.getMapper(UserMapper.class);
User user2 = userMapper2.selectUserById(1);
System.out.println(user2);

注意,User 对象必须实现Serializable接口才可被缓存。 比如:

public class User implements Serializable {}

当缓存成功,程序会有如下输出,表示缓存击中。

20:58:12.462 [main] DEBUG com.imooc.mybatis.mapper.UserMapper - Cache Hit Ratio [com.imooc.mybatis.mapper.UserMapper]: 1.0
User{id=1, username='peter', age=18, score=100}
20:58:12.499 [main] DEBUG com.imooc.mybatis.mapper.UserMapper - Cache Hit Ratio [com.imooc.mybatis.mapper.UserMapper]: 1.0
User{id=1, username='peter', age=18, score=100}

提示: 在第一次运行时,会向 Redis 中存放数据,不会使用到缓存,第二次运行时则才会使用到缓存。

4. 小结

  • Redis 缓存十分常见,MyBatis 集成 Redis 缓存也异常方便,但是在实际生产环境下如此应用的都不多,而是直接选择其它方式来使用 Redis 缓存。