SpringBoot中使用缓存cache

冷暖自知 提交于 2020-08-15 03:25:56

1.增加maven支持

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-cache</artifactId>
</dependency>

2.入口类中开启缓存功能

@EnableCaching

3.接口中加入缓存注解

@CacheConfig(cacheNames = "role")
public interface RoleService {
	@CacheEvict(key = "#p0", allEntries = true) //清除缓存
	public Integer deleteRoleById(String[] ids);

	@CacheEvict(key = "#p0", allEntries = true)//清除缓存
	public Integer updateRoleById(Role role);

	@Cacheable(key = "#p0") //获取缓存
	public Role getRoleById(Integer id);
}

4.属性说明

@Cacheable与@Cacheput缓存注解中的属性说明

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

key:缓存数据使用的key;可以用它来指定。默认是使用方法参数的值  1-方法的返回值
	  编写SpEL; #id;参数id的值  等价于 #a0  #p0  #root.args[0]

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

cacheManager:当自己配置了CacheManager后可以指定使用哪个缓存管理器,默认使用的是Springboot自动配置的缓存管理器;或者cacheResolver指定获取解析器

condition:指定符合条件的情况下才缓存;
  (condition = "#id>0")
  (condition = "#a0>1"):第一个参数的值>1的时候才进行缓存

unless:否定缓存;当unless指定的条件为true,方法的返回值就不会被缓存;可以获取到结果进行判断
	  unless = "#result == null"
	  unless = "#a0==2":如果第一个参数的值是2,结果不缓存;
sync:是否使用异步模式,默认为同步缓存,开启异步后unless属性将不能使用
————————————————
版权声明:本文为CSDN博主「贱贱的剑剑」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m2606707610/article/details/103236436

5.属性概念说明

** 几个重要概念&缓存注解 **

Cache	缓存接口,定义缓存操作。实现有:RedisCache、EhCacheCache、ConcurrentMapCache等
CacheManager	缓存管理器,管理各种缓存(cache)组件
@Cacheable	主要针对方法配置,能够根据方法的请求参数对其进行缓存
@CacheEvict	清空缓存
@CachePut	保证方法被调用,又希望结果被缓存。
与@Cacheable区别在于是否每次都调用方法,常用于更新
@EnableCaching	开启基于注解的缓存
keyGenerator	缓存数据时key生成策略
serialize	缓存数据时value序列化策略
@CacheConfig	统一配置本类的缓存注解的属性

** @Cacheable/@CachePut/@CacheEvict 主要的参数 **

value	缓存的名称,在 spring 配置文件中定义,必须指定至少一个
例如:
@Cacheable(value=”mycache”) 或者
@Cacheable(value={”cache1”,”cache2”}
key	缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,
如果不指定,则缺省按照方法的所有参数进行组合
例如:
@Cacheable(value=”testcache”,key=”#id”)
condition	缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,
只有为 true 才进行缓存/清除缓存
例如:@Cacheable(value=”testcache”,condition=”#userName.length()>2”)
unless	否定缓存。当条件结果为TRUE时,就不会缓存。
@Cacheable(value=”testcache”,unless=”#userName.length()>2”)
allEntries
(@CacheEvict )	是否清空所有缓存内容,缺省为 false,如果指定为 true,
则方法调用后将立即清空所有缓存
例如:
@CachEvict(value=”testcache”,allEntries=true)
beforeInvocation
(@CacheEvict)	是否在方法执行前就清空,缺省为 false,如果指定为 true,
则在方法还没有执行的时候就清空缓存,缺省情况下,如果方法
执行抛出异常,则不会清空缓存
例如:
@CachEvict(value=”testcache”,beforeInvocation=true)

** SpEL上下文数据 ** Spring Cache提供了一些供我们使用的SpEL上下文数据,下表直接摘自Spring官方文档:

名称	位置	描述	示例
methodName	root对象	当前被调用的方法名	#root.methodname
method	root对象	当前被调用的方法	#root.method.name
target	root对象	当前被调用的目标对象实例	#root.target
targetClass	root对象	当前被调用的目标对象的类	#root.targetClass
args	root对象	当前被调用的方法的参数列表	#root.args[0]
caches	root对象	当前方法调用使用的缓存列表	#root.caches[0].name
Argument Name	执行上下文	当前被调用的方法的参数,如findArtisan(Artisan artisan),可以通过#artsian.id获得参数	#artsian.id
result	执行上下文	方法执行后的返回值(仅当方法执行后的判断有效,如 unless cacheEvict的beforeInvocation=false)	#result

注意:

1.当我们要使用root对象的属性作为key时我们也可以将“#root”省略,因为Spring默认使用的就是root对象的属性。 如

@Cacheable(key = "targetClass + methodName +#p0")

2.使用方法参数时我们可以直接使用“#参数名”或者“#p参数index”。 如:

@Cacheable(value="users", key="#id")

@Cacheable(value="users", key="#p0")

** SpEL提供了多种运算符 **

类型	运算符
关系	<,>,<=,>=,==,!=,lt,gt,le,ge,eq,ne
算术	+,- ,* ,/,%,^
逻辑	&&,||,!,and,or,not,between,instanceof
条件	?: (ternary),?: (elvis)
正则表达式	matches
其他类型	?.,?[…],![…],^[…],$[…]

原文链接:https://www.cnblogs.com/xiang--liu/p/9720344.html

异常信息

springboot redis  @Cacheable  java.lang.ClassCastException
	java.lang.ClassCastException: com.whb.book.entity.Book cannot be cast to com.whb.book.entity.Book
	因为热部署的依赖导致的。注释掉就可以了。
	参考:https://blog.csdn.net/qq_33101675/article/details/78231053
	
java.lang.IllegalStateException: Cannot convert com.cn.auth.po.sys.User to String. Register a Converter or override toString().
报错注解:
	@Cacheable(cacheNames = "userlist",unless ="#result==null")
	public List<User> getUserList(User user);
报错内容:
	java.lang.IllegalStateException: Cannot convert com.cn.auth.po.sys.User to String. Register a Converter or override toString().
	暂时没有找到解决办法
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!