2015-05-22 43 views
2

我正在開發一個照片共享和跟隨系統的應用程序,所以無論誰遵循x用戶然後x用戶照片將出現在他的以下。執行以下流程

我在Redis的存儲我的數據如下

sadd rdis_key+user_id photo_id 
set redis_key+photo_id+data data_of_photo 
sadd redis_key+follow+user_id follower_id 

現在我想直接讓追隨者的所有photo_id不用循環。

+0

你在'data_of_photo'裏面儲存了什麼?你認爲使用'Redis'作爲應用程序的數據存儲是個好主意嗎?考慮MongoDB的[GridFS](http://docs.mongodb.org/manual/core/gridfs/):) – bagrat

+0

@ n9code我知道我可以在MongoDB中存儲數據,但這不是問題。我如何獲得追隨者的photo_is。這就是我期待的 – jayprakashstar

+0

只是建議。 redis的問題是你不能在那裏查詢。你的選擇要麼是Lua,要麼在你的客戶端實現你的查詢。 – bagrat

回答

2

這是一個簡單的扇出問題,您無法直接使用Redis輕鬆完成。

你可以用Lua來做,但是你會在動作中阻止Redis。

我有一個開源項目,它做同樣的事情,但我在代碼中做,因爲有人創建一個新的職位。我會想象這就像一張新照片。

https://github.com/pjuu/pjuu/blob/master/pjuu/posts/backend.py#L252

我用的有序集合,雖然和使用UNIX時間戳分數,所以他們總是爲了。

當User1創建一張新照片時,您會查找其關注者列表。如果您使用的是有序集合,你可以通過得到這樣的:

followers = zrange followers:user1 0 -1

然後簡單地遍歷該列表中的所有條目:

for follower in followers: zadd feed:user2 <timestamp> <photo_id>

這樣,這個新的職位,現在推出給跟隨用戶1的所有用戶。

如果你希望在飛行中完成這個工作,那麼壞消息:你將需要一些關係數據和一種方法來查詢你不能做的值。 SQL,Mongo,Couch等...

這只是僞代碼,因爲您沒有提及您使用的是哪種語言。

編輯:由於每個問題,這是要在Redis的側

local followers = redis.call('zrange', KEYS[1], 0, -1) 

for key, value in pairs(followers) do 
    redis.call('zadd', 'items:'..value, ARGV[1], ARGV[2]) 
end 

return true 

這樣做將採取用戶追隨者的關鍵迭代。 zset分數和值,並將這些添加到每個用戶的項目中。你需要改變它以適應你的確切需求。如果你想使用set,你將需要使用sscan或其他東西。 Zsets雖然並且按順序更容易。

+0

喬這就是我不想要的。請看我以前的評論。我不想循環它。循環使其變慢。 – jayprakashstar

+0

當我在電腦上時,我會發佈一個lua版本。它可能會比較慢,但是如果在這段時間內有更多的用戶嘗試執行其他命令,阻止Redis的這段時間會使其顯得更加緩慢。如果它不一定是瞬間的,你可以推遲扇子出來給工人,不要阻止任何東西 –

+0

我已經添加了一個你可以做的Lua例子。 –