SpringBoot缓存使用
本文最后更新于 884 天前,其中的信息可能已经有所发展或是发生改变。

SpringBoot缓存使用

JSR-107

什么是JSR-107

JSR是Java Specification Requests 的缩写 ,Java规范请求,故名思议提交Java规范,大家一同遵守这个规范的话,会让大家‘沟通’起来更加轻松, JSR-107呢就是关于如何使用缓存的规范。

JSR-107缓存规范

Java Caching定义了5个核心接口,分别是CachingProvider, CacheManager, Cache, Entry 和 Expiry。

  • CachingProvider定义了创建、配置、获取、管理和控制多个CacheManager。一个应用可以在运行期访问多个CachingProvider。
  • CacheManager定义了创建、配置、获取、管理和控制多个唯一命名的Cache,这些Cache存在于CacheManager的上下文中。一个CacheManager仅被一个CachingProvider所拥有。
  • Cache是一个类似Map的数据结构并临时存储以Key为索引的值。一个Cache仅被一个CacheManager所拥有。
  • Entry是一个存储在Cache中的key-value对。
  • Expiry 每一个存储在Cache中的条目有一个定义的有效期。一旦超过这个时间,条目为过期的状态。一旦过期,条目将不可访问、更新和删除。缓存有效期可以通过ExpiryPolicy设置

依赖包

<dependency>
    <groupId>javax.cache</groupId>
    <artifactId>cache-api</artifactId>
</dependency>

SpringBoot缓存注解

@EnableCaching

标记在主程序方法上,表示开启缓存

@Cacheable

  1. 方法运行之前,先查询Cache(缓存组件),按照cacheName指定的名字获取(CacheManager获取相应缓存),第一次获取缓存如果没有Cache组件会自会自动创建

  2. 去Cache中查找缓存的内容,使用一个key默认是方法的参数,key是按照某种策略生成的,默认是使用keyGenerator生成的,默认使用SimpleKeyGenerator生成key

    SimpleKeyGenerator生成策略:
               如果没有参数:key=new  Simlekey()
               如果有一个参数:key=参数的值
               如果有多个参数:key=new Simplekey(params)
    
  3. 没有查到缓存就调用目标方法

  4. 讲目标方法返回的结果放进缓存

核心:
1,使用CacheManager【ConcurrentMapCacheManager】按照名字得到Cache【ConcurrentMapCache】组件
2,key使用keyGenerator生成的,默认的是SimpleKeyGenerator
3,缓存运行步骤

几个属性:

cacheNames/values:指定缓存组件的名字,将方法的返回结果放在哪个缓存中,是数组的方式,可以指定多个缓存

key:缓存数据使用的key;可以用它来指定。默认是使用方法参数的值
可以用spEL表达式来表示;#id-如(getEmp[1]); 参数id的值: #a0 #p0 #root.args[0]

keyGenerator:key的生成器;可以自己指定key的生成器的组件id
key/keyGenerator:二选一使用(自己配置类)

cacheManager:指定使用哪个缓存管理器;或者cacheResolver指定获取解析器

condition:指定符合条件的情况下才缓存; 如:condition = "#a0>1" 即第一个参数值大于1时才进行缓存

unless:否定缓存;当unless指定的条件为true,方法的返回值就不会被缓存;可以获取到的结果进行判断
如: unless = “#a0”:如果第一个参数值是2,则结果不缓存 unless = “#result == null” 结果为null不缓存结合写法:
@Cacheable(cacheNames = {"emp"},keyGenerator = "myKeyGenerator",condition = "#a0>1",unless = "#a0==2") 意思为 放在的缓存名称为emp中,key的生成方式为配置的myKeyGenerator类,当第一个参数大于1时候缓存,当第一个参数等于2时不缓存
sync:缓存过期之后,如果多个线程同时请求对某个数据的访问,会同时去到数据库,导致数据库瞬间负荷增高。Spring4.3为@Cacheable注解提供了一个新的参数“sync”(boolean类型,缺省为false),当设置它为true时,只有一个线程的请求会去到数据库,其他线程都会等待直到缓存可用。这个设置可以减少对数据库的瞬间并发访问。

spl表达式

@CachePut

既调用方法,又更新缓存数据;修改了数据库的某个数据,同时又更新缓存

运行时机:

  1. 先调用目标方法
  2. 将目标方法的结果缓存起来

注意:

  • @Cacheable的key不能用#result来指定key,因为在方法开始之前就需要key
  • CachePut在更新的时候也添加了缓存,但是如果查询方法也有缓存,则更新数据时每条的缓存key需和查询时一致,
    否则会出现key不同,导致更新完数据库没有更新查询缓存

@CacheEvict

缓存清除可以通过key指定清除的数据
如果不写默认参数的值
allEntries = true (是否删除该缓存名中所有数据,默认为false)

beforeInvocation = true(缓存清除是否在方法之前执行,默认false,代表在方法执行之后执行)
false的坏处:如果方法出现异常则不会清除缓存

@Caching

制定多个缓存规则

@Cacheable 和 @CachePut 同时标注时 ,@CachePut导致还是会走方法跟数据库交互

@CacheConfig

抽取缓存公共配置,可以标注在类上

ehcache

代码示例讲解

caffeine cache

代码示例讲解

jetcache

代码示例讲解

参考资料https://blog.csdn.net/sinat_32366329/article/details/80260944

作者:Yuyy
博客:https://yuyy.info
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇