我有一個應用程序(nodejs/express),需要根據一天中的時間和星期幾查找要應用的路由規則。REDIS - 創建有意義的鍵來減少查詢
因此,例如,我有以下業務規則:
-
在星期一和星期二
- 09:00 GMT和12:00 GMT之間,我需要路由對象農行「位置x」。
- 週二13:00到13:30我需要將ABC路由到「位置y」。
(爲了這個討論的目的,真的沒關係ABC是什麼對象。)
我兩個選擇之間的辯論,據我應該如何設計我的Redis數據庫我的鑰匙
選項1
讓天信息中的對象數據的一部分,是這樣的:
HMSET routing_rules:objectABC_09:00_12:00 days 'mon tues' location X
HMSET routing_rules:objectABC_13:00_13:30 days 'tues' location Y
這種方法的
優勢 - 當它的時間來更新天名單我可以簡單地這樣做:
HMSET routing_rules:objectABC_09:00_12:00 days 'mon tues thu'
這裏的缺點是,爲了找到合適的規則,我必須讓兩個查詢.. ..首先做一個SCAN命令來找到合適的時間範圍......然後如果有匹配的話......做另一個查詢來查找天數值。
選項2
包括周信息的一天的關鍵
HMSET routing_rules:objectABC_09:00_12:00_mt location X
HMSET routing_rules:objectABC_13:00_13:30_t location Y
的一部分,我會用像
m = monday
t = tuesday
w = wed
r = thursday
etc.
優點命名約定來選擇2是爲了根據當前時間和日期找到正確的路由規則,我只需要運行一個SCAN命令(我們可以假設我的掃描命令將返回一杆的結果)
但缺點選項2的是,當我需要一個新的一天增加的關鍵,我認爲我需要刪除鍵和值。 ..然後重新創建它。它是否正確?
而現在,我知道如何刪除的唯一方法是對對象中的每個值做一個HDEL,然後刪除該鍵。 因此,舉例來說,我一直在做這樣的事情:
127.0.0.1:6379> HDEL routing_rules:objectABC_00:00_00:00 days 'mon tues' location x
,我必須列出的所有對象的值刪除整個鍵/值對。 在這個例子中,它並沒有那麼糟糕,因爲我只有兩個值 - 這個鍵 - 位置和天數字段。但是如果有更多的數據,它會有點麻煩。除了與此關鍵字相關的字段數外,我不確定是否還有其他因素需要考慮。
如果您對如何設計此按鍵以獲得最佳性能和維護方面有任何建議,我完全理解。我看到它的方式,至少有一次無法避免運行掃描。但這是我的第一個redis數據庫嘗試,所以我提前爲補救性問題/ noob錯誤道歉。
編輯1
假設我有足夠的內存,並假設我只需要保存一個字段/每鍵值,讓我們說我創造了我的鑰匙是這樣的:
SET routing_rules:objectABC_09:00_12:00_m X
SET routing_rules:objectABC_09:00_12:00_t X
SET routing_rules:objectABC_13:00_13:30_t Y
而且現在請求進入對象ABC,星期一在UTC 11。因爲我的鍵表示開始時間和結束時間(又名範圍),所以我沒有看到如何在沒有執行掃描的情況下找到正確的鍵/值對。
我錯過了什麼嗎?
帕斯卡,什麼會被視爲條目數「高」值? – Happydevdays
與服務器上的可用內存相比,它取決於每個鍵+值的內存大小。 –
我認爲我將有大約15 GB使用...和50,000個對象,每個對象最多有5個路由規則。 – Happydevdays