使用Redis发送朋友状态

时间:2019-01-19 12:26:41

标签: node.js mongodb redis socket.io

我一直在Internet上四处寻找如何将用户状态(例如离线和在线等)发送给仅使用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是否可以,还是有一种更好的方式一次获取多个状态?

1 个答案:

答案 0 :(得分:0)

您正在使用散列类型来存储单个信息,并且正在使用hgetall来检索它,所以我假设您还不熟悉redis数据类型。因此,首先让我简要说明一下我将要讨论的三种数据类型(在文档https://redis.io/topics/data-types-intro中找到所有类型):

  • 字符串:是简单的键/值类型,可通过set(key, value)get(key, value)来访问它
  • 哈希:是一堆存储在一个redis密钥下的密钥/值。对于存储实体的属性很有用,例如您可以拥有一个“ userdata:userID”键,并使用它来存储名称,头像,状态...。使用hset(key, field, value)hget(key, field)hgetall(key)
  • 对其进行访问
  • 集合:是唯一字符串的集合,可通过sadd(key, member)sismember(key, member)smembers(key)
  • 访问

如果只想保存在线状态,使用带set,get和del的字符串类型会更干净(因为通常大多数用户大多数时间都处于离线状态,请删除它们并节省空间)。对于这种简单的键/值用例,redis实际上甚至不比旧的内存缓存好。

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

另一种方法可能是将所有用户存储在sadd('users:online', userID)的SET中,并使用sismember('users:online', userID)进行检查,或者使用smembers('users:online')来获取所有在线用户。假设您将所有朋友都存储在另一个SET friends:userID中,则可以使用一个相交命令sinter('friends:userID', 'users:online')来抓住用户的所有在线朋友-很好而优雅的恕我直言,但是由于状态不同而变得复杂,并且没有无法使用redis-cluster。

我更喜欢SET方法。多个hget也应该没问题,直到您遇到一个人(总是一个)的问题,因为这个人有数千个联系人并且一直刷新。到那时,您仍然可以引入一些友谊限制或缓存。