SQL Server更新/触发时无效的redis缓存
本文关键字:无效 redis 缓存 Server 更新 SQL | 更新日期: 2023-09-27 18:02:10
我想利用redis作为从SQL Server检索对象的缓存,但我们有一个web服务器集群和一致性是很重要的。是否有任何方法可以在redis中缓存更新,以便当来自更新的行时,缓存无效?
在一个理想的世界里,我可以问redis"widgets -123",如果我没有得到它,我可以从sql server加载"select * from widgets where id=123",创建对象并将其存储在redis中以备将来的请求,但如果那一行被修改,sql server将能够告诉redis使相应的键无效,因此web服务器将知道获取一个新的实例。
是否可以使用触发器或SQL代理
在数据库和代码之间引入一层如何?这一层负责下面的工作,假设所有的物质都通过这一层。
- 你可能已经猜到了
请求"Widget-123" -> |图层(键存在)?get from redis: get from db and add to redis | SQL Server
- 更新/删除实体(id=123) -> |层(键存在)?SQL Server.
这种方法可以给你一个很好的一致性结果。但是。
如果你仍然希望sql server应该推送细节,对不起,没有客户端(sql不是通用的)可以告诉redis直接退出。但是正如@Jeremy Bell建议的那样,你可以有一个可以写入表的触发器,这个表可以连续轮询(通过石英类型),并为所有id推送过期请求。但是缺点是您可能无法获得良好的一致性,因为对db临时表的写和读可能是瓶颈甚至问题(竞争或死锁),如果不注意的话。
SQL Server可以发送web请求吗?
您可能会将键推入队列表,然后使用后台任务调度框架(如Quartz)轮询需要删除的键。