1、需求分析:
每个用户都有两个表:用户的关注、用户的粉丝
关注关系有四种:关注、粉丝、互粉、无关系
关注功能可划分为:
1)查看自己的关注/粉丝列表:
关注列表与自己只存在两种关系:关注、互粉
粉丝列表与自己只存在两种关系:粉丝、互粉
2)查看别人的关注/粉丝列表:
关注列表与自己存在四种关系:关注、粉丝、互粉、无关系
2、实现:
结构类型采用:zset,score:存储关注时间
key命名规则:
关注:follow:$userID
粉丝:fans:$userID
要查询的集合(临时):$findSet
要查询的集合与我的关注交集(临时):inter_follow:$userID
要查询的集的与我的粉丝交集(临时):inter_fans:$userID
互粉集合(临时):fofa:$userID
输入:
$userID:当前用户ID
$targetUserID:被查看用户的ID
$findType: 查看的是哪个列表,follow:关注表,fans:粉丝表
$findStart: 分页查看的列表开始位置
$findEnd: 分页查看的列表结束位置
算法:
要查询的集合(临时):$findSet = zRevRange $findType:$targetUserID $findStart $findEnd
1、获取关注、粉丝、互粉集合
if ($userID != $targetUserID)
{
//1、看别人
//1.1、互粉
$fofaSet = zInterStore fofa:$userID 3 $findSet follow:$userID fans:$userID
/*若查看的不是自己的列表,则还需
* 1: 要查询的集合与我的关注交集
* 2: 要查询的集的与我的粉丝交集
*/
$interFollow = zInterStore inter_follow:$userID 2 $findSet follow:$userID
$interFans = zInterStore inter_fans:$userID 2 $findSet fans:$userID
}
else
{
//2、查看自己的列表 只需查看互粉
if ($findType == "fans")
{
//2.1、自己看粉丝列表
$fofaSet = zInterStore fofa:$userID 2 $findSet follow:$userID
}
else if ($findType == "follow")
{
//2.2、看自己关注列表
$fofaSet = zInterStore fofa:$userID 2 $findSet fans:$userID
}
}
//2、关系判断
$sum = zcard $findSet
for($index = 0; $index < $sum; $index++)
{
$tempUserID = zRange $findSet $index $index+1
if($tempUserID in $fofaSet)
{
//互粉
}
else if($userID == $targetUserID)
{
//关系由$findType决定
}
else
{
if($tempUserID in $interFans)
{
//我的粉丝
}
else if($tempUserID in $interFollow)
{
//我的关注
}
}
}