ssm 项目缓存研究

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sessionsong/article/details/83988381

mybatis 一级缓存

mybatis 默认开启一级缓存
一级缓存是SqlSession级别的缓存,在操作数据库时需要构造SqlSession对象,在对象中有一个(内存区域)数据结构(hashmap)用于存储数据,不同SqlSession之间缓存的数据互不影响
注:在常见的项目当中(mybatis+spring)spring 对mybatis的sqlserssion 的使用是由 template控制的,每次查询,spring都会关闭旧的sqlSession而创建新的sqlSession,因此此时的一级缓存是没有启作用的 在开启事物之后 spring使用threadLocal获取当前资源绑定同一个sqlSession,因此此时一级缓存是有效的
优点: 默认开启,可以直接使用
缺点: 在ssm 项目当中,需求开启事物。有时候可能会得不偿失,开启事物消耗的性能可能比重新查询的高

mybatis 二级缓存

在MyBatis的全局配置settings中有一个参数 cacheEnabled , 这个参数是二级缓存的全局开关,默认为true,初始状态为启用状态。 如果设置为false ,即使后面的二级缓存配置,也不会生效。 默认为true,所以不用配置。
MyBatis的二级缓存是和命名空间绑定的,即二级缓存需要配置在Mapper.xml映射文件中或者配置在Mapper.java接口中。 在映射文件中,命名空间就是XML根节点mapper的namespace属性。 在Mapper接口中,命名空间就是接口的全限定名称。
参考:https://blog.csdn.net/yangshangwei/article/details/80223595#全局开关cacheenabled
优点:使用简单,只需要简单配置下 就可以使用
缺点:因为缓存是按照namespace 进行存储的,在做多表关联查询的时候。多张表会属于不同的namespcace ,容易出现数据脏读的情况

spring cache

Spring 3.1 引入了激动人心的基于注解(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(比如EHCache 或者 OSCache),而是一个对缓存使用的抽象,通过在既有代码中加入少量它定义的各种 annotation,即能够达到缓存方法的返回对象的效果。

Spring 的缓存技术还具备相当的灵活性。不仅能够使用 SpEL(Spring Expression Language)来定义缓存的 key 和各种 condition,还提供开箱即用的缓存暂时存储方案,也支持和主流的专业缓存比如 EHCache 集成。

其特点总结例如以下:

通过少量的配置 annotation 注解就可以使得既有代码支持缓存
支持开箱即用 Out-Of-The-Box,即不用安装和部署额外第三方组件就可以使用缓存
支持 Spring Express Language,能使用对象的不论什么属性或者方法来定义缓存的 key 和 condition
支持 AspectJ,并通过事实上现不论什么方法的缓存支持
支持自己定义 key 和自己定义缓存管理者,具有相当的灵活性和扩展性
参考: https://www.cnblogs.com/zsychanpin/p/7191021.html
优点:配置简单,容易掌握
缺点: 因为spring chace 是缓存在内存当中的,在做分布式的时候,不适用。

第三方缓存 (redis)

redis 是一款成型了的第三方缓存存储

优点: 分布式存储,可以解决以上三种存储方式存在的问题
缺点: 配置复杂,学习成本高

第四种方案 spring cahce + redis

通过spring cache 与redis 组合,及做到了分布式存储,有做到了简化代码的效果,使用简单方便,配置好了 直接使用注解就可以完成对缓存的操作
参考: https://blog.csdn.net/zzqtty/article/details/81665569

优点: 使用简单,分布式存储
缺点: 配置稍微复杂

缓存效果对比
在这里插入图片描述

总结:
1. 不加缓存的情况下,访问速度最慢,对系统的损耗也最高
2. 在并发在 100 以内 sping cache,redis,spring cache+redis 三种方式无明显差异
3. >100 redis的性能要好于 spring cache,spring cache好于 srping cache+redis
整个测试结果来看,纯用redis的效果最好,但是考虑到,只用redis 的话,需要在service 层,自己加入操作redis 缓存相关的代码,项目难度提高,耦合性也大大进度,所有在综合考虑后,感觉还是最后一种方法最后,虽然会消耗点性能。

猜你喜欢

转载自blog.csdn.net/sessionsong/article/details/83988381
今日推荐