前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot整合SpringCache的简单使用和介绍

SpringBoot整合SpringCache的简单使用和介绍

原创
作者头像
是小张啊喂
修改2021-05-13 15:28:54
5440
修改2021-05-13 15:28:54
举报
文章被收录于专栏:软件软件

如何使用SpringCache?

SpringBoot整合SpringCache做缓存操作,以下操作基于SpringBoot 2.4.5版本

1、首先引入SpringCache依赖

代码语言:txt
复制
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-couchbase</artifactId>
</dependency>

2、开启缓存@EnableCaching

代码语言:txt
复制
@SpringBootApplication
// 开启缓存
@EnableCaching
public class DemoSpringbootCacheApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoSpringbootCacheApplication.class, args);
    }

}

关于@EnableCaching的属性

参数

解释

proxyTargetClass

此属性设置为true将影响所有需要代理的Spring托管bean,而不仅仅是标记为@Cacheable

mode

理模式仅允许通过代理拦截呼叫。 同一类中的本地调用无法通过这种方式被拦截;在本地调用中,此类方法上的缓存注释将被忽略,因为Spring的拦器甚至不会在这种运行时场景中起作用。 对于更高级的拦截模式,请考虑将其切换为AdviceMode.ASPECTJ 。

order

指示在特定连接点上应用多个建议时,高速缓存访问程序的执行顺序。

2、服务设置缓存@CacheConfig

代码语言:txt
复制
@Service
@CacheConfig(cacheNames = "cache")
@Slf4j
public class CacheService {

    private final List<Object> users = new ArrayList<>();

    {
        User user = new User();
        user.setName("是小张啊");
        user.setAge(23);
        users.add(user);
    }

    /**
     * 测试数据是否被缓存了 经过测试发现 数据已经被缓存了
     * 但是系统重启够缓存消失
     *
     * @return
     */
    @Cacheable(cacheNames = "selectCache")
    public List<Object> select() {
        // 通过当前的这个日志来看数据是否走了缓存
        log.info("@Cacheable 读取数据 没有走缓存");
        return users;
    }
    
     /**
     * 进行数据缓存 @CachePut每次都会发生真实的方法调用 
     * 所以即使当数据已经缓存了但是方法依然会被调用
     *
     * @return
     */
    @CachePut(value = "selectCache")
    public List<Object> selectCache() {
        // 通过当前的这个日志来看数据是否走了缓存
        log.info("@CachePut 读取数据 ");
        return users;
    }
    
     /**
     * 删除缓存
     *
     * @return
     */
    @CacheEvict(cacheNames = "selectCache")
    public String delete() {
        return "已删除";
    }

}

class User {
    String name;

    Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

@CacheConfig主要用于配置该类中会用到的一些共用的缓存配置,是一个类级别的注解

参数

解释

cacheNames

用于确定目标缓存(一个或多个高速缓存),与限定符值或特定bean定义的bean名称匹配。

keyGenerator

密钥生成器

cacheManager

设置解析器和缓存管理器,并且未通过cacheResolver设置缓存解析器

cacheResolver

设置解析器和缓存管理器

@Cacheable主要针对方法配置,能够根据方法的请求参数对其结果进行缓存

参数

解释

value

和 cacheNames 作用一致

cacheNames

参考@CacheConfig的cacheNames

key

支持SpEL表达式,用于动态计算密钥

keyGenerator

参考@CacheConfig的keyGenerator

cacheManager

参考@CacheConfig的cacheManager

cacheResolver

参考@CacheConfig的cacheResolver

condition

支持SpEL表达式,用于使方法缓存成为条件

unless

SpEL表达式用于否决方法缓存与condition不同,此表达式是在调用方法后求值的,因此可以引用result

sync

如果多个线程试图为同一键加载值,则同步基础方法的调用

sync 同步带来了两个限制:1.unless()不支持2.只能指定一个缓存3.不能合并其他与缓存相关的操作

@CachePut的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存,和 @Cacheable 不同的是,它每次都会触发真实方法的调用

参数

解释

value

和 cacheNames 作用一致

cacheNames

参考@CacheConfig的cacheNames

key

支持SpEL表达式,用于动态计算密钥,默认值为"" ,这意味着所有方法参数均被视为键,除非已设置自定义keyGenerator 。

keyGenerator

参考@CacheConfig的keyGenerator

cacheManager

参考@CacheConfig的cacheManager

cacheResolver

参考@CacheConfig的cacheResolver

condition

用于使缓存放置操作成为条件。由于put操作的性质,在调用方法后将评估此表达式,因此可以引用result

unless

SpEL表达式用于否决缓存放置操作,默认值为"" ,表示永远不会否决缓存。

@CacheEvict配置于方法上,通常用在删除方法上,用来从缓存中移除对应数据

参数

解释

value

和 cacheNames 作用一致

cacheNames

参考@CacheConfig的cacheNames

key

支持SpEL表达式,用于动态计算密钥,默认值为"" ,这意味着所有方法参数均被视为键,除非已设置自定义keyGenerator 。

keyGenerator

参考@CacheConfig的keyGenerator

cacheManager

参考@CacheConfig的cacheManager

cacheResolver

参考@CacheConfig的cacheResolver

condition

用于使缓存放置操作成为条件。由于put操作的性质,在调用方法后将评估此表达式,因此可以引用result

allEntries

是否删除缓存内的所有条目。默认情况下,仅删除关联键下的值,请注意,不允许将此参数设置为true并指定key 。

beforeInvocation

在调用该方法之前是否应进行删除。将此属性设置为true ,将导致删除发生,而与方法结果无关(即,是否引发异常)默认值为false ,这意味着将在成功调用建议的方法之后(即,仅在调用未引发异常的情况下)进行缓存删除操作

喜欢编程的,请关注我的博客https://www.lzmvlog.top/

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档