最近項目要涉及到粉絲關注問題,權衡再三還是使用Redis實現比較方便,使用Redis的有序集合可以做到根據關注的時間有序的取出列表,假設我的ID是me,別人的ID是other。
1. 添加關注
添加關注分為兩步:
1、將對方id添加到自己的關注列表中;
Redis::ZADD("me:follow", time(), other)
2、將自己的id添加到對方的粉絲列表中:
Redis::ZADD("other:fans", time(), me)
2. 取消關注
取消關注同樣分為兩步:
1、將對方id從自己的關注列表中移除;
Redis::ZREM("me:follow", other)
2、將自己的id從對方的粉絲列表中移除:
Redis::ZREM("other:fans", me)
3. 關注列表
1、查看我的關注列表:
Redis::ZRANGE("me:follow", 0 , -1)
2、查看別人的把id換掉就可以
Redis::ZRANGE("other:follow", 0 , -1)
4. 粉絲列表
1、查看我的粉絲列表:
Redis::ZRANGE("me:fans", 0 , -1)
2、查看別人的把id換掉就可以
Redis::ZRANGE("other:fans", 0 , -1)
5. 人物關系
1、 我單向關注他
我單向關注他,要同時滿足兩個條件:1、我的關注列表中有他(或他的粉絲列表中有我);2、我的粉絲列表中沒有他(或他的關注列表中沒有我)。
Redis::ZSCORE("me:fans", other) #未返回分數
Redis::ZSCORE("me:follow", other) #返回分數
2、 他單向關注我
他單向關注我,要同時滿足兩個條件:1、我的關注列表中沒有他(或他的粉絲列表中沒有我);2、我的粉絲列表中有他(或他的關注列表中有我)。
Redis::ZSCORE("other:fans", me) #未返回分數
Redis::ZSCORE("other:follow", me) #返回分數
3、 是否互粉
我和某人是否互粉,要同時滿足兩個條件:1、我的關注列表中有他(或他的粉絲列表中有我);2、我的粉絲列表中有他(或他的關注列表中有我)。同時成立才為互粉。
Redis::ZSCORE("me:fans", other) #返回分數
Redis::ZSCORE("me:follow", other) #返回分數
6. 數量相關
1、 我的關注數
Redis::ZCARD("me:follow"); #返回數量
2、 我的粉絲數
Redis::ZCARD("me:fans"); #返回數量
7. 排序取出所有的人
1、根據關注的時間倒敘取出用戶的id
Redis::ZREVRANGE("me:fans", 0, -1, TRUE); #倒序取值
2、根據關注時間順序取出用戶的id
Redis::ZRANGE("me:fans", 0, -1, TRUE); #順序取值