最近两天,在研究缓存相关的知识,觉得有点意思,可以分享给大家。
说说我理解的为什么要使用缓存?
前台向后台服务器第一次请求得到数据后,再次请求就不需要从数据库中取数据,而是从缓存中取。然而也不是所有的数据都可以缓存(不是不可以,要看有没有意义),只有几乎不需要修改的数据才会保存在缓存中,这样可以减少从数据库中取数据的次数,提高软件的性能。
这个缓存实现起来也非常的简单
1.添加依赖
2.在service层中添加注解,名字任意取
3.在对应的查询方法中添加注解
@Cacheable
这样子就可以了,看gif图演示:
描述:图中大概的意思是:前台向后台发送一个get请求,后台在service层中进入了事先设置好的断点,继续执行后,后台返回数据,此时就会在前台看见从数据库中取到的数据。当再次发送请求的时候,发现后台没有进之前设置的断点,而前台的数据却刷新了一遍,证明此次请求得到的数据是从缓存中取的,而并没有执行,@Cacheable注解下的方法。
那么新的问题来了,如果我对数据库中的某条数据进行了修改,怎么办,由于缓存的原因,前台发送请求得到的数据依然是旧的数据,只有项目重新启动才会改变修改后的值,这些操作不是我们希望看到的。如果我们缓存需要使用,修改值后缓存也同时修改,那么此时就需要编写一个新的用于管理这些几乎不变字段的工程项目。
照例还是先上图:
当我在新工程中修改客户类型字段后,在原先的后台管理系统中进行字段查看,发现字段进行了修改。此时可能存在两种原因:1.原先缓存被清空,前台再次向后台进行了请求数据。2,原先缓存没有清空,只是对应的值发生了修改。
其实在项目中,两种原因所对应的方法,我都进行了尝试,都是可以实现的。
首先说简单的那种,就是清空缓存,不管你修改的是那条数据,我把全部缓存都清空,当然全部指的是当前service中注解名为paPropType下的所有缓存(前面提到过这注解对应的名字)。
在对应的增,删,改,方法中添加注@CacheEvict(allEntries=true)
这样就可以了。
第二中方法,稍微麻烦一点,不清空缓存,而是修改对应的缓存。
对应两字用的很是恰当,如何对应,通常都是使用UUID这样就不会出现重复的现象。当我在实际的操作过程中发现,在查询,修改,删除的时候,都可以传入UUID,但在新增的时候,尴尬了,UUID是自己生成的而而并非外部传入,除非UUID不在service层中创建,而在controller层中创建,这样好像是真的解决了问题。但就是感觉违背了,一开始分层的初衷。所有现在的项目中并没有这样做。
但如果想做,或者说有id可以区分,那么又要如何实现呢?
如下图所示:
只要增删改查,四个方法所对应key的值相同即可。原理也很简单,增删改查所对应的缓存要是同一个,所有需要相同的id进行表示和区分。
凡是试过以后才明白,也才安心。
今天就分享这么多,
领取专属 10元无门槛券
私享最新 技术干货