上回写了[使用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. 小强的HTML5移动开发之路(42)——HTML4与HTML5文档结构比较

    一般来说,人们在书写包括HTML在内的文档时,习惯上按照类似于"章--节--小节"这样的层次结构来进行. 在HTML4中的描述方式: <html> <head&g ...

  2. 数据库使用char要留心

    表根据要求需要变更,加一个标识字段,一个字母搞定,我加了一个长度为2的字段 char(2)..... 结果,他们前台开发数据一直不出来,看前台与后台都有记录了,最后发现,此字段我默认加上一个字符,其实 ...

  3. c++11之初始化列表

    一.前言     C++的学习中.我想每一个人都被变量定义和申明折磨过,比方我在大学笔试过的几家公司.都考察了const和变量,类型的不同排列组合,让你差别有啥不同.反正在学习C++过程中已经被折磨惯 ...

  4. DesignPattern_Java:SingletonPattern

    单例模式 SingletonPattern Ensure a class has only one instance,and provide a global point of access to i ...

  5. TensorFlow 学习(十三)—— tf.app.flags

    flags = tf.app.flags FLAGS = flags.FLAGS flags.DEFINE_integer('num_hidden_layers', 3, 'number of hid ...

  6. c#面向对象 基础知识(转)

    OOP技术按照现实世界的特点来管理复杂的事物,把它们抽象为对象,具有自己的状态和行为,通过对消息的反应来完成一定的任务.这种编程方法提供了非常强大的多样性,大大增加了代码的重用机会,增加了程序开发的速 ...

  7. 检索 04 --Stack栈 Queue队列 Hashtable哈希表

    //Stack 先进后出 没有索引 Stack st = new Stack(); st.Push(12); st.Push(11); st.Push(22); st.Push(34); st.Pus ...

  8. CentOS 配置远程主机ssh免密登录

    ssh针对的是用户不是机器,同一机器不同用户需要单独配置ssh,才能实现该用户的免密登录 cd ~ cd ./.ssh 在./ssh目录下生成公钥与私钥(如果没有.ssh先使用ssh命令连接到一台远程 ...

  9. Groovy&Gradle总结

    欢迎大家加入QQ群一起讨论: 489873144(android格调小窝) 我的github地址:https://github.com/jeasonlzy 0x01 Groovy 概述 Groovy ...

  10. 科学的解决Http Token拦截器TokenInterceptor实现

    1.写在前面 在做项目的时候,有时对接口要求比较严谨.先介绍下情况. 我这边Http 方式采用的是 OKhttp+Retrofit 后台一共分为三种token,分别是实名token(accessTok ...