Memcached是否可以与ASP.NET State Server互换?

时间:2008-11-14 18:34:13

标签: .net asp.net memcached

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

我还想用Memcached替换ASP.NET State Server(用于Session State)。 现在我担心这不是一件好事,因为根据我的理解, Memcached是缓存服务器而不是状态服务器,是真的吗?

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

换句话说,Memcached只应出于性能原因使用,存储在其中的数据应始终可重新创建, 如果项目已被删除以为新对象腾出空间,或者实际存储数据的单台机器出现故障。

那么我不能仅仅依赖Memcached来存储会话状态数据吗? 如果我不能,那么我不明白Memcached如何经常被比较和看作 使用ScaleOut StateServer和ASP.NET State Server的替代方法, 因为这些都是状态服务器,这是另一回事,对吗?

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

由于

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

通常,Memcached不应被视为持久存储层,并且在几乎所有情况下,缓存中的数据应与数据库中的数据相同。如果要更改用户的会话数据并想要对其进行缓存,请在Memcached中更新它,然后立即在数据库中更新它。如果您想要非常小心,可以实现一个简单的日志记录系统,以确保在系统出现故障时此数据保持一致。

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

答案 2 :(得分:0)

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

但是其他人喜欢,例如,使用stackoverflow,页面上的动态数据取决于用户:用户的昵称,信誉号,获得的徽章,留下评论的permssion。它们通常是跨多个数据库表的多个JOIN的结果。

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

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