使用微博客的关注与实施
四个关系国家引起关注跟随
球迷
双向关注(交叉粉末)
没有关系
需求分析
在微博中,每个用户都有一个关注的列表,一个粉丝列表,用户可以查看自己的关注点,粉丝列表,也可以看到其他人的关注,粉丝列表,也显示每个人对列表和当前观众的关注状态。一个状态的可能性是存在四种关系状态。
这个问题可以分为两种情况。
1。看看你自己的注意力,粉丝名单
2。看看别人的注意力,球迷名单
看看你自己的注意力,粉丝名单:
这是相对简单的。例如,看看你的关注清单,名单中的人之间的关系不可能是一种关系和一种球迷。它只能是一种关注和双向关注。同样的,球迷名单只有两个州。
看看别人的注意力,球迷名单:
这是最复杂的例子。如果您查看其他人的列表,列表中的人和他们自己可能拥有所有四个关系。
从集合图分析
如上图所示,左边的圆圈代表了用户的注意力列表,右边的圆圈是一个粉丝列表,下面的圆圈是一个要看的列表(集合),跟随者、粉丝和查找被用来显示三个集合。
当你查看你的列表时,这意味着查找集是上述集合中的一些子集,例如,看看你自己的粉丝,指出find是粉丝的一个子集,关注你自己的注意力,表明find是后续的子集。
当查看其他列表时,该图中生成了三个集合的交集。集合中的用户可能在您的范中,在集合中,可能不存在。也就是说,它可能是任何关系状态。问题是我们必须计算每个用户与当前用户之间的关系,为了解决四个关系状态,我们需要三个小的交点。
您要查询的集合与我的交叉粉末相交。
要查询的集合与我的关注相交叉。
要查询的藏品与我的影迷相交。
不集中在这三个小交换机中的用户是不相关的用户。
如果我们使用以下的一组名字:
集中于收藏
按照用户设置的球迷:球迷们:
交叉粉末收集(临时)
集(临时)发现:用户要查询的意思是:用户名
您要查询的集合与我的注意相交叉(临时)。
find_inter_follow:用户名的设置与我的球迷的查询(临时)find_inter_fans:用户名
查询的集合与我的交叉粉末(临时)相交。
find_inter_fofa:用户名
查找中的其他人不关心。
使用排序集存储关系
分数是用来存储所关注的时间,并且每个用户存储两组。如下:用户标识符存储用户,关注和粉丝:userid存储用户的粉丝,所以我们可以设计一个函数来找到这些状态集。
函数返回:
findset / / findset美元,设置查询
fofaset= $ / /收集fofaset,互粉
findinterfollowset / / findinterfollowset美元,集查询和把我的注意
findinterfansset= > $ findinterfansset / /查询和设置我的粉丝
以上四组可以用来判断关系的状态。首先,判断是否相互交流。如果不是相互的话,那么决定这是否是我关心的问题。如果没有,我会决定是否是我的粉丝,如果不是什么都没有的话,那么你可以把状态弄出来。
*
*用户名:当前用户ID
* targetuserid:是由人的身份观看
* findtype:看这名单
*列表的位置在findstart开始:分页
*列表的位置在findend结束:分页
* /
功能getchunksets($ redis,$targetuserid美元,findtype美元美元美元,findstart,findend){
fanskey美元=粉丝。美元;
followkey美元=:。美元;
findKey美元= 发现:。美元;
targetkey = findtype美元美元。。targetuserid美元;
fofakey美元=find_inter_fofa:。美元;
findinterfollowkey美元=find_inter_follow:。美元;
findinterfanskey美元=find_inter_fans:。美元;
查找/设置要查询的元素
findset美元=美元redis -> zrevrange(targetkey美元,findstart美元,findend美元,真的);
使用我的关注点来设置查询
findinterfollowset美元=阵();
查询集和我的粉丝付费
findinterfansset美元=阵();
第一个明确的临时集合
$ redis -> del($ findKey);
$ redis -> del($ fofakey);
$ redis -> del($ findinterfollowkey);
$ redis -> del($ findinterfanskey);
保存
foreach(findset美元美元美元UID =得分){
Redis -> Zadd美元(美元美元美元findKey,评分,UID);
}
用于相互收集粉末
如果($ userid!= $ targetuserid){ / /其他
$ redis ->该($ fofakey,阵列($ findKey,fanskey美元,美元followkey));
*
*如果你不看你的名单,这也是必需的。
* 1:要查询的集合,请注意
* 2:设置与我的球迷查询
* /
$ redis ->该($ findinterfollowkey,阵列($ findKey,followkey美元));
$ redis ->该($ findinterfanskey,阵列($ findKey,fanskey美元));
findinterfollowset美元=美元redis -> zrevrange(findinterfollowkey美元,0 - 1);
findinterfansset美元=美元redis -> zrevrange(findinterfanskey美元,0 - 1);
{人}
如果($ findtype = =粉丝){ / /看到他们的粉丝名单
$ redis ->该($ fofakey,阵列($ findKey,followkey美元));
否则如果}($ findtype = =跟随){ / /看到他们的关注列表
$ redis ->该($ fofakey,阵列($ findKey,fanskey美元));
}
}
相互粉末收集
fofaset美元=美元redis -> zrevrange(fofakey美元,0 - 1);
返回的数组(
findset / / findset美元,设置查询
fofaset= $ / /收集fofaset,互粉
findinterfollowset / / findinterfollowset美元,集查询和把我的注意
findinterfansset= > $ findinterfansset / /查询和设置我的粉丝
);
}
上面的函数已经找到了需要的集合,然后判断关系状态。
*
*是:是否查看自己的清单
* findtype:看着粉丝或关注列表1:注意2:球迷
* userinfoarr:用户详细信息的数组
* /
功能getuserinfolist($是,findtype美元,userinfoarr美元,findset美元,fofaset美元美元美元,interfansset,interfollowset){
userinfolist美元=阵();
foreach(findset美元美元美元UserID = favotime){
如果(!in_array($array_keys($ userinfoarr)))继续;
新的用户信息(用户信息=美元美元美元userinfoarr {用户名});
美元美元的=用户信息->格式();
如果(in_array($$ fofaset)){
{ } = 'favoflag UserInfo美元的3; / /对方焦点
{人}
如果($是){
{ } = 'favoflag UserInfo美元的findtype美元;
{人}
如果(in_array($$ interfansset)){
{ } = 'favoflag UserInfo美元的2; / /我的粉丝
} else if(in_array($$ interfollowset)){
{ } = 'favoflag UserInfo美元的1; / /我的注意
别的{ }
{ } = 'favoflag UserInfo美元的0; / /没有关系
}
}
}
{ } = 'favotime UserInfo美元的favotime美元;
array_push(userinfolist美元美元,用户信息);
}
返回的userinfolist;
}
如何使用redis实现微博客的关注是介绍到这里,我们欢迎你去谈论它。