Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用redis发送好友状态_Node.js_Mongodb_Redis_Socket.io - Fatal编程技术网

Node.js 使用redis发送好友状态

Node.js 使用redis发送好友状态,node.js,mongodb,redis,socket.io,Node.js,Mongodb,Redis,Socket.io,我在互联网上四处寻找,想知道如何使用socket io将用户状态(如脱机和联机等)发送给朋友。有人说要用Redis。所以我看了一眼,然后玩了玩。我还使用mongodb存储朋友和用户 这是我现在的设置: //Status List: // 0 - offline // 1 - online // 2 - away // 3 busy //Set the status redisClient.hmset ("online_status:userID", "status", "1"); //Ch

我在互联网上四处寻找,想知道如何使用socket io将用户状态(如脱机和联机等)发送给朋友。有人说要用Redis。所以我看了一眼,然后玩了玩。我还使用mongodb存储朋友和用户

这是我现在的设置:

//Status List: 
// 0 - offline
// 1 - online
// 2 - away
// 3 busy

//Set the status
redisClient.hmset ("online_status:userID", "status", "1");

//Check if someone is online
redisClient.hgetall ("online_status:userID", (err, reply) => {
  console.log(reply)
})
如果我这样使用它来获取用户状态可以吗?还是有更好的方法


另一个问题是,是否可以继续循环hgetall,还是有更好的方法一次获取多个状态?

您使用散列类型存储单个信息,并且使用hgetall检索信息,因此我假设您还不太熟悉redis数据类型。因此,首先让我简短地解释一下我将要讨论的三种数据类型(在这里的文档中查找所有类型):

  • 字符串:是一种简单的键/值类型,使用
    set(键,值)
    get(键,值)
  • 散列:是存储在一个redis密钥下的一组密钥/值。用于存储实体的属性,例如您可以有一个“userdata:userID”键和存储名称、化身、状态。。。用它。使用
    hset(键、字段、值)
    hget(键、字段)
    hgetall(键)
  • 集合:是唯一字符串的集合,使用
    sadd(键,成员)
    sismember(键,成员)
    smembers(键)
如果您只想保存联机状态,那么将字符串类型与set、get和del一起使用会更简洁(因为通常大多数用户大部分时间处于脱机状态,请删除它们并节省空间)。对于这个简单的键/值用例,redis实际上并不比好的旧memcache更好

如果您打算存储更多与用户相关的属性(情绪、座右铭、化身…),则应将其重命名为“userdata:userID”,并使用
hget(“userdata:userID”,“status”)
进行检查,并仅使用
hgetall
检索所有属性

另一种方法是将所有用户存储在一个集合中:
sadd('users:online',userID)
,并使用
sismember('users:online',userID)
检查,或者使用
smembers('users:online')获取所有在线用户。
。假设您将所有好友存储在另一个集合
friends:userID
,您可以通过一个intersect命令
sinter('friends:userID','users:online')
-非常漂亮和优雅的IMHO,但这种get因更多不同的状态而变得复杂,并且不适用于redis集群


我更喜欢固定的方法。多个HGET也应该可以,直到您遇到问题,因为只有一个家伙(总是有一个)拥有数千个联系人并随时刷新。在这一点上,您仍然可以引入一些友谊限制或缓存。

非常感谢。我有个问题,我以为这是缓存?因为我正在尝试将mongodb与redis结合使用。我还有一个问题。在服务器端mongodb中循环浏览某人的好友列表是否合适?我一直害怕在服务器端使用循环。