zoukankan      html  css  js  c++  java
  • redis微博——推模型

    最近在看了一下关于redis的内容,然后利用redis写了一个简单的微博项目,这篇文章是关于推模型的。

    推模型

    所谓推模型,就是用户在发布微博的时候会将微博推送给关注者和自己,然后其他关注者登录之后就可以看到发布的微博。

    微博项目数据结构设计

    user表设计

    注册的时候将user数据写入redis中,key如下:

    user数据的key
    用户名=user:uesrid:$uesrid:username
    密码=user:userid:$userid:password

    还需要这样写一份,因为需要靠用户名来登录,这样就可以根据用户名来查询用户id。

    user:username:userid:$userid

    关注的人和粉丝设计

    每个用户在产生关注的动作后,在redis中维护两个无序集合set,一个是following,一个是followerfollowing集合保存的是我关注的人,follower集合保存的是我的粉丝。注意是每个用户都要维护这样的两个集合,用userid来区。

    微博表设计

    每条微博的信息用hash结构来存储,根据不同的微博id来区分,每条微博有如下信息:发布人id,发布人昵称,发布时间,微博内容。

    推送表设计

    用户在发布微博的时候,将微博推送给自己的粉丝,每个粉丝都维护一个推送微博的链表,这个链表只保存50条最新微博。推送表中保存的是微博id.

    关注操作

    我们在redis中维护两个无序集合set,一个是following,一个是followerfollowing集合保存的是我关注的人,follower集合保存的是我的粉丝。注意是每个用户都要维护这样的两个集合,用userid来区分。

    核心代码:

    $conn = connredis();//连接redis
    if($f){//如果没有关注过
        $conn->sadd('following:'.$user['userid'],$userid);
        $conn->sadd('follower:'.$userid,$user['userid']);
    }else{
        $conn->srem('following:'.$user['userid'],$userid);
        $conn->srem('follower:'.$userid,$user['userid']);
    }

    发布微博

    遍历自己的粉丝,给每个粉丝都推送一条微博,将推送的微博保存到每个用户的推送表中

    核心代码:

    //1、保存微博
    $conn = connredis();//连接redis
    $postid = $conn->incr('global:postid');//生成微博id
    //保存微博数据
    $conn->hmset('post:postid:'.$postid,['userid'=>$user['userid'],'username'=>$user['username'],'time'=>time(),'content'=>$content]);
    
    //2、推送微博
    $fans = $conn->smembers('follower:'.$user['userid']);//获取所有粉丝
    $fans[] = $user['userid'];//自己也要推送一份
    foreach($fans as $u){
        $conn->lpush('receivepost:'.$u,$postid);
        $conn->ltrim('receivepost:'.$u,0,49);//每个人保存最新微博50条
    }
    

    展示微博

    首先连接redis,然后获取自己的推送表的信息,遍历推送表,然后获取微博内容,最后获取自己的粉丝和关注数。进行数据展示即可。

    //获取推送的微博id
    $conn = connredis();
    $postids = $conn->sort('receivepost:'.$user['userid'],['sort'=>'desc']);
    
    //获取微博
    $posts = [];
    foreach($postids as $postid){
    $posts[] = $conn->hmget('post:postid:'.$postid,['userid','username','time','content']);
    }
    //获取粉丝和关注数
    $fansnum = $conn->scard('follower:'.$user['userid']);
    $follownum = $conn->scard('following:'.$user['userid']);

    总结

    推模型的微博实例,实现还是比较简单的,但是推模型对性能有影响,假如我是一个大V,微博关注数有2000W,我在发微博的时候需要给2000W个人推送一条微博,但是很多人又是僵尸粉,可想而知对性能有一定的影响。我很可以将推模型改为拉模型,这样就能解决这个问题了。

  • 相关阅读:
    C#磁吸屏幕窗体类库
    准备
    我写的诗
    How to turn off a laptop keyboard
    How to tell which commit a tag points to in Git?
    Why should I care about lightweight vs. annotated tags?
    How to get rid of “would clobber existing tag”
    Facebook, Google and Twitter threaten to leave Hong Kong over privacy law changes
    The need for legislative reform on secrecy orders
    Can a foreign key be NULL and/or duplicate?
  • 原文地址:https://www.cnblogs.com/cnsec/p/13406983.html
Copyright © 2011-2022 走看看