最近使用關係型資料庫實現了用戶之間的關註,於是思考換一種思路,使用Redis實現用戶之間的關註關係。 綜合考慮了一下Redis的幾種數據結構後,覺得可以用集合實現一下。 假設“我”的ID是1,“別人”的ID是2。 一、添加關註 添加關註分為兩步:1、將對方id添加到自己的關註列表中;2、將自己的id ...
最近使用關係型資料庫實現了用戶之間的關註,於是思考換一種思路,使用Redis實現用戶之間的關註關係。
綜合考慮了一下Redis的幾種數據結構後,覺得可以用集合實現一下。
假設“我”的ID是1,“別人”的ID是2。
一、添加關註
添加關註分為兩步:1、將對方id添加到自己的關註列表中;2、將自己的id添加到對方的粉絲列表中:
SADD 1:follow 2
SADD 2:fans 1
二、取消關註
取消關註同樣分為兩步:1、將對方id從自己的關註列表中移除;2、將自己的id從對方的粉絲列表中移除:
SREM 1:follow 2
SREM 2:fans 1
三、關註列表
查看我的關註列表:
SMEMBERS 1:follow
查看別人的把id換掉就可以
四、粉絲列表
查看我的粉絲列表:
SMEMBERS 2:fans
查看別人的把id換掉就可以
五、人物關係
5.1 我單向關註他
我單向關註他,要同時滿足
兩個條件:1、我的關註列表中有
他(或他的粉絲列表中有
我);2、我的粉絲列表中沒有
他(或他的關註列表中沒有
我)。
SISMEMBER 1:follow 2 #true
SISMEMBER 1:fans 2 #false
5.2 他單向關註我
他單向關註我,要同時滿足
兩個條件:1、我的關註列表中沒有
他(或他的粉絲列表中沒有
我);2、我的粉絲列表中有
他(或他的關註列表中有
我)。
SISMEMBER 1:follow 2 #false
SISMEMBER 1:fans 2 #true
5.3 我和某人是否互粉
我和某人是否互粉,要同時滿足
兩個條件:1、我的關註列表中有他(或他的粉絲列表中有我);2、我的粉絲列表中有他(或他的關註列表中有我)。同時成立才為互粉。
SISMEMBER 1:follow 2 #true
SISMEMBER 1:fans 2 #true
互粉的關係是互相的,也可以反過來查。
六、我的互粉
查詢和我互粉的人,實際是對我的關註和我的粉絲求交集
SINTER 1:follow 1:fans
七、共同關註
查詢1和2的共同關註,實際是1的關註和2的關註求交集
SINTER 1:follow 2:follow
八、數量相關
8.1 我的關註數
SCARD 1:follow
8.2 我的粉絲數
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