我一直在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是否可以,还是有一种更好的方式一次获取多个状态?
答案 0 :(得分:0)
您正在使用散列类型来存储单个信息,并且正在使用hgetall来检索它,所以我假设您还不熟悉redis数据类型。因此,首先让我简要说明一下我将要讨论的三种数据类型(在文档https://redis.io/topics/data-types-intro中找到所有类型):
set(key, value)
和get(key, value)
来访问它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也应该没问题,直到您遇到一个人(总是一个)的问题,因为这个人有数千个联系人并且一直刷新。到那时,您仍然可以引入一些友谊限制或缓存。