用Redis实现微博关注关系_Redis

关注关系产生的四种关系状态

  • 关注
  • 粉丝
  • 双向关注(互粉)
  • 无关系

需求分析

在微博中,每一个用户都会有一个关注列表,一个粉丝列表。用户可以查看自己的关注,粉丝列表,也可以查看别人的关注,粉丝列表。并且,要展示列表里每个人与当前查看者的关注状态。状态的可能性就是上面讲到得四种关系状态。

问题可以分两种情况来看:

1、看自己的关注,粉丝列表
2、看别人的关注,粉丝列表
看自己的关注,粉丝列表:

这种情况相对简单一点。比如看自己的关注列表,列表里的人的与自己的关系状态不可能是“无关系”和“粉丝”。只可能是“关注”和“双向关注”。同样,粉丝列表也只有两种状态。

看别人的关注,粉丝列表:

这是最复杂的情况,假如看别人关注列表,列表里的人和自己可能有上述全部四种关系状态。

从集合的图来分析

如上图所示。左边的圆表示用户的关注列表,右边的圆表示粉丝列表,下边的圆表示的是要查看的列表(集合)。分别用follow, fans, find来表明这三个集合。

当查看自己的列表时,其实表示find集合是上面集合中某一个的子集。例如查看自己粉丝,表示find是fans的子集,查看自己的关注,表示find是follow的子集。

查看别人的列表时,此时图中产生了三个集合的交集。要查询集合中的用户可能是在你的粉丝,关注集合中,也可能不在。就是说可能是任何一种关系状态,问题的根本就是,我们要计算出每一个用户与当前用户的关系状态。要求解四种关系状态,我们必然要求出图中下部分的三个小交集。

  • 要查询的集合与我的互粉交集
  • 要查询的集合与我的关注交集
  • 要查询的集的与我的粉丝交集

不在这三个小交集中的用户就是无关系状态的用户。

假如我们采用如下一套命名:

关注集合
follow:userID 粉丝集合 fans:userID

互粉集合(临时)
fofa:userID 要查询的集合(临时) find:userID

要查询的集合与我的关注交集(临时)
find_inter_follow:userID 要查询的集的与我的粉丝交集(临时) find_inter_fans:userID

要查询的集合与我的互粉交集(临时)
find_inter_fofa:userID

find中其他就是未关注

使用Sorted Set存储关系

score用来存储关注的时间,每个用户存储两个集合。follow:userID存储用户的关注,fans:userID存储用户的粉丝。于是我们可以设计一个函数来求出这些状态的集合。

函数返回:

"findSet" => $findSet, //要查询的集合
"fofaSet" => $fofaSet, //互粉的集合
"findInterFollowSet" => $findInterFollowSet, //要查询的集合与我的关注交
"findInterFansSet" => $findInterFansSet //要查询的集的与我的粉丝交

求出以上四个集合,就可以进行关系状态判断,先判断是否互粉,如果不是互粉,再判断是否是我关注的,如果不是,再判断是否是我的粉丝。如果都不是就是无关系。这样就能把状态求出来了。

/*
* userID:当前用户id
* targetUserID: 被查看的人的id
* findType: 查看的是哪个列表
* findStart: 分页查看的列表开始的位置
* findEnd: 分页查看的列表结束的位置
*/
function getChunkSets($redis, $userID, $targetUserID, $findType, $findStart, $findEnd) { 

 $fansKey = "fans:" . $userID;
 $followKey = "follow:" . $userID;
 $findKey = "find:" . $userID; 

 $targetKey = $findType. ":" . $targetUserID;
 $fofaKey = "find_inter_fofa:" . $userID; 

 $findInterFollowKey = "find_inter_follow:" . $userID;
 $findInterFansKey = "find_inter_fans:" . $userID; 

 //找出要查询的集合元素
 $findSet = $redis->zRevRange($targetKey, $findStart, $findEnd, TRUE); 

 //要查询的集合与我的关注交
 $findInterFollowSet = array(); 

 //要查询的集的与我的粉丝交
 $findInterFansSet = array(); 

 //先清掉临时集合
 $redis->del($findKey); 

 $redis->del($fofaKey);
 $redis->del($findInterFollowKey);
 $redis->del($findInterFansKey); 

 //存起来
 foreach ($findSet as $uid => $score) {
  $redis->zAdd($findKey, $score, $uid);
 } 

 //求互粉集合
 if ($userID != $targetUserID) { //看别人
  $redis->zInter($fofaKey, array($findKey, $fansKey, $followKey)); 

  /*
  * 如果不是看自己的列表,还要求
  * 1: 要查询的集合与我的关注交
  * 2: 要查询的集的与我的粉丝交
  */
  $redis->zInter($findInterFollowKey, array($findKey, $followKey));
  $redis->zInter($findInterFansKey, array($findKey, $fansKey)); 

  $findInterFollowSet = $redis->zRevRange($findInterFollowKey, 0, -1);
  $findInterFansSet = $redis->zRevRange($findInterFansKey, 0, -1); 

 } else {
  if ($findType == "fans") { //自己看粉丝列表
  $redis->zInter($fofaKey, array($findKey, $followKey));
  } else if ($findType == "follow") { //看自己关注列表
  $redis->zInter($fofaKey, array($findKey, $fansKey));
  }
 } 

 //互粉集合
 $fofaSet = $redis->zRevRange($fofaKey, 0, -1); 

 return array(
  "findSet" => $findSet, //要查询的集合
  "fofaSet" => $fofaSet, //互粉的集合
  "findInterFollowSet" => $findInterFollowSet, //要查询的集合与我的关注交
  "findInterFansSet" => $findInterFansSet //要查询的集的与我的粉丝交
 );
 }

以上函数已经求出了所需要的集合,然后就是关系状态判断了。

/*
* isSelf: 是否查看自己的列表
* findType: 查看的是粉丝还是关注列表 1: 关注, 2: 粉丝
* userInfoArr: 用户详细信息数组
*/
function getUserInfoList($isSelf, $findType, $userInfoArr, $findSet, $fofaSet, $interFansSet, $interFollowSet) { 

 $userInfoList = array(); 

 foreach($findSet as $userID => $favoTime) {
  if(!in_array($userID, array_keys($userInfoArr))) continue; 

  $userInfo = new UserInfo($userInfoArr[$userID]);
  $userInfo = $userInfo->format(); 

  if(in_array($userID, $fofaSet)){
  $userInfo['favoFlag'] = 3; //互相关注
  } else {
  if($isSelf) {
   $userInfo['favoFlag'] = $findType;
  } else {
   if(in_array($userID, $interFansSet)) {
   $userInfo['favoFlag'] = 2; //我的粉丝
   } else if(in_array($userID, $interFollowSet)) {
   $userInfo['favoFlag'] = 1; //我的关注
   } else{
   $userInfo['favoFlag'] = 0; //无关系
   }
  } 

  } 

  $userInfo['favoTime'] = $favoTime;
  array_push($userInfoList, $userInfo);
 } 

 return $userInfoList;
 }

如何用Redis实现微博关注关系就介绍到这,欢迎大家交流探讨。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索新浪微博redis
redis微博数据结构
微博关注功能java实现、微博关注功能实现、微博互相关注实现、微博 关注 关系存储、微博关注关系,以便于您获取更多的相关知识。

时间: 2024-08-08 08:30:09

用Redis实现微博关注关系_Redis的相关文章

【近战】基于微博用户关系与行为的用户建模分析

以下为[近战]第一篇,基于微博用户关系与行为的用户建模分析. 用户建模是广告.推荐.搜索算法最基础也是最核心的技术问题之一,本报告将介绍新浪微博大数据挖掘团队如何综合利用社交关系和用户行为来建立用户模型.以下分享下精彩内容.   微博及大数据   微博作为中国最大的社交媒体平台,微博沉淀了海量的用户,内容,关系,和行为数据.   其中用户:注册人数10亿,月活人数1.98亿,日活人数:8900万.关系:关注关系近千亿,分组关系50亿+.内容:日增博文1亿+,日增原创4000万.行为:转发6000

HipHop算法:利用微博互动关系挖掘社交圈

在微博环境下,如何自动挖掘某个微博用户的社交圈子或者兴趣圈子是个很基础且重要的问题.如果能够对于某个用户在微博上体现的社交关系进行准确的挖掘,对于很多具体应用来说都有很好的作用,比如可以更好的对用户的兴趣进行挖掘或者能够推荐用户还未关注的社交圈子成员等,或者根据其社交圈子更准确的对用户进行个性化建模,为其它基于用户个性化模型的推荐或者广告推送等提供基础服务. 我们在微博相关研发任务中提出了HipHop算法,旨在通过利用微博用户的互动行为,来自动挖掘出用户的不同社交圈子.在设计算法之初,我们希望圈

增加旅游企业微博关注度的6个技巧

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 游谈博客旅游网络营销资讯:随着微博走入主流人群的视野,在中国的商务旅游市场里,也随处可以见到微博的身影.游谈博客曾经在2010年就关注微博对旅游营销的帮助,写过<微博--旅游网络营销的新利器> 以及<怎样用微博进行旅游网络营销>等探讨性文章.没想到时至今日,旅游企业微博遍地开花,各大旅行社.驻地旅游局和酒店.旅游景点,

Angelababy拜见未来公婆微博关注黄晓明亲戚

北京时间2月17日消息,据香港媒体报道,情人节已过,Angelababy秘密到黄晓明家乡青岛,拜见未来公公婆婆.既然定心丸已派,"海绵嫂"身份已确认,难怪Baby昨晚带情侣羽绒大衣回港时春风满面! 内地帅哥小生黄晓明向来抢手,但自与Baby相恋后,黄晓明似乎对她情有独钟,不断派定心丸给女友,逐步确认其正牌身份.继年三十晚直奔澳门玩烟花后,两口子又到深圳万象城看电学.还有好戏在后头,有人在微博透露发现二人在十二日经深圳机场,飞到黄晓明家乡青岛过情人节.[page] 借微博掩人耳目 为了掩

微博关注者数量在计算中的作用

郑昀 20101011     一个微博用户的关注者数量(在Twitter中称为Followers),有几种用途: 一.对于Google来说,由于一个用户关注另一个用户,相当于一个页面指向另一个页面,所以PageRank的算法大致可照搬.     "One user following another in social media is analogous to one page linking to another on the Web. Both are a form of recomme

redis的hGetAll函数的性能问题(记Redis那坑人的HGETALL)_Redis

在没关注这个函数之前,一直用的Memcache的数据存储方式,但是自从更换了redis之后,对于一个hash的数据存与取 对于Memcache方便甚多,但是问题来了,一个hash的列表如果量不大的情况,用hGetAll函数几乎看不出问题,一旦这个列表超过50或者更多时,此时用hGetAll函数便能很直观的看到性能问题,这里就不作数据分析了. Redis是单线程的!当它处理一个请求时其他的请求只能等着.通常请求都会很快处理完,但是当我们使用HGETALL的时候,必须遍历每个字段来获取数据,这期间消

简介Lua脚本与Redis数据库的结合使用_Redis

 可能你已经听说过Redis 中嵌入了脚本语言,但是你还没有亲自去尝试吧?  这个入门教程会让你学会在你的Redis 服务器上使用强大的lua语言.Hello, Lua! 我们的第一个Redis Lua 脚本仅仅返回一个字符串,而不会去与redis 以任何有意义的方式交互. 复制代码 代码如下: local msg = "Hello, world!" return msg 这是非常简单的,第一行代码定义了一个本地变量msg存储我们的信息, 第二行代码表示 从redis 服务端返回msg

“最美女教师”张丽莉的病情成微博关注热点

据新华社北京5月24日电 这是一股来自网络的暖流"最美女教师"张丽莉的病情牵动千百万网民持续关注.成为连日来微博上的最热点,爱心卡片和捐助源源不断地涌入医院:这是一次源于网络的爱心联动张丽莉和千千万万令人感动的"小人物",激起网民内心最真挚.淳朴的善良,自发地将爱传递. 从5月11日开始,一则"女教师车祸瞬间救学生,自己双腿遭碾压高位截肢"的消息,便一直在人民网(603000,股吧).新华网.新浪.腾讯.网易等各大网站和微博中热传.黑龙江佳木斯市

耐司试水官方微博 关注与用户的直接沟通

[赛迪网讯]10月30日消息,NISI(耐司)开通微博啦,大家可以关注@ NiSi耐司高品质滤镜,了解关于滤镜的一些小知识,在不知不觉中变成摄影高手哦,毕竟很多时候照片拍得好不好,其实就是有没有使用滤镜,怎么使用滤镜的问题.@ NiSi耐司高品质滤镜 会从最基本的光学知识开始,分享一些摄影小技巧,都是许多知名摄影师总结出来的"干货"哦. 当然,如果你要咨询NISI(耐司)滤镜的各种信息,怎么购买,售后如何等等,都可以通过@ NiSi耐司高品质滤镜 和官方人员直接交流,或者想要学习滤镜使