对于新浪微博或者 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, 在许多知名的互联网企业都有广泛的应用.
这个错了吧,我就只能关注一个人?!我的意思是,你这个每zset一次就要覆盖上一个值啊 Reply