我在互联网上查找如何使用套接字 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/