mybatis plus中怎么将redis作为二级缓存
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,今天就跟大家聊聊有关mybatis plus中怎么将redis作为二级缓存,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1. mybatis-
千家信息网最后更新 2025年12月02日mybatis plus中怎么将redis作为二级缓存
今天就跟大家聊聊有关mybatis plus中怎么将redis作为二级缓存,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
1. mybatis-plus开启二级缓存
mybatis-plus.configuration.cache-enabled=true
2. 定义RedisTemplate的bean交给spring管理,这里为了能将对象直接存取到redis中,进行了一些序列化的操作
@Bean(value = "redisTemplate") public RedisTemplateredisTemplate(RedisConnectionFactory connectionFactory) { RedisTemplate redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(connectionFactory); //Use Jackson 2Json RedisSerializer to serialize and deserialize the value of redis (default JDK serialization) Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); //将类名称序列化到json串中 objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); //设置输入时忽略JSON字符串中存在而Java对象实际没有的属性 objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); jackson2JsonRedisSerializer.setObjectMapper(objectMapper); //Use String RedisSerializer to serialize and deserialize the key value of redis RedisSerializer redisSerializer = new StringRedisSerializer(); //key redisTemplate.setKeySerializer(redisSerializer); redisTemplate.setHashKeySerializer(redisSerializer); //value redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer); redisTemplate.afterPropertiesSet(); return redisTemplate; }
3. 自定义自己的缓存管理
package com.qctchina.headsetserver.config;import com.qctchina.headsetserver.util.SpringUtil;import lombok.extern.slf4j.Slf4j;import org.apache.ibatis.cache.Cache;import org.springframework.data.redis.connection.RedisServerCommands;import org.springframework.data.redis.core.RedisCallback;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.util.CollectionUtils;import java.util.Set;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock;/** * @author shuangyueliao * @create 2019/9/10 14:02 * @Version 0.1 */@Slf4jpublic class MybatisRedisCache implements Cache { // 读写锁 private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(true); //这里使用了redis缓存,使用springboot自动注入 private RedisTemplate redisTemplate; private String id; public MybatisRedisCache(final String id) { if (id == null) { throw new IllegalArgumentException("Cache instances require an ID"); } this.id = id; } @Override public String getId() { return this.id; } @Override public void putObject(Object key, Object value) { if (redisTemplate == null) { //由于启动期间注入失败,只能运行期间注入,这段代码可以删除 redisTemplate = (RedisTemplate) SpringUtil.getBean("redisTemplate"); } if (value != null) { redisTemplate.opsForValue().set(key.toString(), value); } } @Override public Object getObject(Object key) { if (redisTemplate == null) { //由于启动期间注入失败,只能运行期间注入,这段代码可以删除 redisTemplate = (RedisTemplate) SpringUtil.getBean("redisTemplate"); } try { if (key != null) { return redisTemplate.opsForValue().get(key.toString()); } } catch (Exception e) { e.printStackTrace(); log.error("缓存出错 "); } return null; } @Override public Object removeObject(Object key) { if (redisTemplate == null) { //由于启动期间注入失败,只能运行期间注入,这段代码可以删除 redisTemplate = (RedisTemplate) SpringUtil.getBean("redisTemplate"); } if (key != null) { redisTemplate.delete(key.toString()); } return null; } @Override public void clear() { log.debug("清空缓存"); if (redisTemplate == null) { redisTemplate = (RedisTemplate) SpringUtil.getBean("redisTemplate"); } Set keys = redisTemplate.keys("*:" + this.id + "*"); if (!CollectionUtils.isEmpty(keys)) { redisTemplate.delete(keys); } } @Override public int getSize() { if (redisTemplate == null) { //由于启动期间注入失败,只能运行期间注入,这段代码可以删除 redisTemplate = (RedisTemplate) SpringUtil.getBean("redisTemplate"); } Long size = redisTemplate.execute((RedisCallback) RedisServerCommands::dbSize); return size.intValue(); } @Override public ReadWriteLock getReadWriteLock() { return this.readWriteLock; }} SpringUtil是手动获取bean的工具类
@Componentpublic class SpringUtil implements ApplicationContextAware { private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { SpringUtil.applicationContext = applicationContext; } public static Object getBean(String name){ return applicationContext.getBean(name); } public static T getBean(String name, Class clazz){ return applicationContext.getBean(name, clazz); } public static T getBean(Class clazz){ return applicationContext.getBean(clazz); }} 4. 在mapper上加上注解@CacheNamespace
@CacheNamespace(implementation= MybatisRedisCache.class,eviction=MybatisRedisCache.class)public interface CommonMapper extends BaseMapper{
如果调用该mapper下的方法,那么会使用redis缓存
看完上述内容,你们对mybatis plus中怎么将redis作为二级缓存有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。
缓存
代码
运行
内容
对象
序列
管理
字符
字符串
实际
属性
工具
手动
方法
更多
注解
知识
篇文章
类名
行业
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
云端数据库密码加密
禁毒教育科普展厅软件开发
不完成数据库
阿里 服务器托管
不能使用数据库主键自增
怎么把电脑做成服务器外面的网络
天津市大学生网络安全竞赛
互联网大脑如何影响科技
数据库错
常州巡检管理软件开发
朝阳区运营网络技术咨询市场报价
软件开发思维导图欣赏
武汉软件开发驻场收费报价表
数据库系统及应用新技术
雅安直销公司直销软件开发
普陀区口碑好的软件开发怎么样
军队网络安全十不准
软件开发六个阶段交付物
珠海畅达网络技术有限公司
温州运行智慧社区软件开发
西安软件开发有前途吗
网络安全等保分几级
互联网科技 翻译
fm21数据库补丁怎么用
微信服务器上的记录一般保留多久
长沙佳骏网络技术
清远仓库管理软件开发
计算机网络技术缩写词
阿里域名邮箱服务器
讨论网络安全的英语作文