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

问题描述:

我们有我们的旧网站建立在用户认证的LAMP栈上。现在我们已经为具有实时聊天功能,视频和论坛等的用户构建了一个新的社交平台,并且我们已经为此使用了node.js。是memcache适合从Apache传递用户详细信息到Node.js

当用户登录其账户在旧网站 - 可以说,他可以点击一个链接

 
www.xyz.com/social 

将带他到这个新的Node.js的平台上。

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

简单的解决方案

简单的解决办法就是散列的用户ID和电子邮件和存储哈希在内存缓存服务器密钥,并通过用户的细节值

 
$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这么多用户的支持,存储数据(大约在给定时间500个用户)从旧网站到新node.js的网站在网站内移动。

在此先感谢您的意见。

+2

如果您在php中使用cookie,并且您位于同一个域中,那么您在nodejs应用程序中也有它们。那么你可以从节点解码你自己的cookie,或者用用户的cookie对php进行http调用,让php告诉你用户是谁。 –

1)这是马上就要接近这一点。

是的,它是这样做。但可以有更好的方法来解决这个问题:

  • as @ alex-rokabilis建议。即“cookies”,只需使用cookie分享以上 memcache密钥。
  • 您需要在会话存储中通过Apache和node.js共享商店详情。

正确选择无效条件。

2)将MEMCACHE这么多的用户

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


不过,按照我对你更好的方法是坚持MySQL只

  • 用户与LAMP堆栈验证
  • 提供它会将Cookie md5(user-id . timestamp. KEY),并保存在数据库中该条目。
  • 获取的Node.js应用程序和查找MySQL表饼干
  • 检索数据相应
  • 在MySQL的这些查找调用的顶部添加缓存层。 (所以你可以在memcache中保留选择性的kep-pair,也就是活动用户的超时时间为10秒?)
  • 当用户注销时,只需从MySQL表中删除条目,并从memcache中删除键。

原因

  • 如何确定超时,因为用户可以保持无限(或按超时)登录到LAMP。但是,他会根据超时从node.js注销。
  • 如果完全依赖memcache,持久性将永远是个问题。如果您没有在某处(MySQL)复制,您将如何在每次重新启动内存缓存后重建密钥对?

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

你试图做的事情大部分都会工作,但是当你开始在系统上加载一些负载时,可能会出现奇怪的问题。您可能希望使用像RabbitMQ或Kafka这样的消息队列系统,或者将memcached与数据库配合使用。

正如前面的答案所暗示的,这是一个正确的方式,存在一个瓶颈问题(负载或流量高达RAM),这可能是一个真正的问题。

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

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

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

我没有尝试的代码。但我认为你可以轻松应对。