如何在Azure角色中缓存数据库读取
本文关键字:缓存 数据库 读取 角色 Azure | 更新日期: 2023-09-27 18:16:36
在我的Azure角色中,我有很多实体必须存储在SQL Azure数据库中。目前,每当我需要读取一个实体时,我只需运行SQL Azure查询。
我怀疑它很快就会成为瓶颈,所以我必须实现某种缓存——某种内存结构,在第一次访问时读取数据,然后将其存储一段时间,并在后续读取时返回缓存的数据。制作这样的结构应该不难,我相信我可以找到现成的代码。
问题是我该如何处理来自多个实例的写入?例如,实例1读取数据并缓存它,实例2更改数据库。除非实例1知道它必须重新读取数据库并实际重新读取数据库,否则它处理的数据是错误的。我不知道如何轻松地做到这一点。
是否有一种简单的方法来保持不同实例的缓存一致?
这就是分布式缓存发挥作用的地方,在Azure上这通常意味着Windows Azure AppFabric缓存
分布式缓存背后的思想是缓存是集中的,并且可能分布在几个服务器上(为了效率),这样对数据的请求就不必去数据库,这通常在性能方面相对昂贵,但同样,数据不必在每个进程中本地缓存。
分布式缓存显然不如进程内缓存效率高,但它有几个好处——
- 阻止对底层源的多次调用
- 由于缓存不在进程中(实际上,在不同的服务器上),它减少了本地内存的压力
- 客户端从彼此的读取中受益-即,如果一个客户端将数据带入缓存,安全设置允许,其他客户端现在可以访问这些信息,因此缓存的利用率可以更高
这也意味着拥有"真相"更新知识的客户端可以更新缓存或使其无效,这将立即使共享同一缓存的所有其他客户端受益。
另外,作为一个分布式模型,缓存场可以扩展以满足许多请求,尽管在Azure上,由于缓存是作为服务提供的,这是平台而不是所有者负责的事情,这是PaaS和Windows Azure的最大好处之一缓存信息
你可以像Yossi说的那样使用AppFabric缓存,但是你也可以使用Memcached。
如果你打算使用Azure AppFabric缓存,并且你希望数据保持一致,你可能想要关闭本地缓存。
缺点是,如果每个请求从缓存中取出的条目多于两个,这将成为主要的瓶颈。您可以尝试通过将缓存的对象组合成一个大对象来解决这个问题。
我在微软论坛上发布了一个关于这个问题的问题,现在的答案是,如果需要本地缓存,陈旧的数据只是一些东西。
顺便说一句,如果需要本地缓存并且你使用的是web角色,那么普通的旧ASP。网络缓存可能是一个更好的选择,并且不需要单独收费。