mybatisplus自定义redis二级缓存
时间: 2023-05-25 12:04:56 浏览: 249
MyBatis-Plus 支持内置的 Redis 作为二级缓存,但是可能会遇到一些不可避免的性能问题,例如大量查询时的 Redis 连接池瓶颈,Redis key 命名空间冲突等。
因此,我们可以采用自定义 Redis 缓存管理器来替代默认的 RedisCacheManager,自定义缓存管理器需要实现 org.apache.ibatis.cache.Cache 接口。
以下是自定义 Redis 缓存管理器的示例代码:
```java
public class CustomRedisCache implements Cache {
private final String id; // 缓存实例名称
private final RedisTemplate<String, Object> redisTemplate; // RedisTemplate 实例
private static final long EXPIRE_TIME_IN_SECONDS = 3600; // 缓存过期时间,单位:秒
public CustomRedisCache(String id, RedisTemplate<String, Object> redisTemplate) {
if (id == null || redisTemplate == null) {
throw new IllegalArgumentException("缓存实例名称和 RedisTemplate 实例均不能为空!");
}
this.id = id;
this.redisTemplate = redisTemplate;
}
@Override
public String getId() {
return this.id;
}
@Override
public void putObject(Object key, Object value) {
if (key == null) {
return;
}
redisTemplate.opsForValue().set(key.toString(), value, EXPIRE_TIME_IN_SECONDS, TimeUnit.SECONDS);
}
@Override
public Object getObject(Object key) {
return key == null ? null : redisTemplate.opsForValue().get(key.toString());
}
@Override
public Object removeObject(Object key) {
if (key == null) {
return null;
}
redisTemplate.delete(key.toString());
return null;
}
@Override
public void clear() {
Set<String> keys = redisTemplate.keys("*" + getId() + "*");
if (keys != null && keys.size() > 0) {
redisTemplate.delete(keys);
}
}
@Override
public int getSize() {
return redisTemplate.keys("*" + getId() + "*").size();
}
@Override
public ReadWriteLock getReadWriteLock() {
return null;
}
}
```
接下来,我们需要将自定义 Redis 缓存管理器注册到 MyBatis 中,示例代码如下:
```java
@Configuration
public class MybatisConfig {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Bean
public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean();
sqlSessionFactory.setDataSource(dataSource);
sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/*.xml"));
sqlSessionFactory.setPlugins(new Interceptor[]{new PaginationInterceptor()});
sqlSessionFactory.setCache(new CustomRedisCache("mybatis_cache", redisTemplate)); // 注册自定义缓存管理器
return sqlSessionFactory;
}
}
```
最后,我们还需要在 MyBatis-Plus 的配置文件 mybatis-plus.yml 中添加一条配置,将 MyBatis 的缓存管理器设置为自定义的缓存管理器:
```yml
mybatis-plus:
configuration:
cache-enabled: true # 允许缓存
# 使用自定义 Redis 缓存管理器
local-cache:
# 是否使用一级缓存,默认为 true
enabled: true
# 默认缓存过期时间,单位:毫秒,默认值为 -1,即永不过期
ttl: -1
# 一级缓存最大数量,默认值为 1024
size: 1024
second-cache:
# 是否使用二级缓存,默认为 true
enabled: true
# 默认缓存过期时间,单位:毫秒,默认值为 -1,即永不过期
ttl: -1
# 内置二级缓存管理器,支持Redis、Ehcache、Caffeine、H2、LevelDB、J2Cache等
cache-manager: com.baomidou.mybatisplus.extension.caches.RedisCacheManager
# 自定义二级缓存管理器,必须实现 org.apache.ibatis.cache.Cache 接口
custom-cache: com.example.CustomRedisCache
```
参考链接:
- https://mp.weixin.qq.com/s/GvF8ffYQbeytE0glCNV9Xg
阅读全文