mybatis如何结合redis实现二级缓存
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,这篇文章将为大家详细讲解有关mybatis如何结合redis实现二级缓存,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一:自定义mybatis缓存我们知道任何myb
千家信息网最后更新 2025年12月02日mybatis如何结合redis实现二级缓存
这篇文章将为大家详细讲解有关mybatis如何结合redis实现二级缓存,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
一:自定义mybatis缓存
我们知道任何mybatis二级缓存都需要实现一个接口,这个接口就是org.apache.ibatis.cache.Cache,代码如下:
package com.demo.spring.mybatis.cache;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.apache.ibatis.cache.Cache;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.demo.spring.mybatis.util.SerializeUtil;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
public class MybatisRedisCache implements Cache {
private static Logger logger = LoggerFactory.getLogger(MybatisRedisCache.class);
private Jedis redisClient = createReids();
private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
private String id;
public MybatisRedisCache(final String id) {
if (id == null) {
throw new IllegalArgumentException("Cache instances require an ID");
}
logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>MybatisRedisCache:id=" + id);
this.id = id;
}
@Override
public String getId() {
return this.id;
}
@Override
public int getSize() {
return Integer.valueOf(redisClient.dbSize().toString());
}
@Override
public void putObject(Object key, Object value) {
logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>putObject:" + key + "=" + value);
redisClient.set(SerializeUtil.serialize(key.toString()), SerializeUtil.serialize(value));
}
@Override
public Object getObject(Object key) {
Object value = SerializeUtil.unserialize(redisClient.get(SerializeUtil.serialize(key.toString())));
logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>getObject:" + key + "=" + value);
return value;
}
@Override
public Object removeObject(Object key) {
return redisClient.expire(SerializeUtil.serialize(key.toString()), 0);
}
@Override
public void clear() {
redisClient.flushDB();
}
@Override
public ReadWriteLock getReadWriteLock() {
return readWriteLock;
}
protected static Jedis createReids() {
JedisPool pool = new JedisPool("127.0.0.1", 6379);
return pool.getResource();
}
}以上代码很简单就是基本的Cache实现,在定义一个序列化的工具类
package com.demo.spring.mybatis.util;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class SerializeUtil {
public static byte[] serialize(Object object) {
ObjectOutputStream oos = null;
ByteArrayOutputStream baos = null;
try {
// 序列化
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
oos.writeObject(object);
byte[] bytes = baos.toByteArray();
return bytes;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static Object unserialize(byte[] bytes) {
ByteArrayInputStream bais = null;
try {
// 反序列化
bais = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bais);
return ois.readObject();
} catch (Exception e) {
}
return null;
}
}然后在mapper.xml配置
当然在主配置文件里面还需要配置如下代码,代表开启二级缓存,默认是不开启的
所以得配置和代码都已经完成了运行结果如下:

为什么第二次走的是一级缓存呢?
这个在讲二级缓存源码的时候分析过,只有当执行commit的时候才把之前查询的结果放入缓存。
打开吗redis查看如下,因为存入的是序列化的结果,不过我们隐约还是能看到一些信息到下图

关于"mybatis如何结合redis实现二级缓存"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
缓存
代码
序列
配置
篇文章
结果
就是
接口
时候
更多
不错
实用
下图
代表
信息
内容
只有
工具
文件
文章
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网上书店数据库设计报告总结
宁波信息化网络技术有哪些
网络技术职业决策结论
网络安全管理员职位表
您不能安全在服务器上
客户端请求服务器响应过程
软件开发业绩提成方案
美国服务器多IP
南通车载网络技术口碑推荐
宏观数据库中投大数据
网络安全传统意义
家庭教育网络安全直播回放
净网2020网络安全知识
服务器黑屏什么情况
卓易通北京网络技术有限公司
中职规划教材网络安全
网络安全对应的etf
平台型教学软件开发有哪些
邯郸学院网络技术专业
考网络安全研究生考数学一难吗
数据库的完整性约束规则
hp 服务器自带光盘
买打印服务器什么牌子好
河北省核酸检测数据库
金蝶管理服务器
苏州管理软件开发机构
数据库原理课程学习感悟
电厂数据库有哪些类型
华为云数据库业务总裁
学软件开发需要懂哪些软件