基本上我正在编写一个 ASP.NET MVC 应用程序,尽管 javascript 每 30 秒发送一个 GET 请求,检查数据库中表中的某个行是否已更改。
我一直在查看 OutputCache 属性,但它似乎不起作用,因为它只会缓存内容而不真正检查是否进行了更新。
这样做的“最便宜”的方法是什么?我的意思是对服务器负担最小的方式?
基本上我正在编写一个 ASP.NET MVC 应用程序,尽管 javascript 每 30 秒发送一个 GET 请求,检查数据库中表中的某个行是否已更改。
我一直在查看 OutputCache 属性,但它似乎不起作用,因为它只会缓存内容而不真正检查是否进行了更新。
这样做的“最便宜”的方法是什么?我的意思是对服务器负担最小的方式?
HEAD 请求可能会更快,但不能保证会更快,但值得研究。
如果您不能使用某些东西将更改流式传输给您,最便宜的方法是使用一个获取日期的 API,并返回一个布尔标志或一个整数来说明是否发生了更改。本质上它是轮询,这将是最小的,因为它是最小的来回响应,如果 SignalR 或其他一些消息接收过程是不可能的。
取决于你想要它做什么,你考虑过长轮询吗?例如,使用 javascript 发出 GET/POST 请求并允许服务器保留回复,直到您的“事件”发生。
OutputCache
完美运行。但它的到期时间应该是您轮询时间的一个分隔符,例如 10 秒 - 在这种情况下 - 客户端大小为 30 秒。
我不是 EF 专家,但如果您的数据库支持触发器;这将是一个选项,除非设置了触发器,否则您可以将结果缓存更长的时间(例如 1 小时)。
但是,如果您的记录更新得非常快,那么触发成本会很高。
在这种情况下,我会使用缓存 + 时间戳机制(如 NoSQL 数据库中的版本,或 Oracle 中的时间戳)。
请记住,您每 30 秒获取一次记录,而不是记录上的每次更改。这是一件好事,因为它使您的解决方案更加简单。
当数据库发生更改时,可能是带有推送通知的 SignalR(并且可以手动跟踪或由 SqlDependency 跟踪,具体取决于数据库)...
我使用了 Wyatt Barnett 的建议,效果很好。
感谢您的回答 - 不胜感激。
顺便说一句,我正在回答它,因为我无法将他的评论标记为答案。