这是一个小背景,目前我有
我在3台服务器上有php配置指向memcache服务器进行会话。它工作正常,直到为读取等产生了很多连接,然后导致连接超时。
所以我现在正在考虑在每个Web服务器上聚集memcache用于会话,我唯一关心的是如何确保所有服务器上的memcache具有相同的会话信息。
有人引导我去http://github.com/trs21219/Memcached-Library,因为我使用的是codeigniter,但是我如何将我的php会话汇聚到此,因为memcache似乎是一个键值存储?提前谢谢。
是否有人签出http://repcached.sourceforge.net/并确实有效?
答案 0 :(得分:2)
我不确定你的设计师对memcache的期望是否一致。
但是,首先,memcache发布的工作方式与预期不同:没有机制来复制存储的信息。正如您所注意到的,每个memcache实例都是一个简单的键值存储。分发由客户端代码完成,客户端代码具有所有已配置的memcache实例的列表,并执行密钥的散列以将其定向到其中一个实例。客户端可以将它存储在任何地方并在本地检索它,或者为了冗余而多次散列它,但这些并不是简单的练习。
但另一个问题是memcache是为合理的短期数据而设计的,memcache可以随时丢弃。这使得缓存经常访问的数据非常有用,这些数据可能有点陈旧(比如说几分钟之前),但检索起来可能很昂贵(例如从查询生成几乎一分钟)。
根据我的经验,PHP会话并不符合这一要求。数据库可以轻松支持成千上万的PHP会话,几乎没有可见的流量,但是你需要很多的memcache存储来支持相同的数量:每个会话50k,5000个会话意味着接近256Mb,然后那里是你要放在那里的所有其他数据。没有足够的存储空间,你会得到大量无法解释的注销(因为内存压力下memcache会丢弃会话数据),因此很多烦恼的用户必须再次登录。
答案 1 :(得分:1)
无需使用某些第三方库来组织memcached“cluster”。
http://ru.php.net/manual/en/memcached.addserver.php
只需使用此功能将多个服务器添加到池中,然后将数据存储并分发到这些服务器上。将根据一致的密钥分发选项选择用于存储/检索特定密钥的数据的服务器。
因此,在这种情况下,您无需担心“如何确保所有服务器上的内存缓存具有相同的会话信息”
答案 2 :(得分:1)
我们发现在大多数事情上使用MongoDB而不是MySQL都有很大的优势,包括会话处理。它更快,更小,更容易。我们保留MySQL以满足交易需求,但其他一切现在都进入了Mongo。我们已经将memcache降级为简单地缓存页面和其他不重要的数据,如果它存在与否,就像smarty那样。