memcache是​​否适合将用户详细信息从Apache传递到Node.js

时间:2015-10-19 12:41:08

标签: php node.js apache memcached

我们的旧网站建立在LAMP堆栈上,并带有用户身份验证。现在我们已经为具有实时聊天功能,视频和论坛等的相同用户构建了一个新的社交平台,我们已经将node.js用于此目的。

当用户在旧网站中登录他的帐户时 - 假设他可以点击链接

www.xyz.com/social

将把他带到这个新的node.js平台。

所以我不确定如何将用户详细信息从apache传递到node.js - 我只需要用户ID,然后在node.js中 - 我可以查询mysql表并加载用户详细信息。

简单解决方案

简单的解决方案是散列用户ID和电子邮件,并将散列作为密钥存储在memcache服务器中,并将用户详细信息作为值传递

$hash = md5($user_id+$email);
$memcache = new Memcache;
$memcache->connect("localhost",11211) or die ("could not connect");
$data = json_encode(array("id"=>$user_id,"name"=>"aaa"));
$memcache->set("key-".$hash,$data);

然后在链接中传递哈希值作为参数,如

www.xyz.com/social/$$hash-value$$

并在节点js中 - 根据哈希键从memcache中检索用户详细信息。

1)这是否正确接近这一点。

2)memcache是​​否支持存储在网站内从旧网站移动到新node.js网站的众多用户(在给定时间约500个用户)的数据。

提前感谢您的意见。

3 个答案:

答案 0 :(得分:7)

1)这是否正确接近这一点。

是的,正确这样做。但是可以更好地解决这个问题:

  • 正如@ alex-rokabilis建议的那样。即" cookies",只是在上面分享 使用cookies的memcache密钥。
  • 存储您需要在会话存储中的Apache和node.js之间共享的详细信息。

正确选择失效条件。

2)memcache是​​否支持存储这么多用户的数据

是的,它会。但是它很大程度上取决于你的memcache部署,你提供了多少内存?
计算或得到一个粗略的尊重,多少需要RAM来存储500个用户详细信息。一旦memcache进入交换,那么提供这些请求将是memcache的痛苦。

但是,按照我的说法,更好的方法是只坚持使用

  • 使用LAMP堆栈进行身份验证的用户
  • 提供cookie md5(user-id . timestamp. KEY),并将此条目保存在数据库中。
  • 在node.js应用程序中获取cookie并查找mysql表
  • 相应地检索数据
  • 在MySQL的这些查找调用之上添加缓存层。 (所以你只能在memcache中保留选择性kep-pair,即具有小超时〜10秒的活跃用户?)
  • 当用户注销时,只需从MySQL表中删除条目,并从memcache中删除密钥。

<强>原因

  • 如何确定超时,因为用户可以无限制地(或按超时)保持登录LAMP。但是,他会根据超时从node.js注销。
  • 如果完全依赖memcache,
  • 持久性将始终是一个问题。如果你没有在某个地方复制(MySQL),你将如何在每个memcache重启后重建密钥对?

答案 1 :(得分:3)

Memcache旨在成为数据缓存服务,而不是数据传输服务。无法保证存储在缓存中的值可用于其他组件。

您尝试做的事情大部分都会有效,但当您开始对系统施加一些负担时,可能会遇到奇怪的问题。您可能希望使用像RabbitMQ或Kafka这样的消息排队系统,或者使用数据库备份memcached。

答案 2 :(得分:0)

正如之前的答案所暗示的那样,这是一个正确的瓶颈(负载或流量达到RAM),这可能是一个真正的问题。

我想建议一种新的方式。 您实际上不需要重现“PHP的用户级会话数据”。您可以立即使用nodejs。为此,您需要更改旧灯泡代码的会话处理程序。使用json格式在memcache中存储会话。然后直接从nodejs访问它。因为你没有复制任何数据;你将节省大量的ram和I / O操作(如果你在文件或数据库中存储会话),你也将节省计算能力。所有这些节省将为您带来性能。

这是一个将会话数据存储为memcache中的json的示例代码。

https://github.com/lboynton/memcached-json-session-save-handler/blob/master/library/Lboy/Session/SaveHandler/Memcached.php

我没有尝试代码。但我认为你可以很容易地处理它。