之前在生产环境遇到过两个缓存的问题,这里分享出来,希望看到的朋友能避免类似的问题
一、查询返回集合的情况
先看一下下面这段代码:
能发现使用注解@Cacheable的问题吗?
这种写法如果查询返回的集合中的元素为空,即list=[],这个空元素的集合也会被放到缓存中,下次有查询的时候,都会先去缓存里面取值,而在缓存里面得到的值一直都是空数据
那应该怎么写呢?看下面这段代码:
没错,就是在注解上面加了一句result.size()==0,当查询出来的集合不为空,但是里面没有元素的时候,也不把查询结果放到缓存中,这样下次有查询的时候,就会先去数据库读取数据了
二、并发查询的情况
场景:
清除缓存的代码是放在一个事务里面的
会出现的问题:
如果事务还没提交,缓存已经清了,
此时有另一个线程来查询,就会把从数据库查询出来的老数据放到缓存中,
这样就导致了虽然后面数据库提交了,数据库里面是新数据,但是缓存里面还是老数据。
之后的查询都会从缓存里面取到错误的老数据
处理方案:
我们暂时的处理方案是等数据库事物提交之后,再清除一次缓存。
尽管在缓存被清除的时候到事务提交中间会有几百毫秒的时间有可能会从缓存中取到错误的数据,但是在事物提交后,系统有再执行一次清缓存的操作,之后的查询返回的数据就会是正常的了。
亲们有更好的方案也欢迎给小编留言哦~
---------------------------------------------------------------------------------------------------------------
“程序媛在线”公众号:由一个低调内敛的小码农创建,记录编程学习历程和对职场经验教训的总结
领取专属 10元无门槛券
私享最新 技术干货