如果下次要开始一个像 V2EX 这样的网站项目,我会尽量从技术选择中把 MySQL 去掉。
作为一种存储数据的方式,MySQL 很成熟,其本身和大部分第三方库都已经存在了十年以上。尤其是在配合一些 ORM 使用时,MySQL 很简单。
但问题在于当数个表的数据量突破 100 万行,页面上同时需要读取的动态数据增多时,要将单个页面的生成性能优化到 100ms 以下就会变得越来越复杂。如果你有很多台双 8 核 CPU / 64G 内存的服务器,你或许会更晚遇到这些性能问题,但是随着网站规模变大,为了优化和 MySQL 有关的操作而付出的代价只会越来越大。
那如果有一天网站上有很多张表都有上亿行数据时,整个架构恐怕就需要重新思考。
Instagram 的技术团队在 Scaling Instagram 这个幻灯片中分享了很多有用的技巧,其中一条就是大量使用 Redis 来解决问题。Redis 并不只是一个简单的 Key Value 数据库,它的各种功能其实足够用于构建一个像 V2EX 这样具有大量动态数据交互的网站:
- 非常适合存储时间轴的 Sorted Set / List 类型
- 非常容易进行数据复制和读写分离
- 如果要上新的数据类型,不需要经历 ALTER TABLE 时纠结的锁表
- 网站部署新功能时,不需要考虑如何 migrate 数据库的表结构
- 和 Memcached 几乎一样好的性能,但是支持更多的数据类型,同时也没有 Memcached 的 1MB 单块数据容量限制
同时最关键的:性能。Redis 可以在单台服务器上实现每秒数万次的读取和写入,并且因为其非常容易实现复制和读写分离,所以如果要加入更多硬件,也会比较简单.