zoukankan      html  css  js  c++  java
  • Spring cache 学习随笔

    相关

    Spring框架支持透明地向应用程序添加缓存。从本质上讲,抽象将缓存应用于方法,从而根据缓存中可用的信息减少执行次数。缓存逻辑应用透明,不会对调用者造成任何干扰。

    可以极大的提高页面响应的速度。

    cache 注解

    spring cache 提供了一组注解:

    注解 功能
    @CacheConfig 设置类级别上统一的一些常见缓存设置
    @Cacheable 缓存写入和读取
    @CacheEvict 缓存清除
    @CachePut 更新缓存
    @Caching 将多种缓存操作分组

    通用的注解属性

    value/cacheNames

    二者差不多,

    缓存名,根据此创建cache,再cache下分key-value存储,

    可以指定多个缓存名,只要有一个缓存被命中,就会返回关联的value,更新同理

    key

    缓存对象的唯一标识

    在默认情况下:

    • If no params are given, return SimpleKey.EMPTY.
    • If only one param is given, return that instance.
    • If more the one param is given, return a SimpleKey that contains all parameters.
    keyGenerator

    用于自定义的key值生成器,

    对应类KeyGenerator

    cacheManager

    指定缓存管理器

    cacheResolver

    定义如何访问缓存列表

    condition

    缓存条件,可以使用SpEL表达式指定存放缓存的条件

    unless

    于前者相反,指定不更新缓存的条件

    @Cacheable

    一般可以用在读取,查询类的操作上

    • 如果对应的缓存不存在,将结果写入缓存
    • 如果对应的缓存存在,直接读取返回

    对于多线程,sync属性可用于指示底层缓存提供程序在计算 value 时锁定缓存条目。因此,只有一个线程忙于计算 value,而其他线程将被阻塞,直到缓存中的条目更新为止

    @Cacheable(value = CACHE_NAME,key = "#root.method")
    public List<info> getAll() {}
    

    @CachePut

    必定在执行后更新缓存,不会干扰到方法执行,一般可以用在增加添加一类的操作上

    @CacheEvict

    清空指定的缓存,多了两个属性

    • allEntries 是否清空所有缓存,默认为 false。
    • **beforeInvocation **是否在方法执行前就清空,默认为 false

    可以在更改等操作后清除原先的缓存

    @CacheEvict(value = {LIBRARY_CACHE_NAME, BOOK_CACHE_NAME}, allEntries = true, beforeInvocation = true)
    public book update(Integer id, String name) {}
    

    @CacheConfig

    @CacheConfig是一个 类型级别的注解,可以配置共享的缓存名称,

    也可以配置自定义的KeyGeneratorCacheManagerCacheResolver`。

    注解在 class 上不会打开任何缓存操作。

    在方法上的配置将始终覆盖@CacheConfig上的配置。

    @Caching

    有些情况需要指定相同类型的多个注释,例如@CacheEvict@CachePut,因为不同缓存之间的条件或 key 表达式不同,@Caching允许在同一方法上使用多个嵌套的@Cacheable@CachePut@CacheEvict

    @Caching(evict = { @CacheEvict("primary"), @CacheEvict(cacheNames="secondary", key="#p0") })
    public Book importBooks(String deposit, Date date)
    

    另外

    官方文档建议只将cache注解使用在具有公共可见性的方法上,注释 protected,private 或 package-visible 方法,则不会引发错误,但带注释的方法不会显示已配置的缓存设置。

    还建议只将cache注解使用在类上,而不是接口上:
    Java annotations 不是从接口继承的事实意味着如果您使用 class-based 代理(proxy-target-class="true")或 weaving-based aspect(mode="aspectj") ,则代理和编织基础结构无法识别缓存设置,并且 object 将不会被包装在缓存代理中,这将是非常糟糕的。

    文档

    没有什么能比官方文档更适于学习的:

    官方文档

    官方文档-中文翻译

    我的博客:https://www.seyana.life/post/13

  • 相关阅读:
    感性的记录一次生活
    CF 696 A Lorenzo Von Matterhorn(二叉树,map)
    UVA 673 Parentheses Balance(栈)
    POJ 1363 Rails(栈)
    HDU 1314 Numerically Speaking(大数加减乘除+另类二十六进制互相转换)
    UVA 540 Team Queue(模拟+队列)
    HDU 1276 士兵队列训练问题(模拟)
    CF 480 B Long Jumps (map标记)
    UVA 136 Ugly Numbers
    HDU 1027 Ignatius and the Princess II
  • 原文地址:https://www.cnblogs.com/mckc/p/12449006.html
Copyright © 2011-2022 走看看