spring boot中本地缓存和远程缓存

2021-03-03  本文已影响0人  灿烂的GL

引言

存储简介:最开始使用的存储结构是文件形式(如:操作系统),但这时就存在一个问题,比如:查一个大的文件的时候,就是需要全量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】

image.png
调用的时候直接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
获取缓存中数据
image.png
参考链接
【1】linux中redis安装:
【2】string存储:
【3】各种类型数据存储:
上一篇 下一篇

猜你喜欢

热点阅读