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

最新文章

  1. 亚马逊S3下载上传文件
  2. NoSuchMethodError
  3. VI查找与替换
  4. 技术型创业者easy遇到的三大问题
  5. SQL 从100万条记录中的到 成绩最高的记录
  6. 使用最新的log4cplus(1.1.1)隔离不同的 log 文件输出
  7. express 安装和运行
  8. Urozero Autumn 2016. NCPC 2016
  9. Redis持久化及其配置
  10. CSS3D写3d画廊滚动
  11. android端如何实现设置颜色透明度?
  12. [转帖] Linux运维基础知识学习内容
  13. 【R】函数-数学函数
  14. 定义与声明、头文件与extern总结
  15. 又一家药企IPO被拒,原因竟然是……
  16. jenkins 下载插件失败处理办法
  17. sublime设置右键在浏览器打开
  18. PHP 编译安装 gd 库
  19. PDF快速创建目录
  20. 2016vr 相关白皮书

热门文章

  1. 【t005】数字构造问题
  2. 版本控制(1)——SVN
  3. api的管理工具
  4. ice框架应用记录-框架说明
  5. VS Code插件之Cordova Tools
  6. C++闭包,一样很简单
  7. python去噪算法
  8. 将grub写入mbr
  9. WPF依赖属性(续)(1)
  10. Windows 10 应用创建模糊背景窗口的三种方法