微博案例-互相关注

个人认为这个案例还是很经典的

  • 这个案例很好的实现了,如何记录我关注了哪些人,哪些人关注了我
  • 用set 结构进行去重, 关键是当我关注别人的时候如何存储
    上代码:
  /**
     * 关注别人
     * @param userId 自己
     * @param followUserId 你要关注的人
     */
    public void follow(long userId, long followUserId){

        //我关注了谁 需要在我关注的人的 集合中增加一条记录
        jedis.sadd("user::" + followUserId +"::followers",String.valueOf(userId));
        //我关注人的集合
        jedis.sadd("user::" +userId + "::follow_users",String.valueOf(followUserId));
    }
  • 以上代码中一个方法内,存储了两个SET,那么这两个set是干嘛的那
    试想我们如果不用redis,用数据库存储的话,是不是需要设计数据库表,那么我们就会这样设计,
    一张是用户表,记录用户基础信息
    一张是用户关注明细,记录谁关注了此用户,字段为userId,follwUserId
    我们在检索的时候查询 我被谁关注了 就直接select * from 关系表 where userId= 自己
    那么检索我关注了谁那? 就是select * from 关系表 where follwUserId= 自己
    是不是很简单,但是这样每次查库性能是不行的,所以我么要将这些数据提前聚合到缓存中:
  • 也就出现了 上段代码中的:两个set
  • 一个set用来存储被关注的人的集合中插入谁关注了他,谁那,就是我,key为我要关注的人的id,"user::" + followUserId +"::followers" value:为 自己
  • 一个set用来存储我关注了哪些人的集合, 那么key 为自己的id, value为你所关注的人

取消关注

/**
    * 取消关注
    * @param userId
    * @param followUserId
    */
   public void unfollow(long userId, long followUserId){
       jedis.srem("user::" + followUserId +"::followers",String.valueOf(userId));
       jedis.srem("user::" +userId + "::follow_users",String.valueOf(followUserId));
   }

查看哪些人关注了我

/**
     * 查看有哪些人关注了我
     * @param userId
     * @return
     */
    public Set<String> getFollowers(long userId){
        return jedis.smembers("user::" + userId +"::followers");
    }

    /**
     * 查看我关注了哪些人
     * @param userId
     * @return
     */
    public Set<String> getFollowUsers(long userId){
        return jedis.smembers("user::" +userId + "::follow_users");
    }
    /**
     * 查看自己关注的人数
     * @param userId
     * @return
     */
    public long getFollowUsersCount(long userId) {
        return jedis.scard("user::" + userId + "::follow_users");
    }
    /**
     * 查看自己关注的人数
     * @param userId
     * @return
     */
    public long getFollowersCount(long userId){
        return jedis.scard("user::" +userId + "::follow_users");
    }

    /**
     * 获取用户跟其他用户之间共同关注的人有哪些
     * @param userId
     * @param otherUserId
     * @return
     */
    public Set<String> getSameFollowUsers(long userId, long otherUserId){
       return jedis.sinter("user::" +userId + "::follow_users",
               "user::" +otherUserId + "::follow_users");
    }

   /**
     * 获取给我推荐的可关注人
     * 我关注的某个好友关注的一些人,我没关注那些人,此时推荐那些人给我
     * @param userId
     * @param otherUserId
     * @return
     */
    public Set<String> getRecommendFollowUsers(long userId, long otherUserId){
        return jedis.sdiff("user::" +userId + "::follow_users",
                "user::" +otherUserId + "::follow_users");
    }

很不错的案例

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。