【问题标题】:When to invalidate cache - .net core api何时使缓存无效 - .net core api
【发布时间】:2019-04-10 09:51:14
【问题描述】:
如果表更改是从外部来源进行的,我如何知道何时使缓存无效?
我有一个返回员工表的 api 调用。第一次进行此调用时,我将缓存结果,以便在后续调用时,它将从缓存而不是数据库中提取数据。这是有道理的,但是,如果有人从 api 之外 向员工表添加新记录会发生什么,缓存如何知道它现在无效?
如果用户通过 API 对员工表进行了更改,我可以捕捉到这一点,但是我们有一个不使用 API 的单独桌面应用程序,并且该应用程序可以直接进行更改到员工表。是否有任何公认的标准来处理这个问题?
我能想到的唯一可能的解决方案是向员工表添加一个触发器,并以某种方式使用它来了解表何时发生更改。但是,我们有超过一千个表,并且我们正在为每个表进行 api 调用 - 所以,我不认为向我们的数据库添加一千个触发器是一个可接受的解决方案。
【问题讨论】:
标签:
asp.net-core
.net-core
asp.net-core-2.0
asp.net-core-webapi
api-design
【解决方案1】:
解决这个问题的两种方法
- 推模型
- 拉模型
推送模型:使用 SQL Server 表的数据库触发器来填充中间审计表并使用后台任务轮询该表。
拉取模型:使用 CLR Trigger 并将更新推送到 API。每当 DML 发生时,CLR 触发器都会调用 Api,qhich 反过来可以更新缓存!
希望这会有所帮助!
【解决方案2】:
正如另一个答案 a 表明您的触发想法是可以的,但是正如您所说,这将是很多触发因素。
如果您的缓存不是 API 的本地缓存,我认为如果触发器能够访问它不是。您不能从您的桌面应用程序访问它吗?当桌面应用程序成功更改员工表时,您可以通过从缓存中删除员工记录来使缓存无效。
归结为..
您有一个缓存(本质上是一个读取存储)。
您有两种选择来更新它
- 超时并获取(没关系,如果您不需要最新的实时数据)
- 或者是 必须 被告知其数据不再有效。
【解决方案3】:
是的,您可以按照建议添加触发器。或者您可以使用支持到期时间/滑动到期的缓存系统。因此,您有时会提供陈旧的数据,但并非总是如此。