zoukankan      html  css  js  c++  java
  • Redis实现关注关系

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

  • 相关阅读:
    转载:GPRS发短信代码
    如何辨别假币
    【转载】软件开发方向的大学生应该学什么
    第一次喝吐了
    挑战世界2%
    45、c_str与data()
    2、Get和post的区别
    4、suse11安装apache
    1、学习用c/c++写cgi程序
    4、安装rz/sz
  • 原文地址:https://www.cnblogs.com/wjfz/p/5367472.html
Copyright © 2011-2022 走看看