最好的方式来存储数据,并已同时订购列表

问题描述:

我有那些数据足够改变不在我的postgres表。 我想从这些数据中脱颖而出。 我试图想出一个办法做到这一点考虑:最好的方式来存储数据,并已同时订购列表

  • 使用的容易程度的
  • 性能

1.使用哈希+科雷打造有序集频繁

在这种情况下,我有很多用户数据存储在哈希中,如下所示:

u:25463:d = { "xp":45124, "lvl": 12, "like": 15; "liked": 2 }

u:2143:d = { "xp":4523, "lvl": 10, "like": 12; "liked": 5 }

如果我想获得更高的LVL人的前15名。我不认为我可以用一个命令做到这一点。我想我需要扫描所有u:x:d数据并从中创建有序集。我错了吗? 这种情况下的性能如何?

2.Multiple有序集

在这种情况下,我重复DATAS。 我仍然需要第一种情况,但我也更新了不同的排序集中的数据,我不需要使用CRON来构建它们。

我觉得最好的方法是第一个,但如果我有1000000个用户呢?

或者还有另外一种方法吗?

一种可能性是使用单个排序集+散列。

排序后的集合仅用作查找,它会将用户散列的关键字存储为值,并将其级别存储为分数。

任何时候你添加一个新玩家/更新他们的级别,你都会设置哈希,并将该项插入到有序集中。您可以在基于事务的管道或lua脚本中执行此操作,以确保它们同时运行,从而保持数据的一致性。获得顶级玩家将意味着抓取排序集合中的顶级条目,然后使用该集合中的键来查找具有哈希的玩家的全部数据。

希望有所帮助。

+0

我喜欢这个想法,非常感谢!还有一个问题:你认为我应该将lvl存储在哈希中,即使这个值也在有序集合中?我可以避免重复。这意味着,当我需要某个特定ID的数据时,我必须得到这个散列,并且在排序集中寻找lvl。在这种情况下的表现如何? – Tom

+1

这是一个非常聪明的想法,可以消除重复。 您可以使用ZSCORE直接在排序集合中查找级别,这是一个O(1)操作应该非常快速并且几乎不会影响性能。只要确保将这两个读取管道连接起来,以免在运行两个命令时支付额外的开销。 – AlexB

+1

一般来说,查看每个命令列出的O()表示法是很好的。 HTTP:// Redis的。io/commands/zscore 任何有0(1)的东西都是免费的。这意味着无论您拥有多少数据,都需要相同的时间。 O(n)表示如果您有n个数据点,则算法中需要n个步骤。把n想象成代数中的一个变量。 一般来说,保持o(1)和o(lg n)是你希望保持成本效益的游戏,希望能够扩展。 参考检查:他出https://rob-bell.net/2009/06/a-beginners-guide-to-big-o-notation/ – AlexB