Py学习  »  Redis

使用Redis发送好友状态

Supertiger • 5 年前 • 515 次点击  

我环顾互联网,想知道如何使用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,或者是否有更好的方法一次获得多个状态?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/30836
 
515 次点击  
文章 [ 1 ]  |  最新文章 5 年前
sui
Reply   •   1 楼
sui    5 年前

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

  • 字符串:是一个简单的键/值类型,使用 set(key, value) get(key, value)
  • hash:是一个redis键下存储的一组键/值。对于存储实体的属性很有用,比如您可以有一个“userdata:userid”键和存储名称、虚拟人物、状态…有了它。访问它 hset(key, field, value) , hget(key, field) , hgetall(key)
  • 集合:是唯一字符串的集合,使用 sadd(key, member) , sismember(key, member) , smembers(key)

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

如果要存储更多与用户相关的属性(mood、motto、avatar…),应将其重命名为“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也应该是好的,直到你遇到问题,因为一个人(总有一个)有成千上万的接触和刷新的时间。此时,您仍然可以引入一些友谊限制或缓存。