如何优雅的用Redis作为Mybatis的二级缓存?

20分钟掌握MyBatis核心用法与性能优化 MyBatis作为Java生态中广泛使用的ORM框架,通过半自动化模式实现了对象关系映射与SQL精确控制的完美平衡。其核心原理是将SQL语句与Java方法通过XML或注解进行绑定,既保留了JDBC的性能优势,又提供了面向对象的开发体验。在技术价值层面,MyBatis的动态SQL生成、插件扩展机制和灵活的缓存策略,使其特别适合需要复杂查询优化的金融、电商等高并发场景。通过基础的CRUD操作、动态SQL编写以及批量处理优化,开发者可以快速构建高效的数据访问层。结合MyBatis-Plus等增强工具,还能进一步简 阅读详情

今天在开发时发现一个奇怪的问题,我手动改完数据库竟然不生效,反复确认环境无误后猜测是缓存的问题,因为是新接手的项目,代码还不熟悉,仔细一看,是开启了二级缓存,并且存入Redis。

那今天就聊聊怎么优雅的用Redis作为Mybatis的二级缓存。

要优雅就选择Mybatis-Plus

关于Mybatis-Plus的基础设置就不多做介绍了,只说和二级缓存有关的。

首先在配置文件开启二级缓存。

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    cache-enabled: true   # 开启二级缓存
  mapper-locations: classpath:*/mapper/*.xml
复制代码

Redis配置

这部分就是Redis的基本用法:

  redis:
    host: 101.411.160.111
    database: 0
    port: 6311
    password: 1111111
复制代码

配置RedisTemplate

@Configuration
public class RedisConfig {
    /**
     * 设置系列化方式、事务等配置
     */
    @Bean
    public RedisTemplate<String, Serializable> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory)
    {
        RedisTemplate<String,Serializable> redisTemplate = new RedisTemplate<>();
​
        redisTemplate.setConnectionFactory(lettuceConnectionFactory);
        //设置key序列化方式string
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        //设置value的序列化方式json
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
​
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
​
        redisTemplate.afterPropertiesSet();
​
        return redisTemplate;
    }
}
​
复制代码

自定义Mybatis缓存

我们只需要实现Cache这个接口。

@Slf4j
public class MybatisRedisCache implements Cache {
    private static final String COMMON_CACHE_KEY = "mybatis";
    // 读写锁
    private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(true);
​
    private final RedisTemplate<String, Object> redisTemplate;
​
    private final String nameSpace;
​
    public MybatisRedisCache(String nameSpace) {
        if (nameSpace == null) {
            throw new IllegalArgumentException("Cache instances require an ID");
        }
        redisTemplate = SpringUtil.getBean("redisTemplate");
        this.nameSpace = nameSpace;
    }
​
    @Override
    public String getId() {
        return this.nameSpace;
    }
​
    private String getKeys() {
​
        return COMMON_CACHE_KEY + "::" + nameSpace + "::*";
    }
​
    private String getKey(Object key) {
        return COMMON_CACHE_KEY + "::" + nameSpace + "::" + DigestUtils.md5Hex(String.valueOf(key));
    }
​
    @Override
    public void putObject(Object key, Object value) {
        redisTemplate.opsForValue().set(getKey(key), value, 10, TimeUnit.MINUTES);
    }
​
    @Override
    public Object getObject(Object key) {
        try {
            return redisTemplate.opsForValue().get(getKey(key));
        } catch (Exception e) {
            e.printStackTrace();
            log.error("缓存出错 ");
        }
        return null;
    }
​
    @Override
    public Object removeObject(Object o) {
        Object n = redisTemplate.opsForValue().get(getKey(o));
        redisTemplate.delete(getKey(o));
        return n;
    }
​
    @Override
    public void clear() {
        Set<String> keys = redisTemplate.keys(getKeys());
        if (CollectionUtil.isNotEmpty(keys)) {
            assert keys != null;
            redisTemplate.delete(keys);
        }
    }
​
    @Override
    public int getSize() {
        Set<String> keys = redisTemplate.keys(getKeys());
        if (CollectionUtil.isNotEmpty(keys)) {
            assert keys != null;
            return keys.size();
        }
        return 0;
    }
​
    @Override
    public ReadWriteLock getReadWriteLock() {
        return this.readWriteLock;
    }
}
复制代码

测试

1.第一次查询,走数据库,并写入缓存。

看看Redis的记录:

2.第二次查询,直接走缓存

3.重启项目,依然可以直接查缓存

缓存命中率(Cache Hit Ratio)

不知道有没有细心的同学注意到这样一行日志:

Cache Hit Ratio [com.yitiao.mapper.ArticleMapper]: 0.5
复制代码

最后这个0.5就是缓存命中率,代表一共查询两次,命中一次缓存一次。

一级缓存和二级缓存

一级缓存

一级缓存 Mybatis 的一级缓存是指 SQLSession,一级缓存的作用域是 SQlSession , Mabits 默认开启一级缓存。 在同一个SqlSession中,执行相同的SQL查询时;第一次会去查询数据库,并写在缓存中,第二次会直接从缓存中取。 当执行SQL时候两次查询中间发生了增删改的操作,则SQLSession的缓存会被清空。

每次查询会先去缓存中找,如果找不到,再去数据库查询,然后把结果写到缓存中。 Mybatis的内部缓存使用一个HashMap,key为hashcode+statementId+sql语句。Value为查询出来的结果集映射成的java对象。 SqlSession执行insert、update、delete等操作commit后会清空该SQLSession缓存。

二级缓存

二级缓存 二级缓存是 mapper 级别的,Mybatis默认是没有开启二级缓存的。 第一次调用mapper下的SQL去查询用户的信息,查询到的信息会存放到该 mapper 对应的二级缓存区域。 第二次调用 namespace 下的 mapper 映射文件中,相同的sql去查询用户信息,会去对应的二级缓存内取结果。

什么时候该开启二级缓存

说实话,我遇到开启二级缓存的时候并不多,因为缓存有利也有弊。

我的建议是如果发现接口耗时严重,可以在线上开启二级缓存,开发环境关掉,为什么呢?

就拿今天我遇到的事来说,开发直接改库不能立即生效,就很烦。

最后,关注,点赞

深入解析MyBatis三级缓存:从原理到实战,规避性能陷阱与数据一致性问题 在数据库访问层,缓存是提升应用性能、降低数据库负载的核心技术之一。其基本原理是将高频访问的数据暂存于更快的存储介质中,减少对底层数据库的直接查询。从技术价值看,合理的缓存设计能显著提升系统吞吐量、降低响应延迟,是应对高并发场景的关键手段。应用场景广泛,从简单的本地会话缓存到分布式共享缓存,覆盖了不同规模与一致性要求的业务。本文聚焦于MyBatis框架内置的缓存体系,深入剖析其**一级缓存**和**二级缓存**的工作原理、适用场景与典型陷阱。通过分析**SqlSession**生命周期内的缓存行为以及跨命名空 阅读详情

相关推荐

MyBatis与MyBatis-Plus核心对比与混合使用实践

在Java持久层开发中,ORM框架是连接应用与数据库的关键技术。MyBatis作为半自动化的持久层框架,通过XML或注解配置SQL语句,提供了高度的灵活性。而MyBatis-Plus在其基础上进行了增强,通过自动生成CRUD操作显著提升开发效率。理解两者的核心差异和适用场景,对于构建高性能数据访问层至关重要。在实际企业级应用中,混合使用模式能兼顾开发效率和灵活性,特别是在处理复杂动态SQL、多租户架构和逻辑删除等场景时。掌握Lambda表达式构造器和分页插件等特性,可以优化80%的常规数据库操作,同时保留原

weixin_33701564的博客 463

mybatis plus开启二级缓存

这mybatis plus开启二级缓存里写自定义目录标题新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 mybatis plus开启二级缓存 583 收藏 3 文章标签: 数据库 mybatis 版权 开启二级缓存 myb

weixin_44643439的博客 8155

<硬件设计> 阻抗设计(二) 使用Si9000计算阻抗

阻抗设计(二) 使用Si9000计算阻抗

杰克拉力船长个人博客 1万+

【MybatisPlus】MybatisPlus开启二级缓存

MybatisPlus开启二级缓存

杜小舟的博客 2336

信贷风控分析—征信数据源

详解企业和个人征信报告,以及信贷风控之指标构造案例参考

csdnbt的博客 3644

工业模型导入Unity实战:从ProE/SolidWorks到实时渲染的完整流程

在工业仿真、数字孪生和VR/AR应用开发中,将高精度工程模型导入实时渲染引擎是一个常见的技术挑战。其核心原理在于参数化工程软件与实时渲染引擎的数据结构差异:前者基于精确的B-rep边界表示和特征树,后者依赖轻量化的三角网格与材质贴图。这一转换的技术价值在于实现工程数据的可视化与交互化,为产品展示、虚拟培训和工厂仿真等应用场景提供基础。通过数据翻译与优化流程,特别是利用3ds Max或Blender作为中转站进行网格优化与UV展开,能够有效解决模型破面、材质丢失和性能问题。本文聚焦于ProE(Creo)和So

weixin_33050117的博客 345

Springboot + Mybatis-Plus开启二级缓存

详细说明 Mybatis 的一级缓存和二级缓存的区别,并且使用实例讲述 springboot + mybatis-plus 开启二级缓存的用法;

ZwLemon 2050

基于Multisim的模电调幅发射机仿真设计

振荡器产生的高频信号的功率很小,所以有必要对高频信号进行功率放大,有利于信号的调制发射。缓冲电路将主振荡器和高频功放电路相隔离,以减小功放电路对主振荡器的影响。缓冲电路可以用射极跟随器电路来实现,其作用就是前后级的阻抗相互匹配,减小前后级的影响。总电路的仿真结果见下图:示波器1~4分别是主振荡器、缓冲电路、高频放大电路和调幅电路的输出波形。由于载波频率稳定度≤10-3,所以可以采用并联型改进电容反馈式三端振荡器(Seiler电路)谐振回路,滤除其他频率的成分,得到与载波(假设。(1)缓冲电路的设计与实现。

Eve223322的博客 4594

Mybatis-Plus用Redis做二级缓存

一,在properties或者yml文件开启二级缓存 #开启mybatis-plus二级缓存 mybatis-plus.configuration.cache-enabled=true 二,在Mapper类上添加CacheNamespace注解 @CacheNamespace(implementation= MybatisPlusRedisCache.class,eviction=MybatisPlusRedisCache.class) public interface StaffMapper..

weixin_43740023的博客 1215

实战指南:如何用Elasticsearch+Milvus搭建十亿级多模态搜索系统(含性能调优)

本文详细介绍了如何利用Elasticsearch和Milvus构建十亿级多模态搜索系统,包括架构设计、性能调优和实战部署。通过混合架构实现高效文本检索与向量相似度计算,显著提升查询性能与扩展能力,适用于大规模多模态数据处理场景。

x8y9z0的博客 1172

从标记基因到功能分析:手把手教你人工注释单细胞亚群的完整流程

本文详细介绍了人工注释单细胞亚群的完整流程,从标记基因筛选到功能分析验证,特别针对肿瘤微环境、发育轨迹等复杂场景提供解决方案。通过差异表达分析、多维数据整合和实验验证,帮助研究者准确识别细胞类型,提升单细胞转录组研究的生物学解读深度。

jenkins8butler的博客 245

Mybatis的二级缓存 (默认方式)

一级缓存是基于sqlsession级别, 当一个sqlsession会话结束, 一级缓存也就结束了. 定义一级缓存为局部缓存, 那么二级缓存就是全局全局缓存 二级缓存是基于mapper文件的namespace级别,也就是说多个sqlSession可以共享一个mapper中的二级缓存区域,并且如果两个mapper的namespace 相同,即使是两个mapper,那么这两个mapper中执行sql查询到的数据也将存在相同的二级缓存区域中。

Tomorrow 3256

SAP AI Core 高阶能力实战参考

文章摘要:本文探讨了在企业SAP架构中整合GenAI技术的工程化实践,重点分析了SAP AI Core的高阶能力应用。作者指出,企业级AI应用需解决多轮对话管理、Git同步工作流、提示词治理等核心问题,而非简单接入大模型API。技术方案展示了如何通过SAP AI Core的orchestration service管理对话历史,利用GitOps实现AI资产版本控制,并强调prompt template在审计合规中的治理价值。全文以SAP技术栈(ABAP/RAP/Fiori)为背景,阐释了AI能力与企业核心系

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 106

微服务解决方案 -- Mybatis-Plus + Redis缓存,如何不太优雅的使用Redis缓存

如何不太优雅的使用Redis缓存 我们都知道使用redis来缓存我们的数据集合,如下图所示。 通常自己去缓存数据,这样的优点就是逻辑清晰,而且redis的key和value会比较规范。但是冗余代码会比较多,需要自己进行判断数据是否过期。 为了简化业务代码,现在用注解的方式集成redis二级缓存,但是他的key和value就会比较不符合规范。他的key一共包含5个部分,最重要的就是sql和这个sql的参数。他的value就是这个查询的结果集。 准备工作 引入依赖,mybatis <dependency

LaoShiRen的博客 4212

【深度学习|学习笔记】广义线性模型Generalized linear model(GLM)模型详解,附代码。

【深度学习|学习笔记】广义线性模型Generalized linear model(GLM)模型详解,附代码。

2401_89898861的博客 1877

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

mybatis redis_微服务解决方案 MybatisPlus + Redis缓存,如何不太优雅的使用Redis缓存...

点击蓝色字免费订阅,每天收到这样的好信息前言:最近有不少粉丝关注本公众号。并且我已经成功开通了流量主同时会赚一点点广告费,我打算每个月把这部分钱拿出来给大家买点书刊,算是给大家一点福利吧。大家想买什么书扫描下方的加他拉你加群。最后,非常感谢大家的关注。如何不太优雅的使用Redis缓存我们都知道使用redis来缓存我们的数据集合,如下图所示。通常自己去缓存数据,这样的优点就是逻辑清晰,而且...

weixin_39577908的博客 337

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

MyBatis 的两级缓存机制

MyBatis缓存机制摘要 MyBatis提供两级缓存:一级缓存(SqlSession级别,默认开启)和二级缓存(Mapper级别,需手动配置)。一级缓存生命周期与SqlSession绑定,执行DML操作或会话结束时自动清空;二级缓存需实体类实现Serializable接口并通过<cache/>标签开启,同namespace下的DML操作会清空该缓存。二级缓存在分布式环境中可能出现数据不一致,建议结合Redis等中央缓存使用。高频查询且数据变动少的场景适合二级缓存,而短事务频繁查询适用一级缓存。

hhua0123的专栏 1103

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【前端必备技能java之若依框架缓存(redis)模块封装梳理与MyBatis最佳实践】

这里用了很长的篇幅进行了说明redis的封装以及MyBatis的最佳实践

leleshuo 3264

MyBatis核心原理与实战:从JDBC到持久层框架的优雅演进

在Java企业级应用开发中,数据库持久化是核心环节。JDBC作为Java连接数据库的标准API,提供了基础的数据操作能力,但其繁琐的样板代码和资源管理容易导致开发效率低下与维护困难。为了解决这些问题,ORM(对象关系映射)框架应运而生,它们通过在对象与关系数据库之间建立映射,自动化数据转换过程,从而提升开发效率并降低出错率。MyBatis作为一款半自动化的持久层框架,在ORM领域独树一帜。它并未完全屏蔽SQL,而是将SQL的编写与控制权交还给开发者,同时封装了JDBC的底层操作,如连接管理、参数设置与结果集

weixin_33695450的博客 328

MyBatis三级缓存机制深度解析:从原理到实战避坑

缓存是提升数据库访问性能的核心技术之一,其核心原理是在内存中存储热点数据副本,减少对后端数据库的直接请求,从而显著降低系统延迟与负载。在Java持久层框架中,MyBatis通过其内置的多级缓存机制,在数据一致性、性能与资源消耗之间寻求平衡。一级缓存作用于SqlSession会话内部,提供最快的响应;二级缓存扩展至Mapper命名空间,实现跨会话共享;而集成如Redis等分布式缓存框架形成的应用级缓存,则解决了分布式环境下的数据共享难题。理解各级缓存的工作原理、交互顺序及失效策略,对于优化高并发场景下的数据访

weixin_30458043的博客 288

《Java 100 天进阶之路》第86篇:MyBatis 核心原理与缓存避坑指南(2026版)

从传统 XML 到 Spring Boot 自动装配,从 #{} 防注入到动态 SQL 解析,从一级缓存陷阱到二级缓存脏读,从原生 MyBatis 到 MyBatis-Plus 效率翻倍。本文深入剖析核心组件(SqlSession、Executor、StatementHandler)、执行流程、注解开发,并结合 MyBatis-Plus 分页插件与代码生成器,助你掌握 2026 年企业级持久层框架首选方案。面试必考 + 实战避坑,一篇通透。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 6262

电商系统中的MyBatis高级应用实战

特别是调试动态SQL时,实时预览功能帮了大忙,修改后立即能看到生成的语句,效率提升非常明显。对于需要展示效果的电商页面,部署后可以直接生成可访问的链接,方便团队其他成员查看效果。标签在XML中直接配置关联查询,另一种是在代码中通过额外查询组装数据。对于电商系统,我推荐第一种方式,虽然SQL稍复杂,但能减少数据库交互次数。特别要注意缓存一致性问题,我们的做法是:在商品信息变更时,通过AOP自动清除相关缓存;特别要注意的是,对于可能为空的参数,一定要用。商品和分类的关联关系是典型的多对多场景。

IndigoNight21的博客 545

MyBatis架构原理详解

MyBatis 是 Java 生态中非常著名的一款 ORM 框架,目前在一线互联网大厂中应用广泛,Mybatis已经成为了一个必会框架。 Mybatis的功能架构分为三层:API接口层,数据处理层,基础支撑层

m0_38033199的博客 3545

Redis——(2.2)redis作为数据库和作为缓存的选择,线上怎么优雅的使用redis

简介:redis作为数据库和作为内存缓存的两种使用方法 1、redis作为数据库的使用有什么优缺点 1)优点: 没有Scheme约束,数据结构的变更相对容易,网络难一开始确定数据类型, (关系行建表时数据类型等表结构) 抗压能力强,性能极高,10万/qps 2)缺点: 没有索引,没有外键,缺少int/date...

奇点 1033
上一篇: SpringBoot 整合 Quartz 定时任务框架
下一篇: 再见 Shiro 权限认证我选择 Sa-Token:简单、优雅
程序员职业指南
博客等级 码龄4年 2138粉丝 960原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值