redis,是快客王在je chat中介绍过的一个keyvalue数据库,打着在'入门级服务器'上10w/s set ops高性能头衔来忽悠众多不明真相的程序猿。
事实上,号称的'入门级服务器'服务器是一台 Xeon X3320 2.5Ghz 的机器,在我的
AMD Athlon(tm) 64 X2 Dual Core Processor 4000+ 台式机上,benchmark结果是
100005 requests completed in 2.73 seconds
50 parallel clients
3 bytes payload
keep alive: 1
12.12% <= 0 milliseconds
93.68% <= 1 milliseconds
99.61% <= 2 milliseconds
99.93% <= 3 milliseconds
99.95% <= 4 milliseconds
99.96% <= 5 milliseconds
99.99% <= 6 milliseconds
100.00% <= 7 milliseconds
100.00% <= 202 milliseconds
36685.62 requests per second
在一台更为牛X的 Intel(R) Xeon(R) CPU E5410 @ 2.33GHz 8核机上
100004 requests completed in 1.16 seconds
50 parallel clients
3 bytes payload
keep alive: 1
59.77% <= 0 milliseconds
100.00% <= 1 milliseconds
100.00% <= 201 milliseconds
85987.96 requests per second
这玩意目前只能用一个核,所以CPU频率和缓存就成了速度的关键。
好吧,就DB来说,似乎这个成绩已经很惊人了,且不说memcachedb和tokyocabinet之流,就说原版的memcached,速度似乎也只能达到这个级别。可是经过进一步的发现,这玩意根本是使用内存存储,持久化的关键是这三条指令:SAVE BGSAVE LASTSAVE …
当接收到SAVE指令的时候,这玩意就会dump数据到一个文件里面。。。
当揭发了redis的真面目之后,值得一说的是它的独家功能:存储列表和集合,这是它与mc之流相比更有竞争力的地方。
不介绍mc里面已经有的东东,只列出特殊的:
TYPE key — 用来获取某key的类型
KEYS pattern — 匹配所有符合模式的key,太淫荡了,比如KEYS * 就列出所有的key了,当然,复杂度O(n)
RANDOMKEY - 返回随机的一个key
RENAME oldkey newkey — key也可以改名
列表操作,这里才是精华阿
RPUSH key string — 将某个值加入到一个key列表头部
LPUSH key string — 将某个值加入到一个key列表末尾
LLEN key — 列表长度
LRANGE key start end — 返回列表中某个范围的值,相当于mysql里面的分页查询那样
LTRIM key start end — 只保留列表中某个范围的值
LINDEX key index — 获取列表中特定索引号的值,要注意是O(n)复杂度
LSET key index value — 设置列表中某个位置的值
LPOP key
RPOP key — 和上面的LPOP一样,就是类似栈或队列的那种取头取尾指令,可以当成消息队列来使用了
集合操作,也一样精彩
SADD key member — 增加元素
SREM key member — 删除元素
SCARD key — 返回集合大小
SISMEMBER key member — 判断某个值是否在集合中
SINTER key1 key2 ... keyN — 获取多个集合的交集元素
SMEMBERS key — 列出集合的所有元素
还有Multiple DB的命令,可以更换db,也是比较有意思,数据可以隔离开,默认是存放在DB 0
好了,命令都列出来了,有什么用呢?官方做了一个更加山寨的twitter克隆版,retwis,代码使用PHP开发,主要看retwis.php就可以了。下面结合下je的山寨chat来说明这东东是怎样用redis的。
首先是全站闲聊:
http://app.javaeye.com/chat/all
有一个"global:timeline"列表,里面存放所有的口水,然后通过LRANGE取头50个,返回显示。
想看看肉饼最近说啥了,http://robbin.javaeye.com/blog/chat,构造一个key "uid:$userid:posts",比如 'uid:robbinfan:posts',同理LRANGE取列表。
有多少人订阅了肉饼饭呢? http://robbin.javaeye.com/blog/subscriptions
SCARD 一下 "uid:robbinfan:followers",同理肉饼饭的订阅数 "uid:robbinfan:following"。要获取全部的列表,那就 SMEMBERS "uid:robbinfan:followers" 好了,然后加载每个订阅者的信息:GET "uid:quakewang:username"。
随着水王的诞生,居然在一个集合里面保存了上万的口水(比如global:timeline)。如果只需要保存最新的记录,可以LTRIM一下,整个世界就清静了。
redis的出现,很大程度补偿了memcached这类keyvalue存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便。问题是这东东还很新,目前是beta-6版本,可能还不足够稳定。此外,缺乏mc中批量get也是比较大的问题,始终批量获取跟多次获取的网络开销是不一样的。
http://code.google.com/p/redis/
PHP client:
PHP Predis is a new, flexible and feature-complete PHP library client written by Daniele Alessandri (@jol1hahn). Predis is currently a work-in-progress and it targets PHP >= 5.3, though it is highly due to be backported to PHP >= 5.2.6 as soon as the public API and the internal design on the main branch will be considered stable enough, but you should give it a try as it already the best client library available for PHP.
PHP Rediska is a full-featured pure PHP Redis client implementation supporting an impressive number of features: multiple servers, consistent hashing (with support for user-specified algorithm), abstraction of Redis types as PHP types, Zend framework integration. Rediska is developed by Ivan Shumkov and Maxim Ivanov.
PHP client lib written in C, as a PHP module: PHPRedis! thanks to Alfonso Jimenez for the initial implementation and to Nicolas Favre-Félix and Nasreddine Bouafif for bringing the code to a real-world usability level fixing a lot of bugs and implementing many additional commands.
Redis - 介绍 http://cycles.blog.163.com/blog/static/696265402010683256489/
Redis的复制配置: http://cycles.blog.163.com/blog/static/69626540201061544212753/
Redis简单教程: http://cycles.blog.163.com/blog/static/696265402010683335319/
Redis安装配置: http://hi.baidu.com/hw19850907/blog/item/875efa3632d930355bb5f5a3.html
解决WEB集群session同步的方案,Redis内存缓存: http://www.sziwap.com/archives/75.html
Redis安装以及配置文件redis.conf参数解读: http://www.sziwap.com/archives/57.html
Redis压力测试: http://www.sziwap.com/archives/35.html
phpredis 手册: http://www.sziwap.com/archives/47.html
Redis主从配置 http://hi.baidu.com/hw19850907/blog/item/e3252a1b38f60574dbb4bd10.html
膜拜Redis: http://hi.baidu.com/thinkinginlamp/blog/item/3358c93d174e35ce9f3d62bf.html
盛大牛人 分享会-高性能nosql数据库redis http://www.paitoubing.cn/blog/redis-ppt
天涯开源key-list类型内存数据引擎——Memlink(类似于Redis) http://blog.youkuaiyun.com/heiyeshuwu/archive/2010/11/22/6027970.aspx
如果有無法預先限定字段的表結構需要存儲,mongodb是最適合的,它的工作方式基本上仍然是關係型的
redis我更喜歡它的一些特殊功能,例如直接存儲hash,隊列等,相當一部分feature都讓它不像一個db,而更像一個多功能的數據引擎
你引用的頁面裡面做的那個比較,更多的是想說明,mongodb還能夠進行條件查詢,redis則只能靠構造的時候預先進行索引。前者保留了關係型數據庫的一些特徵,後者更加的key-value一些
you cannot store structured data in Redis. You have to build the index manually, storing yet other keys.
http://blog.teksol.info/2009/07/15/mongodb-or-redis-the-choice-is-yours