在使用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端點實施了一種解決方法。但是你知道,更多的代碼意味着更多的潛在錯誤。
和平
謝謝@埃文 - 哈伯,這是一個非常簡單的事情,但我看不到它,因爲我在考慮對於Popping/Pushing對象,我需要像LMHPUSH/RMHPOP那種奇怪的東西。 這解決了我的疑問,並解決了暴露問題的思維。 –
太棒了 - 隨時可以回來進行進一步的思維調整;) –