Chinaunix首页 | 论坛 | 博客
  • 博客访问: 287783
  • 博文数量: 40
  • 博客积分: 1807
  • 博客等级: 上尉
  • 技术积分: 350
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-03 15:42
文章分类

全部博文(40)

文章存档

2011年(18)

2010年(20)

2009年(2)

我的朋友

分类: LINUX

2010-09-20 09:48:21

redis,是快客王在je chat中介绍过的一个keyvalue数据库,打着在'入门级服务器'上10w/s set ops高性能头衔来忽悠众多不明真相的程序猿。

事实上,号称的'入门级服务器'服务器是一台 Xeon X3320 2.5Ghz 的机器,在我的

AMD Athlon(tm) 64 X2 Dual Core Processor 4000+ 台式机上,benchmark结果是

引用
====== SET ======
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核机上

引用
====== SET ======
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的。

首先是全站闲聊:

有一个"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也是比较大的问题,始终批量获取跟多次获取的网络开销是不一样的。

阅读(1689) | 评论(1) | 转发(0) |
0

上一篇:Linux下的多线程编程

下一篇:ThriftUsageC++

给主人留下些什么吧!~~

chinaunix网友2010-09-21 10:18:16

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com