实现Timeline
Redis实现Timeline
上回写了使用Redis实现关注关系,这次说说使用Redis实现Timeline。
Timeline的实现一般有推模式、拉模式、推拉结合这几种。
推模式:某人发布内容之后推送给所有粉丝,空间换时间,瓶颈在写入;
拉模式:粉丝从自己的关注列表中读取内容,时间换空间,瓶颈在读取;
推拉结合:某人发布内容后推送给活跃粉丝,不活跃粉丝则使用拉取。
目前只讨论推模式,考虑单个feed内容实体存入散列(hashes)、每个用户的timeline列表存入列表(lists)。
1、发布
发布者发布内容后,生成唯一feedID,以feedID为key存入hashes。
首先从发布者的粉丝表里获取所有粉丝,再进行推送。
逻辑如下:
// 使用Redis INCR操作,生成唯一postID
$feedID = $redis->INCR("global:postID");
// 存入Hashes
$feedData = [
'userID' => 1,
'timestamp' => '1458680000',
'content' => '这是一条tweet',
'platform' => 'web',
];
$redis->HSET($feedID, $feedData);
// 写入发布者自己的已发布列表
$redis->LPUSH("{$userID}:tweets", $feedID);
// 写入发布者自己的timeline
$redis->LPUSH("{$userID}:timeline", $feedID);
// 获取发布者粉丝列表
$follwerIDs = $redis->SMEMBERS("1:followers");
// 写入
foreach ($follwerIDs as $followerID) {
$redis->LPUSH("{$followerID}:timeline", $feedID);
}
2、读取
某用户登陆之后,获取timeline Lists中的值,再从Hashes取数据进行处理。
$feedIDs = $redis->LRANGE("{$userID}:timeline", 0, 30); //取30条数据
foreach ($feedIDs as $feedID) {
$feedData = $redis->HGETALL($feedID);
// TODO:进一步进行处理、整合等操作。
}
3、删除
当发布者删除某条消息后,循环所有粉丝列表,并执行删除操作。
// 从发布者自己的已发布删除掉
$redis->LREM("{$userID}:tweets", 1, $feedID);
// 从发布者自己的timeline删除掉
$redis->LREM("{$userID}:timeline", 1, $feedID);
// 获取发布者粉丝列表
$follwerIDs = $redis->SMEMBERS("1:followers");
// 删除
foreach ($follwerIDs as $followerID) {
$redis->LREM("{$followerID}:timeline", 1, $feedID);
}
timeline从某种角度来说是临时性的,如果年代久远,可不必操作粉丝的timeline。
后记
Timeline系统说起来会很复杂,也不可能只靠Redis去实现。本文只是一个大体的思路,应对小数据量基本足够。
博客:http://blog.lovemydeer.com/2016/03/19/redis-timeline.html
实现Timeline的更多相关文章
- Chrome Developer Tools:Timeline Panel说明
一.Timeline panel 概况 Timeline工具栏可以详细检测出Web应用在加载过程中,时间花费情况的概览.这些应用包括下载资源,处理DOM事件, 页面布局渲染或者向屏幕绘制元素. 如下图 ...
- Chrome 开发工具之Timeline
之前有说到Element,Console,Sources大多运用于debug,Network可用于debug和查看性能,今天的主角Timeline更多的是用在性能优化方面,它的作用就是记录与分析应用程 ...
- iOS之TimeLine(时间轴)的实现
这是一个关于OC时间轴的简单实现,我认为重要的是思路. 感谢作者:Cyandev 的文章<iOS 实现时间线列表效果>给的思路.这里先附上Objective-C的代码实现,有时间再去试试S ...
- 如何使用Goolge Timeline工具
网上中文的资料版本比较老,找到一个新版本的英文介绍,翻一下,原文:https://developers.google.com/web/tools/chrome-devtools/profile/eva ...
- 【三石jQuery视频教程】03.创建垂直时间表(Timeline)
视频地址:http://v.qq.com/page/g/i/o/g0150rvi6io.html 大家好,欢迎来到[三石jQuery视频教程],我是您的老朋友 - 三生石上. 今天,我们要通过基本的H ...
- WPF中的动画——(三)时间线(TimeLine)
WPF中的动画——(三)时间线(TimeLine) 时间线(TimeLine)表示时间段. 它提供的属性可以让控制该时间段的长度.开始时间.重复次数.该时间段内时间进度的快慢等等.在WPF中内置了如下 ...
- 如何使用Chrome Timeline 工具(译)
[原文地址]https://developers.google.com/web/tools/chrome-devtools/profile/evaluate-performance/timeline- ...
- 分享最新的博客到LinkedIn Timeline
使用Octopress作为我的博客框架有两年了.使用起来一直很顺手,这个工具真正的把博客跟写代码等同起来,非常酷炫.再加上各种各样的定制化,简直是随心所欲.我针对自己的需求对Octopress框架进行 ...
- chrome dev debug network 的timeline说明
在使用chrome的时候F12的开发者工具中有个network,其中对每个请求有个timeline的说明,当鼠标放上去会有下面的显示: 这里面的几个指标在说明在chrome使用文档有说明: 下面我用人 ...
- Chrome开发者工具详解(3)-Timeline面板
Chrome开发者工具详解(3)-Timeline面板 注: 这一篇主要讲解面板Timeline,参考了Google的相关文档,主要用于公司内部技术分享.. Timeline面板 Timeline面板 ...
随机推荐
- ubuntu14操作系统chrome标签和书签乱码解决
ubuntu操作系统更新后.发现chrome标签和书签中文都无法显示. 解决的方法: 打开配置文件 sudo vim /etc/fonts/conf.d/49-sansserif.conf <! ...
- .net三步配置错误页面,让你的站点远离不和谐的页面
假设你的站点出现一堆让人看不懂的报错,那么你就不是一个合格的程序猿.也不是一个合格的站长. 以下的方面能够帮助你的站点远离让人头大的页面. 第一步:配置web.config 打开web.config, ...
- matlab中plot使用方法
MATLAB有非常强的图形功能,能够方便地实现数据的视觉化.强大的计算功能与图形功能相结合为MATLAB在科学技术和教学方面的应用提供了更加广阔的天地.以下着重介绍二维图形的画法,对三维图形仅仅作简单 ...
- TFS2010安装与管理
整了几天TFS,把相关的一些配置与安装的要点简单记下,希望对大家有用.本篇主要是安装与配置上的内容,下一篇会介绍如何使用以及使用方面的相关心得体会. 本篇内容简要: 1. 安装部署 1.1. 流 ...
- 循环灯控制器,该控制器控制红、绿、黄三个发光管循环发亮(VHDL语言)
设计一个循环灯控制器,该控制器控制红.绿.黄三个发光管循环发亮.要求红发光管亮2秒,绿发光管亮3秒,黄发光管亮1秒.(假设外部提供频率为1MHz的方波信号) library ieee; use iee ...
- leetCode 34.Search for a Range (搜索范围) 解题思路和方法
Search for a Range Given a sorted array of integers, find the starting and ending position of a give ...
- C语言数据结构----递归的应用(斐波拉契数列、汉诺塔、strlen的递归算法)
本节主要说了递归的设计和算法实现,以及递归的基本例程斐波拉契数列.strlen的递归解法.汉诺塔和全排列递归算法. 一.递归的设计和实现 1.递归从实质上是一种数学的解决问题的思维,是一种分而治之的思 ...
- 五、Linux/UNIX操作命令积累【cp、mv、cat、grep、ps】
在使用Linux/UNIX下,常常会使用文本界面去设置系统或操作系统,作者本人在工作的过程也在不断接触这方面的命令,所以为此特酝酿.准备.開始了本文的编写.本文主要记录自己平时遇到的一些Linux/U ...
- 每天一个JavaScript实例-动态省份选择城市
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- SetCapture ReleaseCapture
函数功能:该函数在属于当前线程的指定窗体里设置鼠标捕获.一旦窗体捕获了鼠标,全部鼠标输入都针对该窗体,不管光标是否在窗体的边界内.同一时刻仅仅能有一个窗体捕获鼠标.假设鼠标光标在还有一个线程创建的窗体 ...