使用Redis实现关注关系

最近使用关系型数据库实现了用户之间的关注,因而思考换一种思路,使用Redis实现用户之间的关注关系。
综合考虑了一下Redis的几种数据结构后,以为能够用集合实现一下。html

假设“我”的ID是1,“别人”的ID是2。redis

1、添加关注

添加关注分为两步:一、将对方id添加到本身的关注列表中;二、将本身的id添加到对方的粉丝列表中:数据库

SADD 1:follow 2
SADD 2:fans 1

2、取消关注

取消关注一样分为两步:一、将对方id从本身的关注列表中移除;二、将本身的id从对方的粉丝列表中移除:数据结构

SREM 1:follow 2
SREM 2:fans 1

3、关注列表

查看个人关注列表:code

SMEMBERS 1:follow

查看别人的把id换掉就能够htm

4、粉丝列表

查看个人粉丝列表:blog

SMEMBERS 2:fans

查看别人的把id换掉就能够排序

5、人物关系

5.1 我单向关注他

我单向关注他,要同时知足两个条件:一、个人关注列表中他(或他的粉丝列表中我);二、个人粉丝列表中没有他(或他的关注列表中没有我)。索引

SISMEMBER 1:follow 2  #true
SISMEMBER 1:fans 2    #false

5.2 他单向关注我

他单向关注我,要同时知足两个条件:一、个人关注列表中没有他(或他的粉丝列表中没有我);二、个人粉丝列表中他(或他的关注列表中我)。get

SISMEMBER 1:follow 2  #false
SISMEMBER 1:fans 2    #true

5.3 我和某人是否互粉

我和某人是否互粉,要同时知足两个条件:一、个人关注列表中有他(或他的粉丝列表中有我);二、个人粉丝列表中有他(或他的关注列表中有我)。同时成立才为互粉。

SISMEMBER 1:follow 2  #true
SISMEMBER 1:fans 2    #true

互粉的关系是互相的,也能够反过来查。

6、个人互粉

查询和我互粉的人,实际是对个人关注和个人粉丝求交集

SINTER 1:follow 1:fans

7、共同关注

查询1和2的共同关注,实际是1的关注和2的关注求交集

SINTER 1:follow 2:follow

8、数量相关

8.1 个人关注数

SCARD 1:follow

8.2 个人粉丝数

SCARD 1:fans

9、问题

目前存在的问题是,个人关注列表 & 个人粉丝列表,没法作到按关注时间排序,终端下显示是结果按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

相关文章
相关标签/搜索