在上一文中,我们介绍了 MyBatis 的多级缓存。MyBatis 的二级缓存可在多个会话中共享缓存,但是这也加大了内存的使用空间,如果二级缓存空间占有量过多势必会导致程序运行空间的不足,因此我们需要将二级缓存转移到专业的缓存服务器上。
Redis 是一个高性能的 kv 数据库,被广泛的使用在缓存服务上,MyBatis 项目开发者提供了 Redis 缓存的实现。本小节我们将一起来学习如何在 MyBatis 中集成 Redis 缓存。
在项目的 pom.xml 文件中添加上 mybatis-redis 依赖:
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-redis</artifactId>
<version>1.0.0-beta2</version>
</dependency>
mybatis-redis 目前还只有 beta 版,相信不久后就可以到正式版了。
请确保你拥有一台可用的 Redis 服务器,并能够正常运行。如下:
127.0.0.1:6379> ping
PONG
在 src/main/resources 目录下新增 redis.properties 配置文件,并向其中添加如下配置:
host=localhost
port=6379
connectionTimeout=5OOO
soTimeout=5OOO
password=123456
database=O
clientName=
注意,请根据自己的环境来修改配置,如密码和主机。
在对应的 mapper 配置文件中,如 UserMapper.xml 文件添加上对应的缓存配置。如下:
<cache type="org.mybatis.caches.redis.RedisCache" />
配置好以后,我们就可以直接在程序中调用了。
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.5axxw.mybatis.mapper.UserMapper - Cache Hit Ratio [com.5axxw.mybatis.mapper.UserMapper]: 1.0
User{id=1, username='peter', age=18, score=100}
20:58:12.499 [main] DEBUG com.5axxw.mybatis.mapper.UserMapper - Cache Hit Ratio [com.5axxw.mybatis.mapper.UserMapper]: 1.0
User{id=1, username='peter', age=18, score=100}
提示: 在第一次运行时,会向 Redis 中存放数据,不会使用到缓存,第二次运行时则才会使用到缓存。