缓存注解 Cachealble CacheEvict CachePut 浅谈,以及conditions和ulessSpEL表达式_rediscache put和putifpresent的区别-程序员宅基地

技术标签: spring  配置  缓存  redis  

        在之前,我们采用的进程缓存可以是ConcurrentHashMap,加了锁的LinkedHashMap,WeakHashMap,以及Google guava Cache,需要自己定义或者实现缓存过期处理以及LRU等。这些本地缓存有以下缺点:①和自己业务逻辑耦合度高。②难以整合其他的缓存方案。
        spring3之后可以通过注解来配置缓存。通过很少的代码就可以提供缓存功能,让代码变得更优雅。
springframework.cache并不是一个具体的缓存方法,而是对缓存的一个抽象,支持ehcache和redis等专业的缓存方案,还可以通过Spring Expression Language(SpEL)来定义缓存的key和condition。
       比较常用的注解有“ Cacheable”,“CacheEvict”,“CachePut”。


        Cacheable:指明此方法的的结果,或者类的所有方法的结果可以被缓存,可以通过参数列表或者keyGenerator来指定缓存的key的生成规则,用SpEL来指定添加缓存的条件。
每次方法被执行,如果在缓存中发现了key,就返回缓存中相应的value,反之就会触发函数中的目标方法,并结果加入缓存。
        CacheEvict:指明某个方法或者某个类的所有方法触发清除缓存。注意缓存中加上allEntries=true使其立即清除所有缓存。
        CachePut: 指明某个方法或者某个类的所有方法触发添加缓存。与Cacheable相反,此注解总是触发目标方法,并添加到缓存


示例

	@Cacheable(value = "usercache", keyGenerator="smpkeyGenerator")
	public User getUser(String no,String name){
		LogCore.BASE.debug("invoke persistent:{},{}", no, name);
		return new User(no, name);
	}
	/**
	 * allEntries=true 是立即清除所有缓存
	 */
	@CacheEvict(value = "usercache", keyGenerator="smpkeyGenerator")
	public boolean clearUser(String no,String name){
		LogCore.BASE.debug("invoke clear:{},{}", no, name);
		return true;
	}
	@CachePut(value = "usercache", keyGenerator="smpkeyGenerator")
	public User putUser(String no, String name){
		User usr = new User(no, name);
		return usr;
	}

keyGenerator示例:

	@Bean
	public KeyGenerator smpkeyGenerator() {
		return (target, method, params)->{
			StringBuilder sb = new StringBuilder();
			sb.append(target.getClass().getSimpleName());
			Stream.of(params).forEach(sb.append("_")::append);
			return sb.toString();
		};
	}

SPEL表达式:

要想控制加入缓存的条件,可以使用SPEL表达式,可以用conditions和unless前者是对传入的参数进行筛选,后者可以对返回值进行筛选

例如:

	@Cacheable(value = "usercache", keyGenerator = "smpkeyGenerator",condition="#name!=null", unless = "#result==null")
	public User getUser(String no, String name) {
		LogCore.BASE.debug("invoke getUser:{},{}", no, name);
		if (Util.anyNonEmpty(no, name)) {
			return new User(no, name);
		}
		return null;
	}




版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/kkgbn/article/details/52116598

智能推荐

go 编译报错go tool: no such tool compile-程序员宅基地

文章浏览阅读2.3w次,点赞3次,收藏6次。问题简述: 在Ubuntu 16.04.4 LTS:使用新安装的go编译任何东西都报错。问题定位: 执行go env命令查看结果如下:ubuntu@ip-172-31-27-10:~$ go envGOARCH="amd64"GOBIN=""GOEXE=""GOHOSTARCH="amd64"GOHOSTOS="linux"GOOS="linux"GOPATH=&

eclipse对齐快捷键失败解决方法_eclipse对齐失效-程序员宅基地

文章浏览阅读2.3k次。win10中,ctrl+shift+F对齐键会失效,被微软自带的输入法的简繁体切换占用了。 我查看了下,并没找到输入法的这个热键的去除方法。只能更改eclipse的对齐键。 如图_eclipse对齐失效

Linux安装jdk笔记_openjdk8u-jdk_x64_linux_hotspot_8u312b07.tar.gz-程序员宅基地

文章浏览阅读1.5k次。Linux安装jdk下载由于Oracle下载jdk需要注册账号登录,且速度奇慢,因此可以选择国内镜像,清华镜像https://mirrors.tuna.tsinghua.edu.cn/AdoptOpenJDK/通过wget下载到linux本地wget https://mirrors.tuna.tsinghua.edu.cn/AdoptOpenJDK/8/jdk/x64/linux/OpenJDK8U-jdk_x64_linux_hotspot_8u312b07.tar.gz解压解压到/usr/_openjdk8u-jdk_x64_linux_hotspot_8u312b07.tar.gz

安居客Android项目架构演进-程序员宅基地

文章浏览阅读2w次,点赞15次,收藏64次。本文已授权微信公众号 AndroidDeveloper 独家发布。入职安居客三年从工程师到 Team Leader,见证了 Android 团队一路走来的发展历程。因此有心将这些记录下来与大家分享,也算是对自己三年来一部分工作的总结。希望对大家有所帮助,更希望能得到大家宝贵的建议。三网合并三年前入职时安居客在业务上刚完成了三网合并(新房、二手房、好租和商业地产多个平台多个网站合成现在的 anjuk

MIT 18.06 Linear Algebra 学习笔记-程序员宅基地

文章浏览阅读317次,点赞3次,收藏6次。文章目录Linear Algebra MIT 18.06Lecture 1矩阵乘列向量代表矩阵各列的线性组合Lecture 2高斯消元法高斯消元法的矩阵形式可逆矩阵Lecture 3矩阵乘法的求解矩阵的逆Gauss-Jordan消元法Lecture 4A=LU分解(假设没有行变换)Lecture 5PA=LU(存在行变换,令主元位置不为0)对称矩阵向量空间Lecture 6矩阵列空间Lecture 7矩阵的秩零空间Lecture 8Ax=b有解时b应满足的条件求Ax=b的所有解列满秩时Ax=b的解行满秩时A_18.06 linear algebra

mybatis使用mapper代理的方式操作数据库_是mybatis操作数据库还是mapper操作数据库-程序员宅基地

文章浏览阅读2.9k次,点赞2次,收藏6次。利用mapper 代理的方式操作数据库和上一篇利用传统的方式相比,不需要程序员自己创建 dao 的接口实现类(即:不需要创建userDaoImpl),而是通过 mybatis 代理的方式创建。但是要注意的开发规范: 1、usermapper.xml 文件中 mapper 的 namespace 的值要等于 dao 的接口类的地址2、userDao 方法名和 usermapper.xml_是mybatis操作数据库还是mapper操作数据库

随便推点

安装elasticsearch-6.2.4出现java.nio.file.AccessDeniedException: /data/wwwroot/elasticsearch-6.2.4/config_es 安装 accessdeniedexception jvm.options-程序员宅基地

文章浏览阅读3.2w次,点赞8次,收藏13次。java.nio.file.AccessDeniedException: /data/wwwroot/elasticsearch-6.2.4/config/jvm.options 原因:当前用户没有执行权限 解决方法: chown linux用户名 elasticsearch安装目录 -R 例如:chown ealsticsearch /data/wwwroot/elastic..._es 安装 accessdeniedexception jvm.options

解决office2007安装程序找不到 office.zh-cnSetup.xml OFFICELR.CAB OFFICEMUI.MSI OFFICEMUI.XML SET_为啥office2007安装找不到-程序员宅基地

文章浏览阅读1.3k次。安装Microsoft Office Project Standard 2007时出现了小问题,经过百度google一番后才发现安装office2007与安装vs2008有着紧密的联系我的机子之前已经安装过VS2008,所以在安装office2007时总是提示“安装程序找不到 office.zh-cn\*”(例如office.zh-cn\Setup.xml),而在安装目录下明明就有_为啥office2007安装找不到

智能反射面| 关于UPA信道建模_uniform planar array-程序员宅基地

文章浏览阅读1.6w次,点赞36次,收藏234次。前言这篇文章想讲一下 智能反射面中 UPA (uniform planar array)的信道建模。 之前在智能反射面| Matlab代码实现的信道仿真一文中, 很简略地给了一个基本的UPA仿真代码, 这篇更详细地说一下 关于 面天线 的建模。当然了, UPA并不只使用于智能反射面中, 尽管在科研方向上, 为了简化问题, 在MIMO问题中大家假设的往往都是线天线阵(ULA), 但实际中往往都是二维的UPA天线。 而在智能反射面中, 作者们实在无法睁眼说瞎话地假设智能反射面是一个线阵了, 毕竟人家名字里都_uniform planar array

visual hull可见外壳_aldo laurentini visual hull 概念-程序员宅基地

文章浏览阅读519次。visual hull用于简单、快速地获取三维模型。目前,获取三维模型的方式有:利用传统几何构造技术直接构造模型利用三维扫描设备对真实物体进行扫描,进而重建出模型利用从各个视角拍摄的真实物体的多幅图像重建模型.由图像重建三维模型技术又可分为两类:一类是通过多幅深度图像重建模型,另一类是通过多幅照片生成物体的可见外壳visual hull.Laurentini 最早提出了可见外壳(v..._aldo laurentini visual hull 概念

adb命令删除apk,不止是uninstall,卸载内置的app方法_adb卸载apk命令-程序员宅基地

文章浏览阅读1.9w次,点赞10次,收藏42次。用abd命令删除apk,肯定很多人都用uninstalladb uninstall 包名接下来我要讲的是通过/system/app路径来卸载,该方法卸载的是内置的app,则要找到它的路径然后才可以卸载(1):adb root //成功的话会没有显示,如果已经是root,会有英文提示(2): adb remount //remount sucessed 代表成功(3)..._adb卸载apk命令

【项目实训】UE4 C++摄像机设置_ue c++ bindaxis-程序员宅基地

文章浏览阅读1.1k次。(第三周)文章二物件创建h: UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "CameraArmComp") class USpringArmComponent* CameraArmComp;//相机臂组件 UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "CameraComp") class UCameraComponent* CameraComp;//_ue c++ bindaxis

推荐文章

热门文章

相关标签