最近使用关系型数据库实现了用户之间的关注,于是思考换一种思路,使用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.icp0.com/

Redis实现关注关系的更多相关文章

  1. 案例:用Redis来存储关注关系(php版)

    Redis提供了丰富的数据类型,比起关系型数据库或者简单的Key-Value存储(比如Memcached)来,Redis的数据模型与实际应用的数据模型更相近.比如下面说到的好友关系的存储,原作者使用了 ...

  2. 案例:用Redis来存储关注关系

    Redis提供了丰富的数据类型,比起关系型数据库或者简单的Key-Value存储(比如Memcached)来,Redis的数据模型与实际应用的数据模型更相近.比如下面说到的好友关系的存储,原作者使用了 ...

  3. 使用Redis实现关注好友的功能

    现在很多社交都有关注或者添加粉丝的功能, 类似于这样的功能我们如果采用数据库做的话只是单纯得到用户的一些粉丝或者关注列表的话是很简单也很容易实现, 但是如果我想要查出两个甚至多个用户共同关注了哪些人或 ...

  4. 另外一种获取redis cluster主从关系和slot分布的方法

    条条大路通罗马,通过最近学习redis cluster 观察其输出,发现了另外一种获取master-slave关系的方法. [redis@lxd-vm1 ~]$ cat get_master_slav ...

  5. php + redis 实现关注功能

    产品价值 1: 关注功能 2: 功能分析之"关注"功能 3: 平平无奇的「关注」功能,背后有4点重大价值 应用场景 在做PC或者APP端时,掺杂点社交概念就有关注和粉丝功能; 数据 ...

  6. Redis中的关系查询(范围查询,模糊查询等...)

    本文部分转自于:http://blog.csdn.net/dc_726/article/details/42784317 本文对Redis如何保存关系型数据,以及如何对其匹配.范围.模糊查询进行举例讲 ...

  7. Redis中的关系查询

    本文对Redis如何保存关系型数据,以及如何对其匹配.范围.模糊查询进行举例讲解,其中模糊查询功能基于最新的2.8.9以后版本. 1 关系型数据的存储 以Staff对象为例,在关系型数据库或类似Gri ...

  8. 生成指定规模大小的redis cluster对关系

    需求: 指定一批ip列表,生成指定规模大小的redis cluster主从对应关系. ip_list=(1.1.1.1 2.2.2.2 3.3.3.3 4.4.4.4 5.5.5.5) port=70 ...

  9. 第3种方法获取redis cluster主从关系

    需求:使用cluster slots命令,获取redis cluster 主从对应关系. 说明:cluster slots命令对应的字段说明:http://redis.cn/commands/clus ...

随机推荐

  1. 常用binlog日志操作命令

    1.查看所有binlog日志列表 mysql> show master logs; 2.查看master状态,即最后(最新)一个binlog日志的编号名称,及其最后一个操作事件pos结束点(Po ...

  2. Oracle 11g对依赖的推断达到字段级

    在Oracle 10g下,推断依赖性仅仅达到了对象级.也就是说存储过程訪问的对象一旦发生了变化.那么Oracle就会将存储过程置为INVALID状态.所以在为表做了DDL操作后.须要把存储过程又一次进 ...

  3. TensorFlow 学习(十四)—— contrib

    1. tensorflow.contrib.layers tf.contrib.layers.xavier_initializer():一种经典的权值矩阵的初始化方式:

  4. MKNetworkKit的断点续传SIDownloader下载

    comefrom:http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f73d6f8b9042238fce098 ...

  5. 【 D3.js 高级系列 — 2.0 】 机械图 + 人物关系图

    机械图(力路线图)结合老百姓的关系图中的生活,这是更有趣. 本文将以此为证据,所列的如何图插入外部的图像和文字的力学. 在[第 9.2 章]中制作了一个最简单的力学图.其后有非常多朋友有疑问,基本的问 ...

  6. 表达式树Expression

    Expression表达式树动态查询 在进行数据列表的查询中,我们通常会使用两种方式进行查询: linq查询 数据库sql语句查询 这样固然可以实现查询,本人之前也都是这么做的,因为查询的条件很少.使 ...

  7. git记不住用户名和密码

    以前我是用svn的 , 我也是最近才用的git 虽然git 有GUI界面  , 但是我觉得还是不如svn 最开始使用git的时候我们直接clone项目的时候可能会设置全局的账号和密码 , 但是我重装系 ...

  8. shell问题集合

    1.syntax error near unexpected token `then' if后要有空格,[] 中括号的开头和结尾要有空格! [ $1-eq"root" ]中括号中的 ...

  9. Mybatis 入门到理解篇

    MyBatis         MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code, ...

  10. 自由WiFi软体,你也太简单了

    自由WiFi市场热点,自然不用多说.支付宝钱包计划实现全民免费WiFi,360.百度.金山.小米都在着手WiFi产品. 只是.这些免费WiFi或者实现WiFi的硬件或软件.都是争夺新的市场入口,推广产 ...