最近项目要涉及到粉丝关注问题,权衡再三还是使用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); #顺序取值