2017-11-10 201 views
1

在使用Redis處理排隊系統時,我可能會用錯誤的思維方式,這就是爲什麼我需要你們爲此提供幫助。Redis處理排隊管理機制

所以,我有這個相當簡單的隊列,負責將電子郵件堆疊到一個集合上,然後檢索堆棧的可用電子郵件並分發它。

該系統是在NodeJS中構建的,因此我正在使用node-redis lib。

隊列(堆棧)應該是不斷可用的,一個點在其上添加(推送)新的電子郵件,另一個則彈出第一個被推入的項目。

對於這種方法,我可能會想到JavaScript'ish,以及我在Redis文檔中發現的內容,可能不太合適,所以在這裏我來找你們來幫助我在談論Redis時獲得正確的思維方式語言。

用一個簡單的例子,在JSON,這裏是我的隊列堆:

queue = [ 
{ 
    _id: 5a05eec08a7e66eb10ad6361, 
    email: "some html content in here", 
    domain: "domain.com" 
}, 
{ 
    _id: 5a05eb785710017b7d7a0243, 
    email: "some more html content here", 
    domain: "domain.com" 
}, 
... 
] 

而且通過看Redis Documentation 我發現我可以做這樣的事情每個電子郵件推入堆棧:

HMSET queue:5a05eec08a7e66eb10ad6361 email "some html content in here" domain "domain.com" 
HMSET queue:5a05eb785710017b7d7a0243 email "some more html content here" domain "domain.com" 

,而我可以明確地檢索一個 '集' 是這樣的:

HMGET queue:5a05eec08a7e66eb10ad6361 email 
HMGET queue:5a05eec08a7e66eb10ad6361 domain 
HMGET queue:5a05eb785710017b7d7a0243 email 
HMGET queue:5a05eb785710017b7d7a0243 domain 

直到這一點,一切都非常香草。但問題在於,當它涉及到一個排隊系統時,必須使用語言/數據庫爲您提供的PUSH和POP功能。

我確實能夠找到Redis提供的PUSH和POP機制,但我只能在處理單個尺寸的KEY時使用它。

所以,在我的情況,而不是彈出一個單一的項目,如:

RPOP email 

我真正需要的是這樣的:

RPOP queue //see the abstraction here? calling the stack and not a single item? 

隨着又將回到我 - 在同時間刪除 - 此隊列集合中的最後一個項目。

所以,

RPOP queue //or whatever other command I couldn't find 

應該給我

{ 
    _id: 5a05eec08a7e66eb10ad6361, 
    email: "some html content in here", 
    domain: "domain.com" 
} 

...然後,用另一個

RPOP queue 

回我

{ 
    _id: 5a05eb785710017b7d7a0243, 
    email: "some more html content here", 
    domain: "domain.com" 
} 

等等,直到它呈現這個「隊列」爲空。

我希望自己清楚自己的心態,以及問題本身。

我不能使用HMGET機制,對於任何隊列,而一端可能會從底部彈出的項目,另一端可能被堆放在它之上的新項目中的代碼進行迭代。所以,通過編寫一些「重組索引」機制來保持一定程度的黑客行爲。

至此,我開始相信Redis不會爲我提供必要的工具來支持這種「多維」堆棧方法。不錯,恕我直言,Redis可能不是我需要的答案。

但是我知道我現在可能會有錯誤的觀念,可能Redis提供了一種優雅的方式來處理這個問題,但是從完全不同的方法來看。我不會僅僅使它與RPUSH和LPOP一起工作,因爲正如我已經提到的那樣,它只是爲我提供了一種處理簡單的單維KEY VALUEs的方法。

如果Redis沒有爲此提供某些支持,我已經在NodeJS端點實施了一種解決方法。但是你知道,更多的代碼意味着更多的潛在錯誤。

和平

回答

1

你並不需要打破你的隊列中的內容轉換成離散的哈希值,除非你打算訪問他們的子元素。如果你我理解正確,你需要的是經典的LPUSH/RPOP列表隊列模式。在該列表中的成員可以是任何東西,但在你的情況下,最簡單的是隻存儲每個元素的原始序列化JSON,如:

LPUSH queue '{_id: 5a05eec08a7e66eb10ad6361, email: "some html content in here", domain: "domain.com"}' 
+0

謝謝@埃文 - 哈伯,這是一個非常簡單的事情,但我看不到它,因爲我在考慮對於Popping/Pushing對象,我需要像LMHPUSH/RMHPOP那種奇怪的東西。 這解決了我的疑問,並解決了暴露問題的思維。 –

+1

太棒了 - 隨時可以回來進行進一步的思維調整;) –