【发布时间】:2013-08-20 11:41:46
【问题描述】:
我正在寻找一种简单的方法来实现可用于 Azure .NET 实例的本地内存存储
我一直在查看Azure Co-located Caching,它似乎支持我的所有要求:
同时处理网络角色和辅助角色
实现一个简单的 LRU
将缓存对象保存在内存 (RAM) 中
请允许我将缓存大小定义为机器总 RAM 的百分比
将缓存保存在 web/worker 角色的同一台机器上(并置模式)
允许我从在同一台机器上运行的多个 AppDomain 访问相同的缓存(Web 角色可能会将我的处理程序拆分为不同的 AppDomain)
Azure Co-located 缓存的唯一问题是不同的实例进行通信并尝试共享它们的缓存 - 我真的不需要所有这些。
我希望每台机器都有自己独立的内存缓存。当我查询此缓存时,我不想浪费任何时间向其他实例的缓存发出网络请求。
本地缓存配置?
我在 Azure 缓存中看到了启用 Local Cache 的配置设置 - 但机器似乎仍然可以相互通信(即在缓存未命中期间)。此配置还需要ttlValue 和objectCount,我希望 TTL 为“永远”,对象计数为“直到填满整个缓存”。感觉在这两种情况下都指定maxInt 似乎是错误的。
那么简单的静态变量呢?
当我真正考虑它时,所有这些 Azure 缓存对于我需要的东西来说似乎有点矫枉过正。我基本上只需要应用程序/角色级别的静态变量.. 除非这不适用于要求 #6(不同的 AppDomains)。在这种情况下,要求 #4 也更难实现。
内存缓存
我认为老 memcached 似乎完全符合我的要求。问题是我将 Azure 用作 PaaS,我真的不想管理自己的 VM。我不认为我可以在我的角色上安装memcached。[更新] 似乎可以在我的角色上本地运行 memcached。有没有更优雅的“原生”解决方案而不使用 memcached 本身?
【问题讨论】:
-
你在缓存什么样的东西?请记住,只有字符串和一些特殊对象(线程、应用程序域)在应用程序域之间真正共享,所有其他内容在跨越应用程序域边界时都会被序列化和反序列化。然后是 MarshalByRefObject——它不完全共享,但来自不同应用程序域的调用被编组到它的本机应用程序域。您可以创建一个 MarshalByRef 字典,将其放入静态并跨应用程序域使用。
-
@AntonTykhyy 我想缓存简单的 JSON 对象(大约 8 个字符串的平面字典,每个字符串大约 100-200 个字节)。你能用你的想法的示例实现给我指出一个地方吗,听起来很完美
-
我找不到任何东西。然而你真的需要这个吗?角色入口点与 Web 角色 (1) 在不同的进程中运行,但如果您的 Web 角色只有一个站点,它会在一个应用程序域中运行。只需将您的静态缓存放在 Global.asax 中,您就应该准备就绪。
-
@AntonTykhyy 我的网络角色有几个处理程序(ashx 文件),我不确定它们是否在不同的 AppDomain 上运行。我不想冒险并做出假设
标签: c# .net caching azure azure-caching