spring boot中本地缓存和远程缓存
引言
存储简介:最开始使用的存储结构是文件形式(如:操作系统),但这时就存在一个问题,比如:查一个大的文件的时候,就是需要全量IO(在全部文件堆中找到你需要的文件),受磁盘寻址(毫秒)和带宽的影响会很慢,所以应运而生是的数据库(如mysql),数据库通过索引和分治(一堆数据分成m块-建表)降低了复杂度,但数据库在数据量过大、高并发等场景出现时也会出现瓶颈,这时有两种解决方案,一是换高并发处理、负载均衡和分布式数据库(如:HANA-成本高),二是放缓存(纳秒)里,还有一种折中的方法就是将数据库做全量数据,1/N的热点数据放缓存,自此就产生了内存型数据库(如:redis、memcache),这样缓存就是在内存中存储的数据备份,当数据没有发生本质改变的时候,我们就不让数据的查询去数据库进行操作,而去内存中取数据,来提高效率。
项目实现背景:本地缓存 + redis远程缓存
本地缓存
一、本地缓存方法一:springbootcache
摘自其他链接原理框图如上,实现原理是启动类加@EnableCaching注解,构建privider并加载基本配置项,@Cacheable对要实现的方法结果进行缓存,调这个注解的时候会加载cache组件,注册manager,按照cacheNames查询缓存使用key,key默认是方法参数,也可以keyGenerator生成(支持自定义),第一次获取缓存如果没有缓存创建一个,调用第一次查数据库,第二次查缓存。
还有一些其他的注解如:
@CachePut:总是先执行目标方法,并将目标方法的结果保存到缓存中,一般用于更新操作。
@CacheEvict:根据指定的key或者是allEntries属性值移除缓存中特性的键值对,更详细解释可参考下方链接。
参考链接
【1】springboot cache实例:
【2】各注解详解参考
二、本地缓存方法二:jetcache
1、springcache和jetcache的区别
Spring cache:无法满足本地缓存和远程缓存同时使用,使用远程缓存时无法自动刷新
jetcache:分布式缓存和内存型缓存可以共存,可自动刷新策略
1、 jetcache的常用场景
对于更新不频繁,时效性不高,key的量不大但是访问量高的场景
2、 项目实例
引入依赖
依赖
yum文件设置配置
yum配置
启动类中加注解,@EnableMethodCache和@EnableCreateCacheAnnotation,这两个注解分别激活Cached和CreateCache注解:
CreateCache
情况一:创建缓存实例
image.png
注解内部一些默认设置
image.png
写入的时候直接put就可以了
情况二:创建方法缓存
image.png
image.png
原理也是第一次调用查数据库,第二次查缓存。
还有些其他注解如:
@CacheRefresh:自动刷新策略,可设置refresh、stopRefreshAfterLastAccess、refreshLockTimeout参数
@CacheInvalidate:缓存失效,同样可配置condition满足的情况下失效缓存。不足:不能支持是在方法调用前还是调用后将缓存失效
@CacheUpdate:缓存更新,value为缓存更新后的值。此操作是调用原方法结束后将更新缓存。详细参考下边链接
参考链接:
【1】jetcache详解:https://blog.csdn.net/codingtu/article/details/82888891
【2】配置详解:https://www.codeleading.com/article/8614404833/
三、本地缓存方法三:guava
1、springcache、jetcache和guava的区别
Guava cache:内存型缓存,占用内存,无法做分布式缓存。所以guava适合面向本地缓存的,轻量级的Cache,适合缓存少量数据场景。
2、项目实例
通过CacheBuilder构建缓存的入口,指定缓存配置参数并初始化本地缓存,CacheLoader从数据源加载数据。这里的回收采用的是基于时间的回收,expireAfterAccess指在一定时间内没有读写,会移除该key,下次取的时候从loading中取。还有其他回收方式可以参考链接【3】
调用的时候直接get即可。默认会有一些数据处理的操作,也可以自定义CacheManager注册器自己重写方法。
举例如下:
image.png
image.png
参考链接:
【1】 guava缓存实例:https://www.cnblogs.com/xhq1024/p/11174775.html
【2】 类介绍:https://blog.csdn.net/u012187218/article/details/79309202
【2】 guava的回收:https://www.jianshu.com/p/0b71b7d680c2
四、redis缓存
1、存储原理
摘自其他链接
redis作为单线程K-V(键值)型数据库,但官方给出的QPS有一百万加,因为内存型数据库还是比硬盘型数据库(mysql)快很多,这也跟它数据存取的结构有很大关系,它的底层是通过哈希表实现的,查找和操作的复杂度较低。value支持不同类型并对应不同处理方法,具体的以string类型为例,如下,最后的value是转化成SCD存储的,其他类型存储原理参考链接【3】
1、 项目实现
通过redisTemplate实现,redisTemplate支持5中数据类型(string、list、hash、set、zset),支持get、add和delete等操作。
linux上启动redis服务,springboot配置文件配置redis地址和端口。
可以调用redisTemplate默认方法,也可以自定义Manager重写get等方法。
获取缓存中数据
image.png
参考链接
【1】linux中redis安装:
【2】string存储:
【3】各种类型数据存储: