KeyValue DB之redis

<p><span class="hilite1"><span style="color: #006699;">redis</span>
</span>
,是快客王在je chat中介绍过的一个keyvalue数据库,打着在'入门级服务器'上10w/s set ops高性能头衔来忽悠众多不明真相的程序猿。 <br><br>
事实上,号称的'入门级服务器'服务器是一台 Xeon X3320 2.5Ghz 的机器,在我的 <br><br>
AMD Athlon(tm) 64 X2 Dual Core Processor 4000+ 台式机上,benchmark结果是</p>
<div class="quote_title">引用</div>
<div class="quote_div">====== SET ====== <br>
100005 requests completed in 2.73 seconds <br>
50 parallel clients <br>
3 bytes payload <br>
keep alive: 1 <br><br>
12.12% &lt;= 0 milliseconds <br>
93.68% &lt;= 1 milliseconds <br>
99.61% &lt;= 2 milliseconds <br>
99.93% &lt;= 3 milliseconds <br>
99.95% &lt;= 4 milliseconds <br>
99.96% &lt;= 5 milliseconds <br>
99.99% &lt;= 6 milliseconds <br>
100.00% &lt;= 7 milliseconds <br>
100.00% &lt;= 202 milliseconds <br>
36685.62 requests per second</div>
<p><br><br>
在一台更为牛X的 Intel(R) Xeon(R) CPU E5410 @ 2.33GHz 8核机上</p>
<div class="quote_title">引用</div>
<div class="quote_div">====== SET ====== <br>
100004 requests completed in 1.16 seconds <br>
50 parallel clients <br>
3 bytes payload <br>
keep alive: 1 <br><br>
59.77% &lt;= 0 milliseconds <br>
100.00% &lt;= 1 milliseconds <br>
100.00% &lt;= 201 milliseconds <br>
85987.96 requests per second <br>
</div>
<p><br><br>
这玩意目前只能用一个核,所以CPU频率和缓存就成了速度的关键。 <br><br>
好吧,就DB来说,似乎这个成绩已经很惊人
了,且不说memcachedb和tokyocabinet之流,就说原版的memcached,速度似乎也只能达到这个级别。可是经过进一步的发现,这
玩意根本是使用内存存储,持久化的关键是这三条指令:SAVE BGSAVE LASTSAVE … <br><br>
当接收到SAVE指令的时候,这玩意就会dump数据到一个文件里面。。。 <br><br>
当揭发了<span class="hilite1">redis</span>
的真面目之后,值得一说的是它的独家功能:存储列表和集合,这是它与mc之流相比更有竞争力的地方。 <br>
不介绍mc里面已经有的东东,只列出特殊的: <br><br>
TYPE key — 用来获取某key的类型 <br>
KEYS pattern — 匹配所有符合模式的key,太厉害了,比如KEYS * 就列出所有的key了,当然,复杂度O(n) <br>
RANDOMKEY - 返回随机的一个key <br>
RENAME oldkey newkey — key也可以改名 <br><br>
列表操作,这里才是精华阿 <br>
RPUSH key string — 将某个值加入到一个key列表头部 <br>
LPUSH key string — 将某个值加入到一个key列表末尾 <br>
LLEN key — 列表长度 <br>
LRANGE key start end — 返回列表中某个范围的值,相当于mysql里面的分页查询那样 <br>
LTRIM key start end — 只保留列表中某个范围的值 <br>
LINDEX key index — 获取列表中特定索引号的值,要注意是O(n)复杂度 <br>
LSET key index value — 设置列表中某个位置的值 <br>
LPOP key <br>
RPOP key — 和上面的LPOP一样,就是类似栈或队列的那种取头取尾指令,可以当成消息队列来使用了 <br><br>
集合操作,也一样精彩 <br>
SADD key member — 增加元素 <br>
SREM key member — 删除元素 <br>
SCARD key — 返回集合大小 <br>
SISMEMBER key member — 判断某个值是否在集合中 <br>
SINTER key1 key2 ... keyN — 获取多个集合的交集元素 <br>
SMEMBERS key — 列出集合的所有元素 <br><br>
还有Multiple DB的命令,可以更换db,也是比较有意思,数据可以隔离开,默认是存放在DB 0 <br><br>
好了,命令都列出来了,有什么用呢?官方做了一个更加山寨的twitter克隆版,retwis,代码使用PHP开发,主要看retwis.php就可以了。下面结合下je的山寨chat来说明这东东是怎样用<span class="hilite1">redis</span>
的。 <br><br>
首先是全站闲聊: <br>
http://app.javaeye.com/chat/all <br>
有一个"global:timeline"列表,里面存放所有的口水,然后通过LRANGE取头50个,返回显示。 <br><br>
想看看肉饼最近说啥了,http://robbin.javaeye.com/blog/chat,构造一个key "uid:$userid:posts",比如 'uid:robbinfan:posts',同理LRANGE取列表。 <br><br>
有多少人订阅了肉饼饭呢? http://robbin.javaeye.com/blog/subscriptions <br>
SCARD
一下 "uid:robbinfan:followers",同理肉饼饭的订阅数
"uid:robbinfan:following"。要获取全部的列表,那就 SMEMBERS "uid:robbinfan:followers"
好了,然后加载每个订阅者的信息:GET "uid:quakewang:username"。 <br><br>
随着水王的诞生,居然在一个集合里面保存了上万的口水(比如global:timeline)。如果只需要保存最新的记录,可以LTRIM一下,整个世界就清静了。 <br><br><span class="hilite1">redis</span>

出现,很大程度补偿了memcached这类keyvalue存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了
Python,Ruby,Erlang,PHP客户端,使用很方便。问题是这东东还很新,目前是beta-6版本,可能还不足够稳定。此外,缺乏mc中批
量get也是比较大的问题,始终批量获取跟多次获取的网络开销是不一样的。</p>

猜你喜欢

转载自shmily2038.iteye.com/blog/1740358