首页 > 其他分享 >深入浅出@Cacheable

深入浅出@Cacheable

时间:2023-08-19 21:31:36浏览次数:31  
标签:缓存 String 深入浅出 userId Cacheable key 注解

@Cacheable的使用详解,源码级别解析

在现代的应用程序中,缓存是提高性能和可扩展性的重要组成部分。Spring框架提供了@Cacheable注解来轻松地将方法结果缓存起来,以便在后续调用中快速访问。本文将详细介绍@Cacheable注解的使用方法,并从源码级别解析其实现原理。

@Cacheable注解的使用方法

@Cacheable注解可用于Spring管理的bean中的任何方法上。它可以被用来缓存方法返回的结果。当使用@Cacheable注解时,Spring会在调用方法前检查缓存中是否已经存在该方法的结果,如果存在,则直接返回缓存中的结果,而不会执行方法体中的代码。如果缓存中不存在该方法的结果,则会执行方法体中的代码,并将结果存储到缓存中,以便下次调用该方法时可以直接返回缓存中的结果。

下面是@Cacheable注解的使用示例:

@Cacheable(value="users", key="#userId")
public User getUserById(String userId) {
    // 查询数据库获取用户信息
}

上面的示例中,@Cacheable注解被用于getUserById方法上。其中value属性指定了缓存的名称为“users”,key属性指定了缓存的键为传入的userId参数。当调用getUserById方法时,Spring会先检查名为“users”的缓存中是否已经存在键为userId的结果,如果存在,则直接返回缓存中的结果,否则执行方法体中的代码,并将结果存储到缓存中。

@Cacheable注解还可以使用SpEL表达式来动态地计算缓存的键。例如:

@Cacheable(value="users", key="#user.id")
public User getUserById(User user) {
    // 查询数据库获取用户信息
}

上面的示例中,key属性使用了SpEL表达式“#user.id”,表示缓存的键为传入参数user对象的id属性值。

@Cacheable注解还支持多个键值对作为缓存的键。例如:

@Cacheable(value="users", key="#userId + '_' + #type")
public User getUserByIdAndType(String userId, String type) {
    // 查询数据库获取用户信息
}

上面的示例中,key属性使用了两个参数作为键值对,分别是userId和type。

@Cacheable注解还支持condition属性来指定是否进行缓存。例如:

@Cacheable(value="users", key="#userId", condition="#userId.length() < 10")
public User getUserById(String userId) {
    // 查询数据库获取用户信息
}

上面的示例中,condition属性使用了SpEL表达式“#userId.length() < 10”,表示只有当传入参数userId的长度小于10时才进行缓存。

@Cacheable注解还支持unless属性来指定不进行缓存的条件。例如:

@Cacheable(value="users", key="#userId", unless="#result == null")
public User getUserById(String userId) {
    // 查询数据库获取用户信息
}

上面的示例中,unless属性使用了SpEL表达式“#result == null”,表示只有当方法返回值不为null时才进行缓存。

@Cacheable注解源码分析

@Cacheable注解是Spring框架中org.springframework.cache.annotation包下的一个注解。它实际上是一个组合注解,包含了@CachePut、@CacheEvict和@Caching三个注解。

当使用@Cacheable注解时,Spring会在运行时动态地生成一个代理对象来拦截目标方法的调用。代理对象会首先检查缓存中是否已经存在该方法的结果,如果存在,则直接返回缓存中的结果,否则执行目标方法,并将结果存储到缓存中。

下面是@Cacheable注解的源码:

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Caching(cacheable = @Cacheable)
public @interface Cacheable {

    Class<?>[] value() default {};

    String[] cacheNames() default {};

    String key() default "";

    String keyGenerator() default "";

    String cacheManager() default "";

    String cacheResolver() default "";

    String condition() default "";

    String unless() default "";

    boolean sync() default false;
}

从源码可以看出,@Cacheable注解包含了value、cacheNames、key、keyGenerator、cacheManager、cacheResolver、condition、unless和sync等属性。

value和cacheNames属性用于指定缓存名称。

key和keyGenerator属性用于指定缓存键。

cacheManager和cacheResolver属性用于指定缓存管理器和缓存解析器。

condition和unless属性用于指定是否进行缓存。

sync属性用于指定是否启用同步模式。

总结

本文详细介绍了@Cacheable注解的使用方法,并从源码级别解析了其实现原理。使用@Cacheable注解可以轻松地将方法结果缓存起来,以提高应用程序的性能和可扩展性。在实际应用开发中,我们可以根据具体需求灵活地配置@Cacheable注解的各种属性来达到最佳效果。

标签:缓存,String,深入浅出,userId,Cacheable,key,注解
From: https://blog.51cto.com/yida/7152389

相关文章

  • 深入浅出node.js游戏服务器开发——Pomelo框架的设计动机与架构介绍
    一、Pomelo的定义和组成以下是Pomelo官网给出的最初定义:Pomelo是基于node.js的高性能,分布式游戏服务器框架。它包括基础的开发框架和相关的扩展组件(库和工具包),可以帮助你省去游戏开发枯燥中的重复劳动和底层逻辑的开发。Pomelo最初的设计初衷是为了游戏服务器,不过我们在设计、开......
  • 深入浅出SseEmitter
    SseEmitter详解在现代的Web应用程序中,实时数据是非常重要的。为了实现这一点,许多框架和技术被开发出来,其中包括SseEmitter。SseEmitter是一个Spring框架中的类,它允许服务器向客户端发送实时数据。SseEmitter是Spring框架中的一个类,用于实现服务器向客户端推送消息的功能。SSE代表S......
  • 【Freertos基础入门】深入浅出freertos互斥量
    @TOC前言FreeRTOS是一款开源的实时操作系统,提供了许多基本的内核对象,其中包括互斥锁(Mutex)。互斥锁是一种常用的同步机制,用于确保在同一时间内只有一个任务可以访问共享资源,防止竞态条件等并发问题。本文将介绍FreeRTOS中的互斥锁的使用方法和注意事项。一、互斥量是什么?当多个任务......
  • 深入浅出关于微服务架构实战指南:分布式系统的设计与部署技巧
    深入浅出关于微服务架构实战指南:分布式系统的设计与部署技巧微服务架构实战指南:分布式系统的设计与部署技巧摘要:随着互联网应用的快速发展,传统的单体应用架构已经无法满足高可用、可扩展、快速迭代等需求。微服务架构的出现为解决这些问题提供了一种新的思路。本文将深入探讨微......
  • @Cacheable 、 @CachePut 、@CacheEvict 注解
    在Application类上添加注解@EnableCaching@EnableCachingpublicclassApplication{publicstaticvoidmain(String[]args){SpringApplication.run(Application.class,args);}}@Cacheable注解能够让方法的返回值被缓存起来,后续的请求可以直......
  • 深入浅出 Typescript
    TypeScript是JavaScript的一个超集,支持ECMAScript6标准(ES6教程)。TypeScript由微软开发的自由和开源的编程语言。TypeScript设计目标是开发大型应用,它可以编译成纯JavaScript,编译出来的JavaScript可以运行在任何浏览器上。目录1TypeScriptVSJavaScript2TypeScri......
  • 【网工玩转自动化】深入浅出TextFSM 2022终极版
    《从零开始NetDevOps》是本人8年多的NetDevOps实战总结的一本书(且称之为书,通过公众号连载的方式,集结成册,希望有天能以实体书的方式和大家相见)。NetDevOps是指以网络工程师为主体,针对网络运维场景进行自动化开发的工作思路与模式,是2014年左右从国外刮起来的一股“网工学Python"的风......
  • 深入浅出,五次课程,带您进入数据分析的世界
    导读:程序员4大出路:业务专家,全栈开发,技术专家,技术管理。最近,了解了下“数据分析”,觉得也可以作为参考。有兴趣的朋友们,可以看下本篇文章和对应的视频。 近些年,对于分布在各个行业的企业来说,「数据」已经逐渐开始扮演越来越重要的角色,成为企业长远发展不可忽视的力量。在数据分析大......
  • 深入浅出RxJava (四:在Android中使用响应式编程)
    [url=http://blog.danlew.net/2014/10/08/grokking-rxjava-part-4/]原文链接[/url]在第1,2,3篇中,我大概介绍了RxJava是怎么使用的。下面我会介绍如何在Android中使用RxJava.RxAndroidRxAndroid是RxJava的一个针对Android平台的扩展。它包含了一些能够简化And......
  • 深入浅出大型网站架构设计:设计流程
    假如没有使用独立的数据库系统或者云数据库,而是将数据作为文件保存在服务器上活着直接暂存在内存中,那么当这个网站流量增长时,增加再多的服务器也没有用,因为关键数据只能来源于这一台本来的服务器,其他增加的服务器无法提供这个网站所需的服务。网站的扩展性:添加这个新功能,是否......