您使用散列类型来存储单个信息,并且使用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也应该是好的,直到你遇到问题,因为一个人(总有一个)有成千上万的接触和刷新的时间。此时,您仍然可以引入一些友谊限制或缓存。