mybatis缓存源码分析之浅谈缓存设计
本文是关于mybatis缓存模块设计的读后感,关于缓存的思考,关于mybatis的缓存源码详细分析在另一篇文章:https://www.cnblogs.com/gmt-hao/p/12448896.html,欢迎大家指教。
一般我们用到缓存的时候,只知道他很快,很强,还能持久,但是为什么他可以做到这些呢,有人会说这是天赋,遗传的,是的,你想的没错,确实是大佬们在构造这些的时候,赋予他这些能力,那今天我们就来剖析一下,大佬们干了啥,区区缓存就能这么厉害。
去大厂面试的时候,面试官总会喜欢问为什么,一开始,完全搞不懂我就去拧个螺丝,你问我造火箭怎么造我咋知道,后来在工作中遇到各种各样的问题,解决不了的时候,看着身边大佬们一层层点进去看源码分析问题的时候,瞬间觉得这多牛逼啊,或许一开始有动力看源码,了解为什么就是因为这个了吧(能装逼)。说回今天的主题-缓存,缓存在百度上的解释就是访问速度比一般随机存取存储器(RAM)快的一种高速存储器,其实对于我们而言就是一个访问速度特别快的数据库,一般而言是一种key-value形式存储的,因为便于查找,无论是类似redis还是我们自己程序中的,其实都是一个道理,他查找快的最大秘诀还是直接在内存中操作,但是由于现在互联网发展太快,大厂的用户量太大了,所以我们已经不能满足于此,那么我们怎么样找到对应的缓存的位置,更加是需要考量的,我们不由得想想,如果是我,那么该如何去设计一个缓存呢,或许能答出来的就是基于内存放到一个map当中读写了吧,那么mybatis作为一个优秀的orm框架,他是怎么设计缓存的呢,没准我们看了之后能够收到一点启发。
mybatis的缓存分为一级和二级,他除了缓存具备的简单读写功能之外,还额外添加了阻塞、清空策略、序列化、日志等功能并让你可以做到任意组合,够豪横吧,那么豪横的能力是怎么做到的呢,我们给他添加功能很简单,但是让我们可以随意组合,好像蛮难的哈,其实我们想一想,在java编程思想当中提到过一个比继承更加推荐的就叫组合,他其实就是不直接继承父类,而是将其引入对象中,这样既可以松耦合而且也能使用父类的功能。知道了这些我们再来看一下mybatis的代码
可以看到这些都是附加的一些功能,我们进去看看他是如何添加功能的。
可以看到,就是我们之前想到的组合,我们将对象传入,并新增一些功能,不就达到了目的吗,而将这个新增之后的作为原始对象,再使用同样的方式去添加新功能,就可以达到任意组合的方式去使用,而这种方式在设计模式中被称为装饰器模式(哈哈,设计模式好像也没那么难)。
说完附加功能和设计模式,我们再看看他的最基本的功能-读写,其实最重要的就是缓存如何命中,可以看到mybatis的缓存命中,最重要的一个点就是cachekey
上图是cachekey的四个重要的参数,重写的equals也是相当的复杂,我们明明几个字符串就可以解决的问题,为啥要设计这么复杂?这不是很消耗资源吗,做这些的目的到底是啥呢,我们相信mybatis搞这么复杂绝不是为了装逼。一般来说,map的key为字符串,而mybatis支持动态sql,因此缓存的key不能仅仅通过String来表示,所以使用cachekey来封装多个影响缓存的因素,而判断两个cachekey是否相同关键是比较两个对象的hash值是否一致。每次更新数据同时也会刷新cachekey的值。我们已经知道mybatis是如何命中缓存的,其基本数据结构还是map,其实在我们自己设计缓存的时候,map也完全足够用了,像redis中双端链表,压缩列表,集合,跳表等数据结构,一般来说除了特殊情况,我们确实是不需要用到,所以对于缓存设计,也需要考虑一些其它的因素。
大家可以看下,mybatis的缓存基础数据结构是hashmap,对于一级缓存来说,由于他的作用域是当前会话,因此不会在多线程之间进行操作,不会有线程安全的问题,但是,二级缓存是跨sqlSession的,多线程并发的情况下,hashMap是肯定无法保证线程安全,所以,mybatis在设计的时候,二级缓存会加上一个synchronized装饰器,其实现就是在方法上面加synchronized关键字,他还有其他的一些装饰器比如LRU,FIFO等处理对象达到上限的清除策略,对于缓存的持久化,也是一个比较重要的话题,mybatis不像redis,他是本地缓存,随程序启动而启动,因此,没有做缓存持久化操作,但是,我们在设计缓存的时候,确实也需要考虑到这一点是否需要。
缓存的设计确实学问很大,本人才疏学浅,只能简单聊聊自己对于这方面的理解,看了mybatis的源码,才知道设计模式为啥这么被推崇,希望以后自己能走得更远吧!!!
mybatis缓存源码分析之浅谈缓存设计的更多相关文章
- Spring源码分析 之浅谈设计模式
一直想专门写个Spring源码的博客,工作了,可以全身性的投入到互联网行业中.虽然加班很严重,但是依然很开心.趁着凌晨有时间,总结总结. 首先spring,相信大家都很熟悉了. 1.轻量级 零配置, ...
- 【JDK源码分析】浅谈HashMap的原理
这篇文章给出了这样的一道面试题: 在 HashMap 中存放的一系列键值对,其中键为某个我们自定义的类型.放入 HashMap 后,我们在外部把某一个 key 的属性进行更改,然后我们再用这个 key ...
- netty源码分析 - Recycler 对象池的设计
目录 一.为什么需要对象池 二.使用姿势 2.1 同线程创建回收对象 2.2 异线程创建回收对象 三.数据结构 3.1 物理数据结构图 3.2 逻辑数据结构图(重要) 四.源码分析 4.2.同线程获取 ...
- Mybatis源码分析之Cache二级缓存原理 (五)
一:Cache类的介绍 讲解缓存之前我们需要先了解一下Cache接口以及实现MyBatis定义了一个org.apache.ibatis.cache.Cache接口作为其Cache提供者的SPI(Ser ...
- mybatis源码分析之06二级缓存
上一篇整合redis框架作为mybatis的二级缓存, 该篇从源码角度去分析mybatis是如何做到的. 通过上一篇文章知道,整合redis时需要在FemaleMapper.xml中添加如下配置 &l ...
- mybatis源码分析之05一级缓存
首先需要明白,mybatis的一级缓存就是指SqlSession缓存,Map缓存! 通过前面的源码分析知道mybatis框架默认使用的是DefaultSqlSession,它是由DefaultSqlS ...
- MyBatis 3源码分析
Mybatis3.2源码分析: 一.加载配置文件. 使用SAX解析配置文件.读取xml配置文件后,调用XMLConfigBuilder.parse()方法,在parse方法中再调用parseC ...
- Mybaits 源码解析 (九)----- 全网最详细,没有之一:一级缓存和二级缓存源码分析
像Mybatis.Hibernate这样的ORM框架,封装了JDBC的大部分操作,极大的简化了我们对数据库的操作. 在实际项目中,我们发现在一个事务中查询同样的语句两次的时候,第二次没有进行数据库查询 ...
- 深度 Mybatis 3 源码分析(一)SqlSessionFactoryBuilder源码分析
MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java ...
随机推荐
- 真香!Python十大常用文件操作,轻松办公
日常对于批量处理文件的需求非常多,用Python写脚本可以非常方便地实现,但在这过程中难免会和文件打交道,第一次做会有很多文件的操作无从下手,只能找度娘. 本篇文章整理了10个Python中最常用到的 ...
- Python 带你高效创作短视频,视频创作秀到飞起!!!
近两年,抖音.快手将短视频推到风口浪尖上,要生产出高质量的视频,离不开视频剪辑这一环节:在全民剪片浪潮中,大众使用最多的剪辑软件如:Pr.FCPX.剪印.Vue 等. 视频剪辑过程中,Python 一 ...
- locust的使用
一.简介 Locust是一款使用Python编写的压力测试工具,本篇总结会介绍在实际测试过程中遇到的问题 https://www.locust.io/ 使用Locust的原因是因为可以模拟的用户数量可 ...
- win7开机登录界面壁纸修改
1.选择一张自己喜欢的图(一定要是jpg格式,亲测png格式不行),分辨率最好和自己电脑的分辨率差不多. 2.将图片改名为"backgroundDefault.jpg": 3.按下 ...
- 两千星 .NET5 框架 Furion 亮点分析(一)
让 .NET 开发更简单,更通用,更流行. Furion 介绍 Furion 是基于 .NET5 平台下打造的现代化 Web 框架.旨在 让 .NET 开发更简单,更通用,更流行.. Furion 非 ...
- eclipse 再见,android studio 新手入门教程(三)Github(ignore 忽略规则)的使用
上传代码到github android studio里集成了上传代码到github的功能,所以使用上还是很简单的,设置里添加账号并测试,之后就可以很方便地上传代码到github了 如果你的项目是使用a ...
- Spring Boot面试杀手锏————自动配置原理
转:https://blog.csdn.net/u014745069/article/details/83820511 引言不论在工作中,亦或是求职面试,Spring Boot已经成为我们必知必会的技 ...
- [leetcode72]166. Fraction to Recurring Decimal手动实现除法
让人火大的一道题,特殊情况很多 不过也学到了: java中int类型的最大值的绝对值比最小值的绝对值小1 int最小值的绝对值还是负的,除以-1也是 这种时候最好转为long类型进行处理 long n ...
- JavaSwing 船只停靠管理可视化(五)
JavaSwing 船只停靠管理可视化(一) JavaSwing 船只停靠管理可视化(二) JavaSwing 船只停靠管理可视化(三) JavaSwing 船只停靠管理可视化(四) JavaSwin ...
- rocketmq 架构设计
1 消息存储 消息存储是RocketMQ中最为复杂和最为重要的一部分,本节将分别从RocketMQ的消息存储整体架构.PageCache与Mmap内存映射以及RocketMQ中两种不同的刷盘方式三方面 ...