Redis实现Timeline
上回写了[使用Redis实现关注关系][1],这次说说使用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去实现。本文只是一个大体的思路,应对小数据量基本足够。
Redis实现Timeline的更多相关文章
- 实现Timeline
Redis实现Timeline 上回写了使用Redis实现关注关系,这次说说使用Redis实现Timeline. Timeline的实现一般有推模式.拉模式.推拉结合这几种.推模式:某人发布内容之后推 ...
- redis 缓存技术与memcache的区别
1 什么是redis redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset( ...
- redis数据类型及使用场景
Redis数据类型 String: Strings 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字. 常用命令: set,get,decr,incr,mge ...
- Redis应用场景一
Redis开创了一种新的数据存储思路,使用Redis,我们不用在面对功能单调的数据库时,把精力放在如何把大象放进冰箱这样的问题上,而是利用Redis灵活多变的数据结构和数据操作,为不同的大象构建不同的 ...
- 初识Redis(1)
Redis 是一款依据BSD开源协议发行的高性能Key-Value存储系统(cache and store). 它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希( ...
- redis 五种数据类型的使用场景
String 1.String 常用命令: 除了get.set.incr.decr mget等操作外,Redis还提供了下面一些操作: 获取字符串长度 往字符串append内容 设置和获取字符串的某一 ...
- 谈谈Memcached与Redis
1. Memcached简介 Memcached是以LiveJurnal旗下Danga Interactive公司的Bard Fitzpatric为首开发的高性能分布式内存缓存服务器.其本质上就是一个 ...
- redis 数据类型详解 以及 redis适用场景场合
1. MySql+Memcached架构的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的 ...
- Redis内存使用优化与存储
抄自http://www.infoq.com/cn/articles/tq-redis-memory-usage-optimization-storage 本文将对Redis的常见数据类型的使用场景以 ...
随机推荐
- [Postgres] Update and Delete records in Postgres
Delete example: DELETE FROM movies ; Update example: UPDATE movies ;
- iOS app审核参考信息地址
发件人:(苹果开发支持邮箱地址) 中国区电话:400-670-1855 chinadev<chinadev@asia.apple.com> 您好: 感谢您与 Apple 开发者计划支持 ...
- IT咨询服务-客户案例(四):根据图片等素材,动态生成个性化图片
最近,慕名而来一个客户. 客户的目标 网站来一个用户,选择模版,上传图片等素材,生成自定义的图片,或者静态网站,然后分享到社交网站.有点类似于,网上制作名片,选择模版,输入个人信息,生成名片的设 ...
- 【BZOJ 1008】[HNOI2008]越狱
[题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1008 [题意] [题解] 相邻就会犯罪的话; 可以考虑它的反面; 即让所有相同信仰的人 ...
- Android网络应用之Socket(一)
socket编程是网络通信的一个基础应用.不管是手机端还是PC端都须要socket技术来建立网络通信. 在本章小编主要从下面几个方面来介绍socket的相关知识: 各自是"什么是socket ...
- AnimatorSet和PropertyValuesHolders.ofKeyframe
如果要多个动画配合工作,需要把他们放入AnimatorSet中 ObjectAnimator animator1 = ObjectAnimator.ofFloat(...); animator1.se ...
- C#中的反射总结
= 导航 顶部 什么是反射 为什么要使用反射 C#反射相关的命名空间 通过反射创建类型的实例 通过反射调用类的方法 查看类中成员 查看类的构造函数 查看类中属性 查看类中字段 反射实现的接口 ...
- Cocos2d-X中国象棋的发展《五岁以下儿童》摆棋
在博客上,以实现创建的游戏场景.而一些button,因为button落实到事件作出详细答复,需要使用一些功能摆棋.为此我特意button上的背面的具体实施, 在摆棋前先理清一下摆棋的思路: 1.创建一 ...
- Coremicro Reconfigurable Embedded Smart Sensor Node
A Coremicro Reconfigurable Embedded Smart Sensor Node has the capability of hosting intelligent algo ...
- QT定时器的两种应用(QObject就有timerEvent事件,一种什么样的居心呢?)
QT中定时器的使用方法(1)重载timerEvent(QTimerEvent *)函数,然后再在类的构造函数中设置时间间隔 startTimer(50);//单位为毫秒(2)在类的构造函数中设定如 ...