Springboot--缓存及整合Redis

本文介绍了Spring缓存抽象,包括JSR107注解、CacheManager和Cache的基本概念,详细阐述了缓存的运行流程。接着,文章重点讨论了如何整合Redis,概述了Redis的特点,如高速读写、原子性操作、多种数据结构和持久化等。在谷粒教育整合Redis的实践中,介绍了添加依赖、配置Redis连接,以及自定义RedisCacheManager进行JSON序列化的方法,最后展示了如何在实体类和方法上使用缓存注解来实现缓存操作。
摘要由CSDN通过智能技术生成

Spring缓存抽象

包括一些JSR107的注解
CahceManager
Cache

基本概念

重要的概念&缓存注解

功能
Cache 缓存接口,定义缓存操作,实现有:RedisCache、EhCacheCache、ConcurrentMapCache等
CacheManager 缓存管理器,管理各种缓存(Cache)组件
@Cacheable 对方法结果开启缓存,根据方法的请求参数对其结果进行缓存
@CacheEvict 清空缓存
@CachePut 保证方法被调用,又希望结果被缓存 update,调用,将信息更新缓存
@EnableCaching 开启基于注解的缓存
KeyGenerator 缓存数据时key生成的策略
serialize 缓存数据时value序列化策略

注解参数说明

参数名称 功能 示例
cacheNames/value 必填,它指定了你的缓存存放在哪块命名空间 @Cacheable(value=”mycache”) 或者 @Cacheable(value={”cache1”,”cache2”}
key 缓存数据key-value 指定key的值,使用SPEL表达式 例如:@Cacheable(value=”testcache”, key=”#userName”)
condition 缓存的条件,可以为空,使用spel编写返回true或false,只有在true的时候才进行缓存或者清除缓存 @Cacheable(value=”testcache”, condition=”#userName.length()>2”)
allEntries
(@CacheEvict) 是否清空所有缓存内容,缺省为 false,如果指定为 true,则方法调用后将立即清空所有缓存 @CachEvict(value=”testcache”, allEntries=true)
beforeInvocation
(@CacheEvict) 是否在方法执行前就清空,缺省为 false,如果指定为 true,则在方法还没有执行的时候就清空缓存,缺省情况下,如果方法执行抛出异常,则不会清空缓存 @CachEvict(value=”testcache”,beforeInvocation=true)
unless (@CachePut) (@Cacheable) 用于否决缓存的,不像condition,该表达式只在方法执行之后判断,此时可以拿到返回值result进行判断。条件为true不会缓存,fasle才缓存 @Cacheable(value=”testcache”, unless=”#result == null”)

缓存SPEL表达式使用

名字 位置 描述 示例
methodName root object 当前被调用的方法名 #root.methodName
method root object 当前被调用的方法 #root.method.name
target root object 当前被调用的目标对象 #root.target
targetClass root object 当前被调用的目标对象类 #root.targetClass
args root object 当前被调用的方法的参数列表 #root.args[0]
caches root object 当前方法调用使用的缓存列表(如@Cacheable(value={“cache1”, “cache2”})),则有两个cache #root.caches[0].name
argument name evaluation context 方法参数的名字. 可以直接 #参数名 ,也可以使用 #p0或#a0 的形式,0代表参数的索引; #iban 、 #a0 、 #p0
result evaluation context 方法执行后的返回值(仅当方法执行之后的判断有效,如‘unless’,’cache put’的表达式 ’cache evict’的表达式beforeInvocation=false) #result

运行流程

@Cacheable注解

  1. 方法运行之前,先查Cache(缓存组件),按照vlalue/Cachenames的指定名字获取,
  2. 第一次获取缓存如果没有Cache组件则会自己创建Cache组件
  3. 去Cache组件中查找缓存内容,使用key(默认是方法的参数)去查找缓存值。key是按照某种策略生成的,默认是使用keyGenerator生成的,默认使用SimpleKeyGenerator生成key
  4. 查到缓存则取缓存中的值作为方法的返回值,如果没有查到缓存则调用目标方法,将目标方法的返回结果放到缓存中。

@Cacheput注解
使用该注解标志的方法,每次都会执行,并将结果存入指定的缓存中。其他方法可以直接从响应的缓存中读取缓存数据,而不需要再去查询数据库。一般用在新增方法或者修改方法上。
1、 先运行方法,再将结果缓存起来

@CacheEvict注解
使用该注解标注的方法,会情况指定的缓存,一般应用于更新或者删除方法上。

整合Redis

Redis是当前比较热门的NOSQL系统之一,它是一个开源的使用ANSI c语言编写的key-value存储系统(区别于MySQL的二维表格的形式存储。)。和Memcache类似,但很大程度补偿了Memcache的不足。和Memcache一样,Redis数据都是缓存在计算机内存中,不同的是,Memcache只能将数据缓存到内存中,无法自动定期写入硬盘,这就表示,一断电或重启,内存清空,数据丢失。所以Memcache的应用场景适用于缓存无需持久化的数据。而Redis不同的是它会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,实现数据的持久化。

Redis的特点

1,Redis读取的速度是110000次/s,写的速度是81000次/s;
2,原子 。Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
3,支持多种数据结构:string(字符串);list(列表);hash(哈希),set(集合);zset(有序集合)
4,持久化,集群部署
5,支持过期时间,支持事务,消息订阅

谷粒教育整合Redis

由于Redis缓存是公共应用会在多个微服务模块中应用,所以我们把依赖和配置全部添加到Common模块下

  1. 添加Redis整合依赖
  2. appilication.yml配置Redis连接地址
  3. 对需要缓存实体类序列化
  4. 使用RestTemplate操作redis
redisTemplate.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值