5

我在负载平衡的 Web 服务器环境中使用 ASP.NET 和 WCF 服务,在服务层使用 Memcached。

我还想用 Memcached 替换使用 ASP.NET 状态服务器(用于会话状态)。现在恐怕这不是一件好事,因为据我了解,Memcached 是缓存服务器而不是状态服务器,这是真的吗?

如果我理解正确,Memcached 不会将数据分发到 Memcached 场中的其他节点。相反,使用一种特殊的散列算法来确定场中的哪个节点包含请求的密钥的数据,而 ASP.NET 状态服务器在添加数据后尽快分发数据,以防止单点故障。

换句话说,Memcached 应该仅用于性能原因,存储在其中的数据应该始终是可重新创建的,以防项目已被删除为新对象腾出空间,或者在实际存储数据的单台机器发生故障的情况下向下。

那么我不能仅仅依靠 Memcached 来存储会话状态数据吗?如果我不能,那么我不明白 Memcached 是如何经常被比较并被视为使用 ScaleOut StateServer 和 ASP.NET 状态服务器的替代方案,因为它们实际上是状态服务器,这是另一回事,对吗?

我现在有点不确定在 Web 服务器场中实现高性能分布式会话状态的最佳方法是什么。

谢谢

4

3 回答 3

4

http://www.codeplex.com/memcachedproviders有一个用于 asp.net 的会话状态提供程序,它将值存储在 memcached 中。它提供了在 SQL Server 中备份会话数据的能力。正如 yogman 所说,会话数据存储为一个值。如果发生驱逐,该用户的整个会话将丢失,用户将被引导到登录屏幕。Memcached 不会在过期之前驱逐任何数据,除非它没有足够的空间来保存新数据。

于 2008-12-31T22:25:35.230 回答
1

Memcached 目前不支持数据镜像,它只提供将条目拆分到多台服务器的能力,以防止其中一台被淹没。这可以通过使用服务器地址对您的密钥进行散列,或使用一致的散列算法 (libketama) 来实现。

但总的来说,不应将 Memcached 视为持久存储层,并且在几乎所有情况下,缓存中的数据都应该与数据库中的数据相同。如果您正在更改用户的会话数据并想要缓存它,请在 Memcached 中更新它,然后立即在数据库中更新它。如果你想非常小心,你可以实现一个简单的日志系统,以确保这些数据在系统故障的情况下保持一致。

尽管如此,Memcached 肯定被用于缓存会话,创建者在 Jinux Journal 文章中也这么说。它实际上仅用于优化读取操作,归根结底,您关心的任何数据都应存储在数据库中。

于 2008-11-14T19:29:16.657 回答
0

在理想情况下,会话数据只是单个值,即用户 ID 的内部数字表示。这意味着用户已成功通过登录页面并提供了正确的密码。

但是其他人喜欢呢,以stackoverflow为例,页面上的动态数据取决于用户:用户的昵称,信誉数,获得的徽章,发表评论的权限。它们通常是跨多个数据库表的多个 JOIN 的结果。

如果不使用 memcached,这些查询几乎总是从磁盘读取数据,这是一个非常缓慢且扩展性不强的操作。数据库里面的缓存?您认为命中率会考虑到数据库在管理会话数据之外的其他事情吗?为什么你必须从磁盘读取而你可以从内存中读取?

当然,任何对相关用户信息的写入都应该使 memcached 中的相应会话失效。

于 2008-11-14T21:45:24.697 回答