上回写了[使用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去实现。本文只是一个大体的思路,应对小数据量基本足够。

博客:http://blog.icp0.com/

Redis实现Timeline的更多相关文章

  1. 实现Timeline

    Redis实现Timeline 上回写了使用Redis实现关注关系,这次说说使用Redis实现Timeline. Timeline的实现一般有推模式.拉模式.推拉结合这几种.推模式:某人发布内容之后推 ...

  2. redis 缓存技术与memcache的区别

    1 什么是redis redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset( ...

  3. redis数据类型及使用场景

    Redis数据类型  String: Strings 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字. 常用命令:  set,get,decr,incr,mge ...

  4. Redis应用场景一

    Redis开创了一种新的数据存储思路,使用Redis,我们不用在面对功能单调的数据库时,把精力放在如何把大象放进冰箱这样的问题上,而是利用Redis灵活多变的数据结构和数据操作,为不同的大象构建不同的 ...

  5. 初识Redis(1)

    Redis 是一款依据BSD开源协议发行的高性能Key-Value存储系统(cache and store). 它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希( ...

  6. redis 五种数据类型的使用场景

    String 1.String 常用命令: 除了get.set.incr.decr mget等操作外,Redis还提供了下面一些操作: 获取字符串长度 往字符串append内容 设置和获取字符串的某一 ...

  7. 谈谈Memcached与Redis

    1. Memcached简介 Memcached是以LiveJurnal旗下Danga Interactive公司的Bard Fitzpatric为首开发的高性能分布式内存缓存服务器.其本质上就是一个 ...

  8. redis 数据类型详解 以及 redis适用场景场合

    1.  MySql+Memcached架构的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的 ...

  9. Redis内存使用优化与存储

    抄自http://www.infoq.com/cn/articles/tq-redis-memory-usage-optimization-storage 本文将对Redis的常见数据类型的使用场景以 ...

随机推荐

  1. 解决ThinkPad x1 发热的问题

    F1进入BIOS界面 将intel speedstep设置为禁用 将CPU Power Manager设置为禁用 重启电脑 电脑不再发热

  2. 使用搜狐Sendcloud的Webapi发送邮件:Jodd和Apache Httpclient

    最近,在使用搜狐Sendcloud发邮件.    Sendcloud提供http格式的webapi,方便地发送邮件,当然是要付费的. 很早之前,http工具一直用Httpclient,后来觉得jodd ...

  3. js获取计算后的样式表

    在编写html时,使用dom对象的style属性可以获取标签里的style属性,但是不能获取单独css样式文件或者style标签的属性值 <div style="width:10px& ...

  4. 通过rinetd实现port转发来訪问内网的服务

    一.   问题描写叙述 通过外网来訪问内网的服务 二.   环境要求 须要有一台能够外网訪问的机器做port映射.通过数据包转发来实现外部訪问阿里云的内网服务 三.   操作方法 做port映射的方案 ...

  5. Notes on OpenSSL and Qt(ssl.pri,qsslocket_openssl_symbols.cpp)

    Libraries name of openssl? The "library" portion of OpenSSL consists of two libraries. On ...

  6. 大型项目linux自动化版本发布脚本(shell)之tomcat、nginx服务脚本

    开发十年,就只剩下这套Java开发体系了 >>>   最近,又临近博主所负责的一个大型项目的发版了.之前有提到过,该项目涉及到30-40台服务器的发版.且项目客户规定发版需在晚上10 ...

  7. Vuex的一个易错点

    好长时间不用Vuex,发现有些东西记模糊了. 在对Vuex进行模块化开发的时候, const store = new Vuex.Store({ modules: { a: moduleA, b: mo ...

  8. Swift下CoreData的使用

    我之前的随笔中有写过一些iOS持久化存储的方法,包含了sqlite.解归档.沙盒存放等等.这些方式中,能够大规模存储,并保持性能的只有使用sqlite了.而这里将记录下Cocoa自身继承的数据库的存储 ...

  9. ckplayer 插件在线视频播放

    1. CKplayer 它是一款用于网页上播放视频的插件,支持的格式有:http 协议上的 flv, f4v, mp4格式,同时支持 rtmp 视频流格式播放.使用非常简单. <html> ...

  10. qemu使用copy-on-write(COW)磁盘

    写时复制(copy-on-write,缩写COW)技术不会对原始的镜像文件做更改,变化的部分写在另外的镜像文件中,这种特性在qemu中只有QCOW格式支持,多个 COW 文件可以指向同一映像同时测试多 ...