2016-05-12 71 views
0

我有那些數據足夠改變不在我的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個用戶呢?

或者還有另外一種方法嗎?

回答

1

一種可能性是使用單個排序集+散列。

排序後的集合僅用作查找,它會將用戶散列的關鍵字存儲爲值,並將其級別存儲爲分數。

任何時候你添加一個新玩家/更新他們的級別,你都會設置哈希,並將該項插入到有序集中。您可以在基於事務的管道或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