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

2022-08-31 01:17:30

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

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

www.xyz.com/social

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

提前感谢您的输入。


答案 1

1)这是马上接近这个。

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

  • 正如@alex-rokabilis所建议的那样。即“cookies”,只需使用cookie在memcache密钥上方共享即可。
  • 存储您需要在会话存储中跨 Apache 和节点.js共享的详细信息。

正确选择失效条件。

2)将支持存储这么多用户的数据

是的,它会的。
但它在很大程度上取决于您的memcache部署,您为其提供多少RAM?
计算或粗略地了解存储500个用户详细信息需要多少RAM。一旦memcache进入交换状态,那么为这些请求提供服务将是memcache的痛苦。


但是,据我所知,更好的方法是只坚持MySQL

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

原因

  • 如何确定超时,因为用户可以无限期(或根据超时)登录到LAMP。但是,他将根据超时从节点注销.js。
  • 如果你完全依赖memcache,持久性将永远是一个问题。如果你在某个地方没有副本(MySQL),你将如何在每次memcache重新启动后重建密钥对?

答案 2

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

您尝试执行的操作大多有效,但是当您开始对系统施加一些负载时,可能会遇到奇怪的问题。您可能希望使用像RabbitMQ或Kafka这样的消息队列系统,或者使用数据库进行memcached。


推荐