Redis 调研
Redis 调研
优势
相对于其他k-v数据库的优势:
- 包含复杂数据类型,例如 Strings、Lists、Hashes、Sets、Sorted sets 等。这些复杂数据类型的操作提供了原子操作,不用考虑锁。
- 内存中运行;可以持久化。
- 相关网站:
- http://redis.io/
- http://www.slideshare.net/hitkidnil/memcached-vs-redis
- http://www.itlearner.com/article/4890
- http://timyang.net/data/redis-misunderstanding/
- http://stackoverflow.com/questions/2873249/is-memcached-a-dinosaur-in-comparison-to-redis
缺点
官方不支持 Windows 版,有非官方的。这个不是太大问题。
性能
- 内存数据库,性能非常高。
- 与 Memcache 的性能比较,Redis 作者给的回答,小数据的存储 Redis 占优,大于 100k 的 Memcache 占优,但总的来说,一般项目使用时都还不够格考虑这里的瓶颈。
使用者及口碑
暴雪、Stack Overflow、GitHub、Flickr 等等在使用 Redis。业内口碑非常好:
结合我们项目使用
由于历史原因,数据库我们先后使用了兄弟公司的 k-v 数据库,和之后的 MySQL。
换数据库,是由于之前的 k-v 数据库只支持 key-value 对的存储,value 里以 JSON 串来存储。这样的存储方式不支持单个字段的更新以及高效的频繁排序等功能算法需求。而游戏编程很需要这些,所以花大气力弥补以前决策的失误,DB 换成了 MySQL。
项目架构也在调整,PHP 通过 HandlerSocket与 MySQL 进行交互,之前的 Java 只做简单的同步,没有 DB 操作。现在为了性能考虑,在慢慢改成玩家频繁交互的功能和部分别的新功能写在 Java。这样 Java 就必须与 DB 交互。
之前为了快速迭代,Java 与 MySQL 的交互,是 Java 通过 HTTP 来 post 存储请求到 PHP,PHP 接到 request 就立即存储。PHP 这边有老 PHP 写的逻辑更新了 DB 字段时,再 post 一个 request 到 Java(Java做了个 HTTP Server),Java 更新自己的内存。
这样就有两个问题:
- 所有与 DB 的操作,cache 的地方在 HandlerSocket。(据说有并发写入性能问题——待进一步考证)
- PHP 与 Java 都要更新 DB 数据时,两个独立的 HTTP 通道,很诡异,很低效。
现在有了 Redis,pub/sub 很方便做 cache 系统:
- 一方面 PHP 与 Java 相互通知数据更新时,通过 Redis 即可。目前我们先应用急需的这块。当前项目 PHP 里使用 Memcache 做交互临时存储以及部分用于加锁的逻辑可以考虑用 Redis 慢慢取代。
- 另一方面,以后可以很方便的用 Redis 做我们应用程序与 MySQL 的 cache。