Sql server 如何使用what';SQL Server中的s

Sql server 如何使用what';SQL Server中的s,sql-server,azure,caching,redis,azure-elastic-scale,Sql Server,Azure,Caching,Redis,Azure Elastic Scale,我没有扩展SQL后端的经验,但从我目前所读到的内容来看,写分片和读缓存似乎是最常见的两种做法。我试图学习如何使用正确的缓存策略来最小化最终的一致性 我想使用Azure SQL数据库、实体框架和弹性中间件以及Redis进行测试 是否有一种将分布式事务提交到SQL Server和Redis的方法 如果不是,当数据库发生更改时,什么是确保读取新鲜度的有效方法 我可以在同一个API中写入SQL和更新缓存,但写入缓存可能会因为任何原因而失败。我可以实现重试逻辑,但假设所有尝试都失败,我可以尝试回滚SQL事

我没有扩展SQL后端的经验,但从我目前所读到的内容来看,写分片和读缓存似乎是最常见的两种做法。我试图学习如何使用正确的缓存策略来最小化最终的一致性

我想使用Azure SQL数据库、实体框架和弹性中间件以及Redis进行测试

是否有一种将分布式事务提交到SQL Server和Redis的方法

如果不是,当数据库发生更改时,什么是确保读取新鲜度的有效方法


我可以在同一个API中写入SQL和更新缓存,但写入缓存可能会因为任何原因而失败。我可以实现重试逻辑,但假设所有尝试都失败,我可以尝试回滚SQL事务,或者简单地向客户端提供旧缓存数据,并定期重建缓存以赶上数据库。当然,后者意味着数据读取在一段时间内不一致。从SQL集群中逐出数据和读取数据是另一种选择,但跨切分查询可能非常昂贵,尤其是当它们涉及复杂的连接,并且在商品硬件上有数百个(如果不是数千个)数据库时。

您在文章的最后一部分中的想法——在同一API中写入SQL和更新缓存——似乎是合理的。我稍微改变一下:让缓存有一些低但合理的TTL,比如1分钟。当数据库被命中时,仅在读取时更新缓存,以便在下一个数据库查询时,缓存被命中

优点:

  • 超过1分钟,您就知道您的用户获得了正确的数据
  • 容错:如果缓存出现问题,并且由于任何原因无法更新它,那么下一个查询只会转到DB,而客户端仍然会获得正确的数据
  • 缺点:

  • 对DB的读取次数会稍微多一些(尽管每分钟每键多读一次应该没什么大不了的)
  • 客户端可以在更新后的1分钟内(最多——通常更少)获取旧数据

  • 切分最重要的原则之一是尽量避免“交叉切分”查询。如果不是这样,你也需要加入,我不认为切分可以帮助你。这两种方法都不支持读缓存。
    我们在几个项目中大量使用切分。它在可伸缩性方面确实有很大帮助,但正如我所说的,我们的服务中只有很少一部分需要不止一个碎片。之所以如此,是因为我们考虑到服务需求选择了切分密钥。我认为切分最重要的决定是选择正确的切分键。若你们能找到一个“完美”的切分键,你们可以直接使用数据库,而不需要任何缓存。至少这是我们现在正在做的。

    对于StackOverflow来说,要求第三方框架是不合适的。你应该从你的问题中删除这一部分,这样它就不会因为这个原因而关闭。谢谢。我同意跨切分查询可能会有问题。看看像FB这样的公司如何跨MySQL节点划分用户数据会很有趣。我的第一个想法是,它们基于UserId进行切分,任何用户活动都会写入该用户的切分,但是当您考虑聚合结果(如用户墙和朋友列表)时,此类数据也可能保存到同一切分中。