为什么使用缓存? 比如一个复杂的计算结果,一次数据库访问取得的数据等耗时耗资源的数据就能放入缓存,目的就是为了节省开销,我们要用有限的资源(CPU,内存,带宽等等)尽量做最多的事情。...(value=”mycache”)key缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合 例如:@Cacheable(value=”testcache...需要注意的是:该参数与key是互斥的cacheMnager用于指定使用哪个缓存管理器,非必需。只有当有多个时才需要使用cacheResolver用于指定使用那个缓存解析器,非必需。...当条件结果为TRUE时,就不会缓存。...= "test",key = "#user.id") public Person cacheableTest(User user) {} //4.使用第一个参数对象属性为key @Cacheable(
SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合 例如:@Cacheable(value=”testcache”,key=”#id”) condition 缓存的条件,可以为空,使用...root对象 当前被调用的目标对象实例 #root.target targetClass root对象 当前被调用的目标对象的类 #root.targetClass args root对象 当前被调用的方法的参数列表...(Artisan artisan),可以通过#artsian.id获得参数 #artsian.id result 执行上下文 方法执行后的返回值(仅当方法执行后的判断有效,如 unless cacheEvict...的beforeInvocation=false) #result 注意: 当我们要使用root对象的属性作为key时我们也可以将“#root”省略,因为Spring默认使用的就是root对象的属性。...如 @Cacheable(key = “targetClass + methodName +#p0”) 使用方法参数时我们可以直接使用“#参数名”或者“#p参数index”。
6.1 @Cacheable() 在findUserByUserName,findById两个方法上,我们都添加了@Cacheable(key = "#p0");这里用了@Cacheable()的一个参数...key,缓存对象存储时的key值,非必需,缺省按照函数的所有参数组合作为key值,若自己配置需使用SpEL表达式,比如:@Cacheable(key = "#p0"):意思是使用此函数第一个参数作为该缓存的...key,存入缓存中;当再次调用此方法时,若该缓存没有过期,那么当此方法的参数和这个key相同时,就会直接去找缓存;我们可以在控制台查看打印的sql来观察是否访问数据库。...- key:缓存对象存储在Map集合中的key值,非必需,缺省按照函数的所有参数组合作为key值,若自己配置需使用SpEL表达式,比如:@Cacheable(key = "#p0"):使用函数第一个参数作为缓存的...除了同@Cacheable一样的参数之外,它还有下面两个参数: - allEntries:非必需,默认为false。当为true时,会移除所有数据。
@Cacheable @Cacheable它是既可以标注在类上也可以标注在方法上,当它标记在类上的时候它表述这个类上面的所有方法都会支持缓存,同样的 当它作用在法上面时候它表示这个方法是支持缓存的。...对象的hashCode 和Equals方法是根据方法传入的参数重写的。...return new SimpleKey(params); } 上述代码还是非常好理解的分为三种情况: 方法没有参数,那就new使用一个全局空的SimpleKey对象来作为key。...方法就一个参数,就使用当前参数来作为key 方法参数大于1个,就new一个SimpleKey对象来作为key,new 这个SimpleKey的时候用传入的参数重写了SimpleKey的hashCode和...使用方法参数时我们可以直接使用“#参数名”或者“#p参数index”这也是我们比较推荐的做法: @Cacheable(value="user", key="#id") public UserDTO
springboot 自定义 cache 原理:在 SpringBoot 的 Cache 中,会默认使用 SimpleCacheManager, 生成一个 KeyGenerator(),将数据保存在 ConcurrentMap...## @Cacheable @Cacheable 的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存 @Cacheable 作用和配置方法 | 参数 解释 example value 缓存的名称...key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合 @Cacheable(value=”testcache”,key=”#userName”) condition...; condition = "#id>0" condition = "#a0>1":第一个参数的值 > 1 的时候才进行缓存 unless: 否定缓存;当 unless 指定的条件为 true,方法的返回值就不会被缓存...;可以获取到结果进行判断 unless = "#result == null"` unless = "#a0==2": 如果第一个参数的值是 2,结果不缓存; ## @CachePut @CachePut
@Cacheable的缓存名称是可以配置动态参数的,比如选择传入的参数,如下: (以下示例是使用SpEL声明,如果您不熟悉SpEL,可以阅读Spring Expression Language) @Cacheable...还可以设置根据条件判断是否需要缓存 condition:取决于给定的参数是否满足条件 unless:取决于返回值是否满足条件 以下是一个简单的例子: @Cacheable(cacheNames="book...@CachePut注解 @CachePut:当需要更新缓存而不干扰方法的运行时 ,可以使用该注解。也就是说,始终执行该方法,并将结果放入缓存,注解参数与@Cacheable相同。...这里还多了一个参数(allEntries),设置allEntries=true时,可以对整个条目进行批量删除。...实例 在springboot中怎么使用redis来作为缓存.
当改变参数时,又会继续 查询sql。...key值,若自己配置需使用SpEL表达式,比如:@Cacheable(key = "#p0"):使用函数第一个参数作为缓存的key值,更多关于SpEL表达式的详细内容可参考官方文档 condition...需要注意的是:该参数与key是互斥的 cacheManager:用于指定使用哪个缓存管理器,非必需。只有当有多个时才需要使用 cacheResolver:用于指定使用那个缓存解析器,非必需。...它的参数与@Cacheable类似,具体功能可参考上面对@Cacheable参数的解析 @CacheEvict:配置于函数上,通常用在删除方法上,用来从缓存中移除相应数据。...当为true时,会移除所有数据 beforeInvocation:非必需,默认为false,会在调用方法之后移除数据。当为true时,会在调用方法之前移除数据。
缓存数据时 key 生成策略 serialize 缓存数据时 value 序列化策略 20200916215058.png ② CacheManager 将方法的运行结果进行缓存:以后再要相同的数据...,直接从缓存中获取,不在调用方法: CacheManager 管理多个 Cache 组件的,对缓存的真正 CRUD(增删查改)操作在 Cache 组件中,每一个缓存组件有自己的唯一一个名字。...去 Cache 中查找缓存的内容,使用一个 key,默认一个 key,默认就是方法的参数; key 是按照某种策略生成的,默认是使用 keyGenerator 生成的 key: SimpleKeyGenerator...没有查到缓存就调用目标方法: 将目标方法返回的结果,放进缓存中 @Cacheable 标注的方法执行之前先来检查缓存中有没有这个数据,默认按照参数的值作为 key 去查询缓存,如果没有就运行方法并将结果放入缓存...当 unless 指定的条件为 true, 方法的返回值就不会被缓存;可以获取到结果进行判断 unless = “#result == null” unless = “#a0 ==2”: 如果第一个参数的值为
,如果不指定,则缺省按照方法的所有参数进行组合。...当条件结果为TRUE时,就不会缓存。...注意: 1、当我们要使用root对象的属性作为key时我们也可以将“#root”省略,因为Spring默认使用的就是root对象的属性。...如 @Cacheable(key = "targetClass + methodName +#p0") 2、使用方法参数时我们可以直接使用“#参数名”或者“#p参数index”。...@Cacheable注解会先查询是否已经有缓存,有会使用缓存,没有则会执行方法并缓存。
当需要重复地获取相同数据时,一次一次地请求数据库或者远程服务,导致在数据库查询或远程方法调用上消耗大量的时间,最终导致程序性能降低,这就是数据缓存要解决的问题。 ...2、常用的缓存注解 2.1 @Cacheable @Cacheable可以标记在一个方法上,也可以标记在一个类上。...当标记在一个方法上时表示该方法是支持缓存的;当标记在一个类上时则表示该类所有的方法都是支持缓存的。...需要按照SpEL编写;如果不指定,则默认按照方法的所有参数进行组合。...当标记在一个类上时,表示其中所有方法的执行都会触发缓存的清除操作。@CacheEvict可以指定的属性有value、key、conditon、allEntries和beforeInvocation。
在 springboot 中,当我们启用缓存以后,需要如果要将接入 Redis 作为缓存,就需要配置 RedisCacheManager,其他缓存组件亦同。...当没有自定义的缓存的时候,就会使用默认的 ConcurrentMapCacheManager,即将缓存存入本地的一个 Map 集合中。...#root.targetClass args root对象 当前被调用的方法的参数列表 #root.args[0]#root.参数名 caches root对象 当前方法调用使用的缓存列表 #root.caches...key:指定缓存数据的键值对的key,默认为方法参数中的值; Condition:指定缓存执行的条件; unliss:指定缓存不执行的条件; sync:指定缓存是否使用异步模式,默认同步,若异步则不支持...注意:当发生异常时,是不会清空缓存的。
@Cacheable 这个注解用于修饰方法or类,当我们访问它修饰的方法时,优先从缓存中获取,若缓存中存在,则直接获取缓存的值;缓存不存在时,执行方法,并将结果写入缓存 这个注解,有两个比较核心的设置...,可以为组件缓存的key变量;当key不设置时,使用方法参数来初始化,注意key为SpEL表达式,因此如果要写字符串时,用单引号括起来 一个简单的使用姿势 /** * 首先从缓存中查,查到之后,直接返回缓存数据...异常时,缓存会怎样? 上面的几个case,都是正常的场景,当方法抛出异常时,这个缓存表现会怎样?...@Caching: 都注解组合 上面虽说可以满足常见的缓存使用场景,但是有一个非常重要的点没有说明,缓存失效时间应该怎么设置???...一灰灰Blog 尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激 下面一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
可以标记在一个方法上,也可以标记在一个类上,当标记在一个方法上时表示该方法是支持缓存的,当标记在一个类上时则表示该类所有的方法都是支持缓存的。...对于一个支持缓存的方法,Spring会在其被调用后将其返回值缓存起来,以保证下次利用同样的参数来执行该方法时可以直接从缓存中获取结果,而不需要再次执行该方法。...Spring在缓存方法的返回值时是以键值对进行缓存的,值就是方法的返回结果。 @Cacheable可以指定三个属性,value、key和condition。...下面是几个使用参数作为key的示例 @Cacheable(value="users", key="#id") public User find(Integer id) { returnnull...当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。
,本文将针对几个常用的注解进行简单的介绍说明,有需要的小伙伴可以尝试一下 本文主要知识点: @Cacheable: 缓存存在,则使用缓存;不存在,则执行方法,并将结果塞入缓存 @CacheEvit: 失效缓存...@Cacheable 这个注解用于修饰方法or类,当我们访问它修饰的方法时,优先从缓存中获取,若缓存中存在,则直接获取缓存的值;缓存不存在时,执行方法,并将结果写入缓存 这个注解,有两个比较核心的设置...,可以为组件缓存的key变量;当key不设置时,使用方法参数来初始化,注意key为SpEL表达式,因此如果要写字符串时,用单引号括起来 一个简单的使用姿势 /** * 首先从缓存中查,查到之后,直接返回缓存数据...异常时,缓存会怎样? 上面的几个case,都是正常的场景,当方法抛出异常时,这个缓存表现会怎样?...一灰灰Blog 尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激 下面一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
中的条目有一个有效期 Spring缓存抽象 cache 定义各种操作 CacheManager 缓存管理器,管理各种缓存组件 Cache缓存接口 定义缓存操作 如:RedisCache。...EhCacheCaceh等 缓存注解 @Cacheable 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存 @CacheEvict 清空缓存 @CachePut 保证方法被调用,又希望结果被缓存...cache组件中,每一个缓存有自己唯一一个名字 key: 缓存数据时的key;可以用它来指定 默认使用方法参数的值 值就是方法的返回值 #id 代表取出取出参数id的值作为key 例如 参数传入进来...>2时才进行缓存 测试一下 第一次访问 第二次访问 可以看出并没有进行缓存 unless: 否定缓存; 当unless指定的条件为true方法的返回值就不回被缓存;可以获取到结果进行判断...@CacheEvict注解 @CacheEvict : 缓存清除 通过可以指定要清除的数据 不写默认是参数为key key = "#id"取出id为key的缓存 参数:allEntries
TinyLFU维护了近期访问记录的频率信息,作为一个过滤器,当新记录来时,只有满足TinyLFU要求的记录才可以被插入缓存。...1万零1,但是李四命名只访问了1次啊,为了解决这个问题,所以用了多个hash算法可以理解为long[][]二维数组的一个概念,比如在第一个算法张三和李四冲突了,但是在第二个,第三个中很大的概率不冲突,比如一个算法大概有...,如果不设置默认方法上所有参数都会作为key的一部分 */ String key() default ""; /** * 用来生成key,与key()不可以共用...root对象的属性作为key时我们也可以将“#root”省略,因为Spring默认使用的就是root对象的属性。...如 @Cacheable(key = "targetClass + methodName +#p0") 2.使用方法参数时我们可以直接使用“#参数名”或者“#p参数index”。
TinyLFU维护了近期访问记录的频率信息,作为一个过滤器,当新记录来时,只有满足TinyLFU要求的记录才可以被插入缓存。...1万零1,但是李四命名只访问了1次啊,为了解决这个问题,所以用了多个hash算法可以理解为long[][]二维数组的一个概念,比如在第一个算法张三和李四冲突了,但是在第二个,第三个中很大的概率不冲突,比如一个算法大概有...,如果不设置默认方法上所有参数都会作为key的一部分 */ String key() default ""; /** * 用来生成...对象的属性作为key时我们也可以将“#root”省略,因为Spring默认使用的就是root对象的属性。...如 @Cacheable(key = "targetClass + methodName +#p0") 2.使用方法参数时我们可以直接使用“#参数名”或者“#p参数index”。
,如果不指定的,那么默认使用方法参数的值,当然也是可以使用一些表达式指定这个key的值 * 1、spEL表达式: * 1、...* 3、当前目标对象的类 ----- #root.targetClass * 4、当前被调用对象的参数列表...} /** * @Caching : 这个是一个组合注解,针对一个方法逻辑中多种的缓存操作 * 1、cacheable : 一个数组,其中指定@Cacheable...,如果不指定的,那么默认使用方法参数的值,当然也是可以使用一些表达式指定这个key的值 * 1、spEL表达式: * 1、...} /** * @Caching : 这个是一个组合注解,针对一个方法逻辑中多种的缓存操作 * 1、cacheable : 一个数组,其中指定@Cacheable
在 Spring5 (SpringBoot 2.x)后,Spring 官方放弃了 Guava Cache 作为缓存机制,而是使用性能更优秀的 Caffeine 作为默认缓存组件,这对于Caffeine来说是一个很大的肯定...工作原理:频率滤波:W-TinyLFU 使用一个小型的滑动窗口记录最近访问过的对象,以捕获对象的使用频率。这个窗口内的数据被插入到一个 LFU 计数器中,该计数器基于频率清除最少使用的对象。...适应性强:W-TinyLFU 可以更好地适应工作负载的变化,因为它对频率的计数有一个时间窗口。这使得 W-TinyLFU 能够避免过多地重视早期的访问模式,并能更快地适应最近的访问模式。...@Cacheable注解,每次调用该方法时,Spring首先查找名item的cache中是否有对应id的条目。...当调用被注解的方法时,如果对应的键已经存在缓存,则不再执行方法体,而从缓存中直接返回。当方法返回null时,将不进行缓存操作。@CachePut:表示执行该方法后,其值将作为最新结果更新到缓存中。
领取专属 10元无门槛券
手把手带您无忧上云