最近使用关系型数据库实现了用户之间的关注,于是思考换一种思路,使用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查询时的索引可以作为分页游标,基本解决目前的问题。
粉丝列表同理。