Mybatis一级缓存和二级缓存 Redis缓存
一级缓存
- Mybatis的一级缓存存放在SqlSession的生命周期,在同一个SqlSession中查询时,Mybatis会把执行的方法和参数通过算法生成缓存的键值,将键值和查询结果存入一个Map对象中。
- 如果同一个SqlSession中执行的方法和参数完全一致,那么通过算法会生成相同的键值,当Map缓存对象中已经存在改键值时,则会返回缓存中的对象。(一个SqlSession连续两次查询 得到的是同一个java对象)
- 任何的insert update delete操作都会清空一级缓存(增删改任何记录都会清空当前SqlSession的缓存)。
Spring整合Mybatis的时候一级缓存的问题:
在未开启事物的情况之下,每次查询,spring都会关闭旧的sqlSession而创建新的sqlSession,因此此时的一级缓存是没有启作用的
在开启事物的情况之下,spring使用threadLocal获取当前资源绑定同一个sqlSession,因此此时一级缓存是有效的
Spring结合Mybatis一级缓存失效的问题
二级缓存
Mybatis二级缓存可以理解为存在SqlSessionFactory的生命周期
开启二级缓存:
1.在mybatis-config.xml添加如下代码
<settings><setting name="cacheEnable" value="true"></setting></settings>
2.在对应的XXXMapper.xml的namespace下添加<cache/>元素
二级缓存特点:
SqlSession1调用getMapper获取对象user1
SqlSession1调用getMapper获取对象user2
user1和user2是同一个实例(原理同一级缓存)
如果二级配置可读写的缓存 <cache readOnly="false"/>,不同SqlSession之间通过序列化和反序列化来保证通过缓存获取数据。
SqlSession2调用getMapper获取对象user1_
SqlSession2调用getMapper获取对象user2_
user1_和user2_就是反序列化得到的结果 是不同的实例
Redis缓存一致性
Mybatis默认提供的缓存是基于Map实现的内存缓存,已经可以基本满足应用。但当需要缓存大量数据的时候可以使用Redis缓存数据库来保存Mybatis的二级缓存数据。
但MySQL和Redis是两个事物,不好做强一致性。
简单点:可以延时双删+过期时间保证最终一致性。
双删的原因是防止并发情况下 update_db的过程中 其他事物发现redis缓存是空 重新赋予了Redis的值 此时如果赋值 是错误的数据
第二次延时删除的原因是要考虑MySQL数据库主从同步的耗时(如果立即删除 有别的线程从MySQL的从库查到的数据放到Redis中 此时的从库可能是没同步的错误数据)
rm_redis
update_db
sleep xxx ms
rm_redis
转载于:https://www.cnblogs.com/ssskkk/p/11097159.html
Mybatis一级缓存和二级缓存 Redis缓存相关推荐
- python使用redis做缓存_python实现类redis缓存
越来越觉得的缓存是计算机科学里最NB的发明(没有之一), 现在项目用的是redis做的缓存, 它的两个特性用的蛮顺手的: 键值查找功能 缓存可设置过期时间 突突然的,觉得用python也可以简单的模拟 ...
- java redis缓存清除_java基础-redis缓存篇
Redis的数据类型 Redis总共支持5种数据类型,分别是: 类型 说明,命令 String set ,get Hash HMSET myhash field1 "Hello" ...
- php cache缓存 购物车,Yii2使用Redis缓存购物车等数据
服务器配置Redis Redis下载安装配置 wget http://download.redis.io/releases/redis-stable.tar.gz tar -xvf redis-sta ...
- java redis缓存使用_java使用redis缓存数据库
开始在 Java 中使用 Redis 前, 我们需要确保已经安装了 redis 服务及 Java redis 驱动,maven配置如下 redis.clients jedis 2.9.0 Redis ...
- MyBatis 使用 Redis 缓存
1. 前言 在上一文中,我们介绍了 MyBatis 的多级缓存.MyBatis 的二级缓存可在多个会话中共享缓存,但是这也加大了内存的使用空间,如果二级缓存空间占有量过多势必会导致程序运行空间的不足, ...
- Redis 缓存击穿,缓存穿透,缓存雪崩原因+解决方案
一.前言 在我们日常的开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题,可是一旦涉及大数据量的需求,比如一些商品抢购的情景,或者是 ...
- Redis缓存的工作机制
Redis:缓存的工作机制 Redis缓存的工作机制 缓存的特征 Redis缓存处理请求 Redis作为旁路缓存 Redis中缓存的类型 只读缓存 读写缓存 参考文献 Redis缓存的工作机制 Red ...
- Redis 缓存穿透、雪崩、缓存数据库不一致、持久化方式、分布式锁、过期策略
1. Redis 缓存穿透 1.1 Redis 缓存穿透概念 访问了不存在的 key,缓存未命中,请求会穿透到 DB,量大时可能会对 DB 造成压力导致服务异常. 由于不恰当的业务功能实现,或者外部恶 ...
- Spring Boot Redis缓存
Spring Boot Redis缓存 目录[ 隐藏 ] 1 Spring Boot Redis缓存 1.1 Spring Boot Redis项目设置 1.2 Spring Boot Redis缓存 ...
- 使用nginx+lua脚本读写redis缓存
配置 新建spring boot项目增加redis配置 <dependency> <groupId>org.springframework.boot</groupId&g ...
最新文章
- 全球 Top 1000 计算机科学家 h 指数公布,中国顶尖计算机科学家人数进入前三
- hssfcolor 不建议使用_POI导出Excel经典实现
- mysql 快照读 幻读,InnoDB的MVCC如何解决不可重复读和快照读的幻读,当前读用next-key解决幻读...
- WINCE6.0+S3C6410的触摸屏驱动
- 【错误记录】Android Studio 编译报错 ( This Gradle plugin requires a newer IDE able to request IDE model leve )
- 恒生电子发布云计算金融应用“超云计划”
- Xcode8打包上传后构建版本消失问题
- Use Visual Studio Code to create and run Transact-SQL scripts for SQL Server
- 计算机国二笔试试题,全国计算机等考试二笔试试题(2).ppt
- More Photos
- oracle decode和case when,竟然where 后可以跟着decode 那也就是 where后可以跟着case when ????...
- pandas实现上采样和下采样
- 排列图 - QCC小组活动推行知识系列介绍(三)
- 网课题库接口搭建步骤
- 实习测试的一个月总结与心得
- 三层交换机光模块故障排除流程
- Windows server DHCP服务器搭建
- mysqloffset什么意思_重新认识Mysql的LIMIT OFFSET
- GFPGAN:老旧照片的面部恢复神器
- 22. 地下城与勇士