springboot+mybatis+redis二级缓存问题实例详解
前言
创新互联专注于睢县网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供睢县营销型网站建设,睢县网站制作、睢县网页设计、睢县网站官网定制、重庆小程序开发服务,打造睢县网络公司原创品牌,更为您提供睢县网站排名全网营销落地服务。
什么是mybatis二级缓存?
二级缓存是多个sqlsession共享的,其作用域是mapper的同一个namespace。
即,在不同的sqlsession中,相同的namespace下,相同的sql语句,并且sql模板中参数也相同的,会命中缓存。
第一次执行完毕会将数据库中查询的数据写到缓存,第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。
Mybatis默认没有开启二级缓存,需要在全局配置(mybatis-config.xml)中开启二级缓存。
本文讲述的是使用redis作为缓存,与springboot、mybatis进行集成的方法。
1、pom依赖
使用springboot redis集成包,方便redis的访问。redis客户端选用Jedis。
另外读写kv缓存会进行序列化,所以引入了一个序列化包。
org.springframework.boot spring-boot-starter-redis redis.clients jedis 2.8.0 com.alibaba fastjson 1.2.19
依赖搞定之后,下一步先调通Redis客户端。
2、Redis访问使用的Bean
增加Configuration,配置jedisConnectionFactory bean,留待后面使用。
一般来讲,也会生成了redisTemplate bean,但是在接下来的场景没有使用到。
@Configuration public class RedisConfig { @Value("${spring.redis.host}") private String host; // 篇幅受限,省略了 @Bean public JedisPoolConfig getRedisConfig(){ JedisPoolConfig config = new JedisPoolConfig(); config.setMaxIdle(maxIdle); config.setMaxTotal(maxTotal); config.setMaxWaitMillis(maxWaitMillis); config.setMinIdle(minIdle); return config; } @Bean(name = "jedisConnectionFactory") public JedisConnectionFactory getConnectionFactory(){ JedisConnectionFactory factory = new JedisConnectionFactory(); JedisPoolConfig config = getRedisConfig(); factory.setPoolConfig(config); factory.setHostName(host); factory.setPort(port); factory.setDatabase(database); factory.setPassword(password); factory.setTimeout(timeout); return factory; } @Bean(name = "redisTemplate") public RedisTemplate<?, ?> getRedisTemplate(){ RedisTemplate<?,?> template = new StringRedisTemplate(getConnectionFactory()); return template; } }
这里使用@Value读入了redis相关配置,有更简单的配置读取方式(@ConfigurationProperties(prefix=...)),可以尝试使用。
Redis相关配置如下
#redis spring.redis.host=10.93.84.53 spring.redis.port=6379 spring.redis.password=bigdata123 spring.redis.database=15 spring.redis.timeout=0 spring.redis.pool.maxTotal=8 spring.redis.pool.maxWaitMillis=1000 spring.redis.pool.maxIdle=8 spring.redis.pool.minIdle=0
Redis客户端的配置含义,这里不再讲解了。pool相关的一般都和性能有关,需要根据并发量权衡句柄、内存等资源进行设置。
Redis客户端设置好了,我们开始配置Redis作为Mybatis的缓存。
3、Mybatis Cache
这一步是最为关键的一步。实现方式是实现Mybatis的一个接口org.apache.ibatis.cache.Cache。
这个接口设计了写缓存,读缓存,销毁缓存的方式,和访问控制读写锁。
我们实现实现Cache接口的类是MybatisRedisCache。
MybatisRedisCache.java
public class MybatisRedisCache implements Cache { private static JedisConnectionFactory jedisConnectionFactory; private final String id; private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); public MybatisRedisCache(final String id) { if (id == null) { throw new IllegalArgumentException("Cache instances require an ID"); } this.id = id; } @Override public void clear() { RedisConnection connection = null; try { connection = jedisConnectionFactory.getConnection(); connection.flushDb(); connection.flushAll(); } catch (JedisConnectionException e) { e.printStackTrace(); } finally { if (connection != null) { connection.close(); } } } @Override public String getId() { return this.id; } @Override public Object getObject(Object key) { Object result = null; RedisConnection connection = null; try { connection = jedisConnectionFactory.getConnection(); RedisSerializer