SQL Server更新/触发器时无效的redis缓存

时间:2015-07-10 13:59:08

标签: c# sql-server redis

我想将redis用作从SQL Server检索的对象的缓存,但我们有一组Web服务器,并且一致性非常重要。有没有办法在redis中缓存更新,以便在更新来自的行时,缓存无效?

在一个理想的世界里,我能够向redis询问小部件123和#34;如果我没有得到它,我可以加载"从小部件中选择*,其中id = 123"从sql server创建对象并将其存储在redis中以备将来请求,但如果该行被修改,SQL Server将能够告诉redis使相应的密钥无效,以便Web服务器知道获取新实例。

该功能是否可以使用触发器或SQL代理

2 个答案:

答案 0 :(得分:1)

如何在数据库和代码之间引入一个层。该层负责跟踪,假设所有的crud都通过这一层。

  1. 你可能已经想到了
  2. 请求" Widget-123" - > |图层(密钥存在)?从redis获取:从db获取并添加到redis | SQL Server

    1. 更新/删除实体(id = 123) - > |层(密钥存在)?从redis驱逐| - > SQL Server。
    2. 这种方法可以为您提供良好的一致性结果。但

      如果您仍然希望sql server应该推送详细信息,抱歉,没有客户端(SQL不是通用的)可以告诉redis直接驱逐。但正如@Jeremy Bell建议的那样,你可以有一个可以写入表的触发器,并且可以连续轮询该表(按石英类型)并推送所有id的过期请求。但缺点是你可能无法获得良好的一致性,因为如果没有处理,在db temporay表上写入和读取可能是瓶颈甚至是问题(种族或死锁)。

答案 1 :(得分:0)

Can SQL Server send a web request?

您可能会将密钥推送到队列表中,然后使用像Quartz这样的后台任务调度框架来轮询需要驱逐的密钥。