memcache 是否适合将用户详细信息从 Apache 传递到 Node.js
Is memcache suitable for passing user details from Apache to Node.js
我们的旧网站建立在 LAMP 堆栈上,具有用户身份验证。现在我们已经为相同的用户构建了一个新的社交平台,具有实时聊天功能、视频和论坛等功能,我们为此使用了 node.js。
当用户在旧站点登录他的帐户时 - 假设他可以点击 link
www.xyz.com/social
这将把他带到这个新的 node.js 平台。
所以我不确定如何将用户详细信息从 apache 传递到 node.js - 我只需要用户 ID,然后在 node.js - 我可以查询 mysql table 并加载用户详细信息。
简单的解决方案
简单的解决方案是对用户 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);
然后在link中传递散列值作为参数,如
www.xyz.com/social/$$hash-value$$
并在节点 js 中 - 根据哈希键从内存缓存中检索用户详细信息。
1) 现在处理这个问题合适吗
2) memcache 是否支持存储这么多用户(给定时间大约 500 名用户)在网站内从旧站点移动到新 node.js 站点的数据。
提前感谢您的意见。
1) 现在处理这个问题合适吗
是的,这样做是对的。但是可以有更好的方法来解决这个问题:
- 正如@alex-rokabilis 建议的那样。即 "cookies",只需在上面分享
使用 cookie 的内存缓存密钥。
- 在会话存储中存储您需要在 Apache 和 node.js 之间共享的详细信息。
合理选择失效条件
2)memcache是否支持存储这么多用户的数据
是的,它会。
但是这在很大程度上取决于您的内存缓存部署,您为其提供了多少 RAM?
计算或粗略估计存储 500 个用户详细信息需要多少 RAM。一旦 memcache 进入交换状态,那么处理这么多请求对 memcache 来说将是痛苦的。
但是,据我所知,更好的方法是 只坚持 MySQL。
- 用户使用 LAMP 堆栈进行身份验证
- 为其提供 cookie
md5(user-id . timestamp. KEY)
,并将此条目保存在数据库中。
- 在 node.js 应用程序中获取 cookie 并查找 mysql table
- 相应地检索数据
- 在 MySQL 的这些查找调用之上添加缓存层。 (所以你可以只在内存缓存中保留选择性的 kep-pairs,即活跃用户的超时时间很短 ~10sec?)
- 当用户注销时,只需从 MySQL table 中删除条目,并从内存缓存中删除密钥。
原因
- 您如何确定超时,因为用户可以无限(或根据超时)保持登录 LAMP。但是,他会根据超时从 node.js 注销。
- 如果完全依赖内存缓存,持久化永远是个问题。如果您在某处没有副本 (MySQL),您将如何在每次重新启动内存缓存后重建密钥对?
Memcache 是一种数据缓存 服务,而不是数据传输服务。无法保证存储在缓存中的值对其他组件可用。
您尝试做的大部分工作都会奏效,但当您开始给系统增加一些负载时可能会出现奇怪的问题。您可能想使用像 RabbitMQ 或 Kafka 这样的消息队列系统,或者使用数据库来支持 memcached。
正如前面的答案所暗示的那样,这是一个正确的方法,但存在瓶颈(负载或流量达到 RAM),这可能是一个真正的问题。
我想推荐一个新的方法。 您实际上不需要复制 "PHP's user level session data"。您可以立即从 nodejs 中使用它。为此,您需要更改旧 lamp 代码的会话处理程序。以 json 格式将会话存储在内存缓存中。然后直接从nodejs访问它。因为你没有复制任何数据;您将节省大量 ram 和 I/O 操作(如果您将会话存储在文件或数据库中),您还将节省计算能力。所有这些节省将为您带来性能。
这里是一个示例代码,用于在内存缓存中将会话数据存储为 json。
我没有尝试代码。但我认为你可以轻松应对。
我们的旧网站建立在 LAMP 堆栈上,具有用户身份验证。现在我们已经为相同的用户构建了一个新的社交平台,具有实时聊天功能、视频和论坛等功能,我们为此使用了 node.js。
当用户在旧站点登录他的帐户时 - 假设他可以点击 link
www.xyz.com/social
这将把他带到这个新的 node.js 平台。
所以我不确定如何将用户详细信息从 apache 传递到 node.js - 我只需要用户 ID,然后在 node.js - 我可以查询 mysql table 并加载用户详细信息。
简单的解决方案
简单的解决方案是对用户 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);
然后在link中传递散列值作为参数,如
www.xyz.com/social/$$hash-value$$
并在节点 js 中 - 根据哈希键从内存缓存中检索用户详细信息。
1) 现在处理这个问题合适吗
2) memcache 是否支持存储这么多用户(给定时间大约 500 名用户)在网站内从旧站点移动到新 node.js 站点的数据。
提前感谢您的意见。
1) 现在处理这个问题合适吗
是的,这样做是对的。但是可以有更好的方法来解决这个问题:
- 正如@alex-rokabilis 建议的那样。即 "cookies",只需在上面分享 使用 cookie 的内存缓存密钥。
- 在会话存储中存储您需要在 Apache 和 node.js 之间共享的详细信息。
合理选择失效条件
2)memcache是否支持存储这么多用户的数据
是的,它会。
但是这在很大程度上取决于您的内存缓存部署,您为其提供了多少 RAM?
计算或粗略估计存储 500 个用户详细信息需要多少 RAM。一旦 memcache 进入交换状态,那么处理这么多请求对 memcache 来说将是痛苦的。
但是,据我所知,更好的方法是 只坚持 MySQL。
- 用户使用 LAMP 堆栈进行身份验证
- 为其提供 cookie
md5(user-id . timestamp. KEY)
,并将此条目保存在数据库中。 - 在 node.js 应用程序中获取 cookie 并查找 mysql table
- 相应地检索数据
- 在 MySQL 的这些查找调用之上添加缓存层。 (所以你可以只在内存缓存中保留选择性的 kep-pairs,即活跃用户的超时时间很短 ~10sec?)
- 当用户注销时,只需从 MySQL table 中删除条目,并从内存缓存中删除密钥。
原因
- 您如何确定超时,因为用户可以无限(或根据超时)保持登录 LAMP。但是,他会根据超时从 node.js 注销。
- 如果完全依赖内存缓存,持久化永远是个问题。如果您在某处没有副本 (MySQL),您将如何在每次重新启动内存缓存后重建密钥对?
Memcache 是一种数据缓存 服务,而不是数据传输服务。无法保证存储在缓存中的值对其他组件可用。
您尝试做的大部分工作都会奏效,但当您开始给系统增加一些负载时可能会出现奇怪的问题。您可能想使用像 RabbitMQ 或 Kafka 这样的消息队列系统,或者使用数据库来支持 memcached。
正如前面的答案所暗示的那样,这是一个正确的方法,但存在瓶颈(负载或流量达到 RAM),这可能是一个真正的问题。
我想推荐一个新的方法。 您实际上不需要复制 "PHP's user level session data"。您可以立即从 nodejs 中使用它。为此,您需要更改旧 lamp 代码的会话处理程序。以 json 格式将会话存储在内存缓存中。然后直接从nodejs访问它。因为你没有复制任何数据;您将节省大量 ram 和 I/O 操作(如果您将会话存储在文件或数据库中),您还将节省计算能力。所有这些节省将为您带来性能。
这里是一个示例代码,用于在内存缓存中将会话数据存储为 json。
我没有尝试代码。但我认为你可以轻松应对。