集成Redis缓存

Redis 是一个高性能的 key-value 数据库。

MyBatis 项目开发者提供了 Redis 的 MyBatis 二级缓存实现,该项目名为 redis-cache,目前只有 beta 版本,项目地址是 https://github.com/mybatis/redis-cache

这一节将使用 MyBatis 官方提供的 redis-cache 集成 Redis 数据库,步骤如下。

  1. 添加项目依赖

    在 pom.xml 中添加如下依赖。

    <!--使用redis框架-->
    <dependency>
        <groupId>org.mybatis.caches</groupId>
        <artifactId>mybatis-redis</artifactId>
        <version>1.0.0-beta2</version>
    </dependency>

    mybatis-redis 目前只有 beta 版本。

  2. 配置 Redis

    使用 Redis 前,必须有一个 Redis 服务,有关 Redis 安装启动的相关内容,可参考如下地址中的官方文档: https://redis.io/topics/quickstart

    Redis 服务启动后,在 src/main/resources 目录下新增 redis.properties 文件。

    host=127.0.0.1
    port=6379
    connectionTimeout=5000
    soTimeout=5000
    password=
    database=0
    clientName=

    上面这几项是 redis-cache 项目提供的可以配置的参数,这里配置了服务器地址、端口和超时时间。

  3. 修改 RoleMapper.xml 中的缓存配置

    redis-cache 提供了 1 个 MyBatis 的缓存实现,org.mybatis.caches.redis.RedisCache。修改 RoleMapper.xml 中的配置如下。

    <mapper namespace="tk.mybatis.simple.mapper.RoleMapper">
        <cache type="org.mybatis.caches.readis.RedisCache" />
        <!--其它配置-->
    </mapper>

配置依然很简单,RedisCache 在保存缓存数据和获取缓存数据时,使用了 Java 的序列化和反序列化,因此还需要保证被缓存的对象必须实现 Serializable 接口。改为 RedisCache 缓存配置后,testL2Cache 测试第一次执行时会全部成功,但是如果再次执行,就会出错。这是因为 Redis 作为缓存服务器,它缓存的数据和程序(或测试)的启动无关,Redis 的缓存并不会因为应用的关闭而失效。所以再次执行时没有进行一次数据库查询,所有查询都使用缓存,测试的第一部分代码中的 role1 和 role2 都是直接从二级缓存中获取数据,因为是可读写缓存,所以不是相同的对象。

当需要分布式部署应用时,如果使用 MyBatis 自带缓存或基础的 EhCahce 缓存,分布式应用会各自拥有自己的缓存,它们之间不会共享缓存,这种方式会消耗更多的服务器资源。如果使用类似Redis的缓存服务,就可以将分布式应用连接到同一个缓存服务器,实现分布式应用间的缓存共享。

除了上一节的 EhCache 和本节的 Redis,MyBatis 官方还提供了与其他缓存框架或服务器集成的实现类,这些项目及地址如下。

  • ignite-cache:https://github.com/mybatis/ignite-cache.

  • couchbase-cache:https://github.com/mybatis/couchbase-cache.

  • caffeine-cache:https://github.com/mybatis/caffeine-cache.

  • memcached-cache:https://github.com/mybatis/memcached-cache.

  • scache-cache:https://github.com/mybatis/oscache-cache.

如果有需要,大家可以参考这两节的集成方式去集成其他的缓存框架或缓存服务器。