一级缓存

  • 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缓存相关推荐

  1. python使用redis做缓存_python实现类redis缓存

    越来越觉得的缓存是计算机科学里最NB的发明(没有之一), 现在项目用的是redis做的缓存, 它的两个特性用的蛮顺手的: 键值查找功能 缓存可设置过期时间 突突然的,觉得用python也可以简单的模拟 ...

  2. java redis缓存清除_java基础-redis缓存篇

    Redis的数据类型 Redis总共支持5种数据类型,分别是: 类型 说明,命令 String set ,get Hash HMSET myhash field1 "Hello" ...

  3. php cache缓存 购物车,Yii2使用Redis缓存购物车等数据

    服务器配置Redis Redis下载安装配置 wget http://download.redis.io/releases/redis-stable.tar.gz tar -xvf redis-sta ...

  4. java redis缓存使用_java使用redis缓存数据库

    开始在 Java 中使用 Redis 前, 我们需要确保已经安装了 redis 服务及 Java redis 驱动,maven配置如下 redis.clients jedis 2.9.0 Redis ...

  5. MyBatis 使用 Redis 缓存

    1. 前言 在上一文中,我们介绍了 MyBatis 的多级缓存.MyBatis 的二级缓存可在多个会话中共享缓存,但是这也加大了内存的使用空间,如果二级缓存空间占有量过多势必会导致程序运行空间的不足, ...

  6. Redis 缓存击穿,缓存穿透,缓存雪崩原因+解决方案

    一.前言 在我们日常的开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题,可是一旦涉及大数据量的需求,比如一些商品抢购的情景,或者是 ...

  7. Redis缓存的工作机制

    Redis:缓存的工作机制 Redis缓存的工作机制 缓存的特征 Redis缓存处理请求 Redis作为旁路缓存 Redis中缓存的类型 只读缓存 读写缓存 参考文献 Redis缓存的工作机制 Red ...

  8. Redis 缓存穿透、雪崩、缓存数据库不一致、持久化方式、分布式锁、过期策略

    1. Redis 缓存穿透 1.1 Redis 缓存穿透概念 访问了不存在的 key,缓存未命中,请求会穿透到 DB,量大时可能会对 DB 造成压力导致服务异常. 由于不恰当的业务功能实现,或者外部恶 ...

  9. Spring Boot Redis缓存

    Spring Boot Redis缓存 目录[ 隐藏 ] 1 Spring Boot Redis缓存 1.1 Spring Boot Redis项目设置 1.2 Spring Boot Redis缓存 ...

  10. 使用nginx+lua脚本读写redis缓存

    配置 新建spring boot项目增加redis配置 <dependency> <groupId>org.springframework.boot</groupId&g ...

最新文章

  1. 全球 Top 1000 计算机科学家 h 指数公布,中国顶尖计算机科学家人数进入前三
  2. hssfcolor 不建议使用_POI导出Excel经典实现
  3. mysql 快照读 幻读,InnoDB的MVCC如何解决不可重复读和快照读的幻读,当前读用next-key解决幻读...
  4. WINCE6.0+S3C6410的触摸屏驱动
  5. 【错误记录】Android Studio 编译报错 ( This Gradle plugin requires a newer IDE able to request IDE model leve )
  6. 恒生电子发布云计算金融应用“超云计划”
  7. Xcode8打包上传后构建版本消失问题
  8. Use Visual Studio Code to create and run Transact-SQL scripts for SQL Server
  9. 计算机国二笔试试题,全国计算机等考试二笔试试题(2).ppt
  10. More Photos
  11. oracle decode和case when,竟然where 后可以跟着decode 那也就是 where后可以跟着case when ????...
  12. pandas实现上采样和下采样
  13. 排列图 - QCC小组活动推行知识系列介绍(三)
  14. 网课题库接口搭建步骤
  15. 实习测试的一个月总结与心得
  16. 三层交换机光模块故障排除流程
  17. Windows server DHCP服务器搭建
  18. mysqloffset什么意思_重新认识Mysql的LIMIT OFFSET
  19. GFPGAN:老旧照片的面部恢复神器
  20. 22. 地下城与勇士

热门文章

  1. 同一台电脑安装python2python3
  2. mybatis大于小于等于
  3. JTLParser-linux上jmeter的jtl文件二次分析
  4. jenkins 配置
  5. Visual Studio Code 前端调试不完全指南
  6. HDU 5410 CRB and His Birthday ——(完全背包变形)
  7. 跟我学Shiro目录贴
  8. java中可重入锁的学习总结
  9. PYTHON招聘需求与技能体系
  10. HTML5实现Word中文字全环绕图片效果