最近使用關係型數據庫實現了用戶之間的關注,因而思考換一種思路,使用Redis實現用戶之間的關注關係。
綜合考慮了一下Redis的幾種數據結構後,以爲能夠用集合實現一下。html
假設「我」的ID是1,「別人」的ID是2。redis
添加關注分爲兩步:一、將對方id添加到本身的關注列表中;二、將本身的id添加到對方的粉絲列表中:數據庫
SADD 1:follow 2 SADD 2:fans 1
取消關注一樣分爲兩步:一、將對方id從本身的關注列表中移除;二、將本身的id從對方的粉絲列表中移除:數據結構
SREM 1:follow 2 SREM 2:fans 1
查看個人關注列表:code
SMEMBERS 1:follow
查看別人的把id換掉就能夠htm
查看個人粉絲列表:blog
SMEMBERS 2:fans
查看別人的把id換掉就能夠排序
我單向關注他,要同時知足
兩個條件:一、個人關注列表中有
他(或他的粉絲列表中有
我);二、個人粉絲列表中沒有
他(或他的關注列表中沒有
我)。索引
SISMEMBER 1:follow 2 #true SISMEMBER 1:fans 2 #false
他單向關注我,要同時知足
兩個條件:一、個人關注列表中沒有
他(或他的粉絲列表中沒有
我);二、個人粉絲列表中有
他(或他的關注列表中有
我)。get
SISMEMBER 1:follow 2 #false SISMEMBER 1:fans 2 #true
我和某人是否互粉,要同時知足
兩個條件:一、個人關注列表中有他(或他的粉絲列表中有我);二、個人粉絲列表中有他(或他的關注列表中有我)。同時成立才爲互粉。
SISMEMBER 1:follow 2 #true SISMEMBER 1:fans 2 #true
互粉的關係是互相的,也能夠反過來查。
查詢和我互粉的人,實際是對個人關注和個人粉絲求交集
SINTER 1:follow 1:fans
查詢1和2的共同關注,實際是1的關注和2的關注求交集
SINTER 1:follow 2:follow
SCARD 1:follow
SCARD 1:fans
目前存在的問題是,個人關注列表 & 個人粉絲列表,沒法作到按關注時間排序,終端下顯示是結果按ID正序排列的。
考慮的解決方案是添加關注時同時存一份有序集合,關注時的時間戳是score。
ZADD 1:follow 1457871625 2 ZADD 2:fans 1457871625 1
那麼個人關注列表是:
ZREVRANGE 1:follow 0 -1
同時,ZREVRANGE查詢時的索引能夠做爲分頁遊標,基本解決目前的問題。
粉絲列表同理。
要不要留本身博客,留吧。之後以爲不合適再刪。
http://blog.lovemydeer.com/2016/03/13/relation-with-redis.html