日期:2014-05-16  浏览次数:20447 次

Redis命令参考中文版(Redis Command Reference)

Redis命令参考中文版,翻译自Redis Command Reference。?

?

所有命令已经翻译完毕!

?

阅读地址:?http://redis.readthedocs.org/?


欢迎反馈。


update 2011.10.23


本文档现在已经支持 Redis 2.4 版本了,enjoy!

?

update 2011.12.17


原本剩下的四个部分也已经译完,全文翻译完毕!

1 楼 fisk 2011-07-15  
刚刚开始学习redis,看到你的翻译很高兴,呵呵。
有个问题是:
MOVE 命令解释时,说可以作为Locking 的原语。可不可以给个具体的例子解释下?谢谢
2 楼 huangz 2011-07-16  
@fisk

引用
将当前数据库(默认为0)的key移动到给定的数据库db当中。

如果当前数据库(源数据库)和给定数据库(目标数据库)有相同名字的给定key,或者key不存在于当前数据库,那么MOVE没有任何效果。

因此,也可以利用这一特性,将MOVE当作锁(locking)原语。


这里所说的锁原语,就是指“如果目标数据库db内有给定key,就不将key移动到db,也就是,不覆盖原值“这一效果。

举个例子,比如我有一个些重要文档,按日期排序,专门放在一个备份数据库里面(叫它backup数据库好了),格式如下:

key: 值
2011-2-10 : xxxx
2011-5-7 : xxxx
2011-8-20 : xxxx

假如现在backup有一个key叫做2011-7-16,而在另一个数据库中,还有另一个2011-7-16,我打算将新的2011-7-16也放到backup数据库中,但是我忘记了已经有一个2011-7-16了,当然我不希望旧的2011-7-16被覆盖掉。

这时MOVE的锁作用就凸显了:假如旧的2011-7-16已经在backup数据库中了,它就不会将新的2011-7-16移动过去,造成覆盖,害我丢失数据。

这就是MOVE命令的锁的效果,确保目标数据库已有的key不会被外来key覆盖掉

你可以参考一下SET和SETNX两个命令的区别,它们的关系也是类似的。

这个概念说起来比较困难,但原理还是很直观的,我当时翻译的时候也有考虑是不是把这一句话去掉比较好,因为我觉得它的误导作用比较大,嘿嘿。

:)
3 楼 fisk 2011-07-16  
谢谢哈,现在明白了,MOVE有 锁(locking)能起到的保护“资源”的功能,:)

我觉得可以加个类似的例子,解释下(或者参见set与setnx的区别);
不过也不确定了,可能我水平比较低,理解起来有点障碍。
4 楼 huangz 2011-07-16  
呵呵,不单是你,我刚开始也是花了很大力气去理解文档里面的锁的概念,翻译的时候也遇上了很多麻烦。

这个概念本身是简单的,但是要描述它比较难:

一是文档里面原文说得其实也不是太清楚,想过自己进行大改,但是这样一来又害怕自己理解错误,误人子弟。最后决定尽量保留翻译过来的意思,但是还是多少有点走味。

二是MOVE,SETNX等命令的情况比较多,比如MOVE命令,它涉及两个数据库(本地数据库和目的地数据库),最简单的四种情况:

1.key不存在本地数据库,move
2.key存在本地,但不在目的地
3.key存在本地,也存在目的地
4.key不存在本地,存在目的地

XD,光是列出来已经让人头晕了,嘿嘿,所以这个问题不是太好处理。

你的提议有道理,我翻了一下MOVE的例子,的确不是很好理解,我已经记在TODO上面了,等有空我争取把例子改得更清晰一些。

欢迎你继续就文档进行反馈。

:)



5 楼 fisk 2011-07-29  
谢谢哈,这些天公司有点忙,没看Redis了。

我刚刚又遇到一个问题:
BLPOP
不太理解 在multi/exec中使用 BLPOP会 阻塞整个redis服务器??

6 楼 huangz 2011-07-29  
fisk 写道
谢谢哈,这些天公司有点忙,没看Redis了。

我刚刚又遇到一个问题:
BLPOP
不太理解 在multi/exec中使用 BLPOP会 阻塞整个redis服务器??



这一段,我的理解是,如果把MULTI/EXEC包裹BLPOP,BLPOP就会变成一个简单的LPOP操作,立即返回,不阻塞。

这里对在MULTI/EXEC语句中的BLPOP做了特殊处理,让它的阻塞效果没有了。

这个问题我在实际中没看到过,应该是属于实现级的问题,你看,MULTI事务执行时,要求服务器加锁,来保证事务的原子性,这样就不允许其他客户端对redis服务器进行操作,但是偏偏当列表为空时,BLPOP会阻塞,这就成了一个死循环,所以不允许MULTI/EXEC包裹BLPOP。

举个例子,现在有两个客户端A和B,现在A调用BLPOP,A阻塞,等待B给它发送信息:

A:BLPOP
A:等等等。。。

好,终于B客户端来了一个信息。

B:嘿,哥们,有个信息。

B ----> 发送信息"hello world" -----&