2013-10-06

用SSDB快速开发一个微博(Twitter)demo

Views: 28213 | 3 Comments

对于新浪微博或者 Twitter 这样的应用, 其最核心的数据结构就是排序列表. 例如, 我关注的人, 关注我的人, 我发的微博, 我收到的微博, 等等. 这些业务功能点都是排序列表数据结构, 根据时间排序.

这样的数据结构如果用关系数据库(如 MySQL)来存储的话, 需要设计一个表, 表和一个外键字段, 作为列表的名字, 还要有一个 int 型时间字段用于排序, 还有第 3 个字段就是列表的元素(如 uid, 微博 ID). 不过, 因为 MySQL 一旦表的数据量达到 100 万行数据时, MySQL 就基本无法满足实时查询的要求了.

其实, 可以用 SSDB 数据库来代替 MySQL, 因为, SSDB 非常适合存储列表数据. SSDB 可以存储数量庞大的(如超过 1 亿个)的列表, 也可以存储元素个数大于 1 亿个的大型列表, 而且, 这些列表是可以在更新和插入新元素的时候, 自动地维持顺序的, 所以查询的时候非常快速, 在少于 1ms 的时间内就能返回结果.

这种列表数据结构, 就是 SSDB 里的 zset 了. 例如, 新关注了一个人时, 只需要调用一次:

$ssdb->zset('my_following_' . $me, $uid, time());

我关注的人的列表名字叫做 "my_following", 我刚关注了一个 $uid 的人. 如果是取消关注, 就是:

$ssdb->zdel('my_following_' . $me, $uid);

非常简单! 对于发微博, 其实也是类似. 首先, 将微博的详细内容存储起来:

$ssdb->set($weibo_id, json_encode($weibo));

然后, 将 $weibo_id 发给我的每一个粉丝. 注意, 将 $weibo_id 发给每一个粉丝, 而不是将微博的详细内存发给每一个粉丝, 这样可以极大的节省存储空间, 加快发送速度. 发送的方法:

foreach($fans as $fan){
    $ssdb->zset('fan_' . $fan, $weibo_id, time());
}

真的是非常简单!

SSDB 是一个开源的高性能 NoSQL 数据库, 项目地址: https://github.com/ideawu/ssdb, 在许多知名的互联网企业都有广泛的应用.

Related posts:

  1. SSDB在大数据量日志分析中的应用案例
  2. 在有序的KV引擎之上建造结构化数据库引擎
  3. 如何使用SSDB的zscan命令
  4. SSDB 1.6.6 稳定版发布, 支持 hclear/zclear
  5. SSDB 增加 zrank, zrange 命令
Posted by ideawu at 2013-10-06 15:02:48 Tags: ,

3 Responses to "用SSDB快速开发一个微博(Twitter)demo"

Leave a Comment