表存储服务(Azure和nosql的实现)与Windows Azure缓存(非结构化内存缓存)

表存储服务(Azure和nosql的实现)与Windows Azure缓存(非结构化内存缓存),azure,nosql,azure-caching,azure-cdn,Azure,Nosql,Azure Caching,Azure Cdn,我们希望在Azure中实现缓存,主要原因有两个: 加速重复数据访问 减少对数据库的压力 以下是我们计划缓存的数据的特征: 相对较小(1-100KB) 针对每个客户 不是私密的,但我们真的不希望随机的人浏览我们的整个缓存 XML或JSON 由C#使用(即在html中不直接链接到) 大多数情况下,数据不会发生变化,但有时数据可能会发生多次变化 出于这一特定目的,它似乎比Blob存储(我们刚刚为图像、CSS和JavaScript实现了Blob存储)更好,也比WindowsAzure共享缓存更好(可能差

我们希望在Azure中实现缓存,主要原因有两个:

  • 加速重复数据访问
  • 减少对数据库的压力
  • 以下是我们计划缓存的数据的特征:

  • 相对较小(1-100KB)
  • 针对每个客户
  • 不是私密的,但我们真的不希望随机的人浏览我们的整个缓存
  • XML或JSON
  • 由C#使用(即在html中不直接链接到)
  • 大多数情况下,数据不会发生变化,但有时数据可能会发生多次变化
  • 出于这一特定目的,它似乎比Blob存储(我们刚刚为图像、CSS和JavaScript实现了Blob存储)更好,也比WindowsAzure共享缓存更好(可能差不多,共享缓存就在这一点上)

    两者的编程API看起来都很简单。与我们为云站点支付的费用相比,每个站点的成本似乎微不足道

    到目前为止,由于Azure缓存的优点和缺点,我们倾向于使用表存储。与NoSql风格的解决方案相比,作为老的.Net成员,我们更熟悉内存缓存:

    Windows Azure缓存存在问题:

  • 如果虚拟机被移动到另一台服务器(由Microsoft出于负载平衡或其他原因),内存缓存是否被完整移动
  • 我们猜测,每当我们向云发布更改时,它就会清除现有的内存缓存
  • 虽然用户在进行更改时很少对缓存数据进行更改,但他们可能会在几秒钟内进行多次更新,我们不确定这将如何处理跨多个运行web角色的节点的缓存,尤其是在流量增加的情况下。(这可能也是表存储的问题!)
  • 表存储似乎更易于调试
  • WindowsAzure缓存的优势

  • 快一点

  • 您对内存缓存的熟悉程度是在Windows Azure上实现缓存所需了解的模型。“NoSql风格”不是缓存,而是存储。因此,表存储取代了SQL而不是缓存。表存储用于持久、可靠的存储—具有内存缓存中不存在的所有延迟和持久性的其他缺点

    写入缓存始终是次要的。当您的用户“更改缓存数据”时,您将始终将数据写入磁盘(例如SQL),然后将相同的数据写入缓存,因为您也可以这样做,因为您手头有数据(尽管写入数据的次要影响可能意味着您应使缓存项无效或重新读取)

    由于数据存储在其他地方,因此当机器回收时,数据的擦除不应该是一个很大的问题。每次从缓存中读取数据后都应该跟一个类似“如果找不到,则从数据库中读取”的语句。当角色开始预填充您知道需要的项时,您可以预热缓存

    Azure上的缓存分布在各个节点上,更新现有项目将始终在其所在的节点上更新。快速更新的问题可能没有你想象的那么严重


    对于内存内缓存,请使用Windows Azure缓存(您认为共享缓存是传统的说法是正确的),并根据您的需要,查看其他缓存技术,如memcached。缓存和表存储是不可比较的。表存储用于长期持久性。不要不必要地攻击表存储来进行缓存-使表存储成为临时存储会产生一大堆您需要担心的事情,例如过期和失效。

    Greiner's可能是一个很好的默认解决方案,首先使用表存储,如果某些数据由于使用率极高而成为瓶颈,请将其移动到缓存中。然后,解决方案是有两层缓存。因此,对于定期访问但很少编辑的数据,请通过NoSql使用命令查询责任分离,如果NoSql的性能因内存中的任何值移动而降低?Simon感谢详细的响应!听起来表存储不一定比SQL快。表存储作为一种通过加载SQL进行扩展的方式更有用?所以Azure缓存可能有更好的性能。它看起来像(如果我们需要这种能力的话)。一般来说,云应用程序,特别是Azure,将跨工作负载在多个存储中存储数据,所以表存储确实需要SQL负载(请参阅)。将memcached协议用于Azure缓存是一个好主意,因为它允许您稍后交换memcached,这是Azure团队的一个好举措。如果应用程序以编程方式从缓存中删除项目(因为它已更改)将从Azure缓存中的所有节点或仅从本地节点删除该项目?项目仅在单个节点上。集群将数据请求定向到相关节点。从单个节点删除也会使其他节点无法访问in。