我正在開發一個照片共享和跟隨系統的應用程序,所以無論誰遵循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不用循環。
我正在開發一個照片共享和跟隨系統的應用程序,所以無論誰遵循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不用循環。
這是一個簡單的扇出問題,您無法直接使用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雖然並且按順序更容易。
喬這就是我不想要的。請看我以前的評論。我不想循環它。循環使其變慢。 – jayprakashstar
當我在電腦上時,我會發佈一個lua版本。它可能會比較慢,但是如果在這段時間內有更多的用戶嘗試執行其他命令,阻止Redis的這段時間會使其顯得更加緩慢。如果它不一定是瞬間的,你可以推遲扇子出來給工人,不要阻止任何東西 –
我已經添加了一個你可以做的Lua例子。 –
你在'data_of_photo'裏面儲存了什麼?你認爲使用'Redis'作爲應用程序的數據存儲是個好主意嗎?考慮MongoDB的[GridFS](http://docs.mongodb.org/manual/core/gridfs/):) – bagrat
@ n9code我知道我可以在MongoDB中存儲數據,但這不是問題。我如何獲得追隨者的photo_is。這就是我期待的 – jayprakashstar
只是建議。 redis的問題是你不能在那裏查詢。你的選擇要麼是Lua,要麼在你的客戶端實現你的查詢。 – bagrat