node.js - 使用redis发送好友状态

标签 node.js mongodb redis socket.io

我在互联网上查找如何使用套接字 io 将用户状态(例如离线和在线等)发送给仅 friend 。有人说用Redis。所以我看了一下并尝试了一下。我还使用 mongodb 来存储 friend 和用户。

这是我现在的设置:

//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 数据类型。首先让我简要解释一下我将讨论的三种数据类型(在此处的文档中查找所有类型 https://redis.io/topics/data-types-intro ):

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

如果您只想保存在线状态,那么使用带有 set、get 和 del 的字符串类型会更干净(因为通常大多数用户大部分时间都处于离线状态,因此删除它们并节省空间)。对于这个简单的键/值用例,redis 实际上并不比老式的 memcache 更好。

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

另一种方法是将所有用户存储在 SET 中:sadd('users:online', userID) 并使用 sismember('users:online', userID) 检查code> 或使用 smembers('users:online') 获取所有在线用户。假设您将所有好友存储在另一个 SET friends:userID 中,您可以使用单个 intersect 命令 sinter('friends:userID', 'users:online') 获取用户的所有在线好友 - 相当漂亮和优雅恕我直言,但是这会因为更多不同的状态而变得复杂,并且不适用于 redis-cluster。

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

关于node.js - 使用redis发送好友状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54267075/

相关文章:

javascript - 当文件需要一个没有导出任何内容的模块时,对 Node.js 行为的困惑

具有不同的 Mongodb 聚合

MongoDB 聚合 : add field from an embedded document via a dynamic field path

redis - Logstash、elasticsearch、Kibana,包括IP

node.js - 使用 mongoose 创建唯一的自动增量字段

javascript - 使用Node.js打开23端口读取数据

node.js - NodeJS 和 ExpressJS 如何抛出错误?

node.js - Mongoose - 如何在自定义类型上添加 2dsphere 索引?

ruby-on-rails - 在使用 Resque-scheduler 和 redis 时提到的延迟时间过去后,延迟作业未进入主作业队列

nosql - 对于不适合内存的大型数据集,最好的缓存引擎是什么?