关于系统缓存使用的问题,和目前在使用中遇到的问题

Blade 未结 1 1517
Mr.
Mr. 剑者 2020-02-24 12:26

一、该问题的重现步骤是什么?

1. 新建的模块内有相互调用service查询,如果要使用缓存的话,现有的代码是通过fegin来实现的,如果我的业务里同一模块的多个不同的service要使用缓存的查询、更新,怎么获取和刷新缓存?

2. 同一个实体同一条数据的一个缓存,一个查询是以id为key,可我在其他的使用场景下是以其他字段来做的缓存的同一条数据,我怎么使用提供的方法来保持数据的一致性,我看现有的规则是在某处修改时直接清空的是该类的所有缓存数据,这样的结果是在清空当前数据的情况下,其他数据也一并清掉了,包括没有修改的数据缓存

3.现有封装的比如getOne查询处理缓存是在controller层就直接处理缓存了,这样就出现,我没有必要暴露的服务都得在fegin里来处理缓存,而我现在的处理是直接引入需要调用的service来处理的,也就是我第一个问题,像这种情况,我怎么处理


二、你期待的结果是什么?实际看到的又是什么?


得到一个现有缓存的实现的方案,和我提出的问题的解决方案


三、你正在使用的是什么产品,什么版本?在什么操作系统上?


商业版,2.3.1 ,os:win10


四、请提供详细的错误堆栈信息,这很重要。



五、若有更多详细信息,请在下面提供。



1条回答
  • 2020-02-25 00:45

    这是没有办法的,必须修改的时候全清。

    和你说如下两种场景,比如我有一个博客表,需要创建两个缓存,前置缓存名为:BLADE_BLOG

    1、一个是根据博客类型创建,那么他的key就是 ( BLADE_BLOG,category-1 )

    2、一个是根据博客状态创建,那么他的key就是  ( BLADE_BLOG,status-2 )


    如果有一条博客数据同时是类型1,状态2,我把他更新了,他的分类从1改成了2,按照类型清空缓存,下次再取,那么缓存是对的。但是状态没有变更,再取status-2的时候,仍然能取出他更改之前分类为1的数据,这样的话,数据就错了。


    你可能觉得一条数据有几个字段需要分别建立缓存,有更新后不全清,可以提高性能。想法是很好的,但这种情况往往会有很多问题,会产生脏数据,所以是不可取的。你也可能会想到,有多个字段,我哪怕字段不变,我在更新的时候,同时清除他字段关联的缓存就行了,但是这样和全部清空就没什么差别了。


    所以除非你一条数据只有一个字段做缓存,不然如果有多个的话,就需要全清,否则会出现脏数据导致系统出问题

    1 讨论(0)
提交回复