(本文为原创翻译,翻译的不好请各位指点。如果有人真的想转载此文(谜之音:会有吗?),请注明作者是 Vayn <vt at elnode dot com>。)
原文地址:http://code.google.com/p/redis/wiki/README
本文同时发表于 VK 和 ForkGeek
简介
Redis 是一个极其快速和强大的键值(key-value)存储数据库,服务器用 ANSI-C 实现。
Redis 提供多种不同的方法做一件明确的事:将一个 value(“antirez”)与对应的 key(“redis”)储存。虽然 key 的格式必须是简单的字符串,但 value 支持以下几种数据类型:
每种 value 的数据类型都有一个相关的可以对其进行操作的命令列表,并且在 The Redis Command Reference 中包括一张最新的,主要以数据类型组织的命令表。
Redis 源中也包含着一个 Redis command line interface,能够让你直接与服务器交互,这意味着本说明将会提供一些样例。当你扫阅 Redis Quick Start Guide 以建立一个 Redis 运行实例时,可以独自按步骤进行。
Redis 最强大的一面是一系列的命令,这些命令是为了工作于特定数据类型而优化的,并且作为服务器端原子操作执行。List 类型是一个很棒的例子——Redis 实现例如 LPUSH 或 RPUSH 这样伴随着 LPOP 和 RPOP 方法的 O(1) 操作:
redis> lpush programming_languages C
OK
redis> lpush programming_languages Ruby
OK
redis> rpush programming_languages Python
OK
redis> rpop programming_languages
Python
redis> lpop programming_languages
Ruby
更多用于各种数据类型的复杂操作也是可用的。继续列下去,你能够获得一系列 LRANGE(O(start+n)) 的元素或用 LTRIM(O(n)) 修整的列表。
redis> lpush cities NYC
OK
redis> lpush cities SF
OK
redis> lpush cities Tokyo
OK
redis> lpush cities London
OK
redis> lpush cities Paris
OK
redis> lrange cities 0 2
1. Paris
2. London
3. Tokyo
redis> ltrim cities 0 1
OK
redis> lpop cities
Paris
redis> lpop cities
London
redis> lpop cities
(nil)
你也可以从一个集合中添加或移除元素,执行交集(intersection)、并集(union)和补集(difference)。Redis 也可以被看成是一个数据结构服务器。Redis 用户实质上拥有一个抽象数据类型(Abstract Data Types)接口,使其免于实施具体数据结构和算法(concrete data structures and algorithms)——的确为了获得最佳性能,Redis 恰当地选择了算法和数据结构。
全部数据放置于内存(memory)中,但储存于硬盘(disk)里
Redis 在内存中加载和维护整个数据集(dataset),但与此同时数据集也持久储存在硬盘中。因此当服务器重启的时候,数据可以加载回内存中。Redis 有两种持久性支持:第一种叫做快照(snapshotting)。此模式下 Redis 周期性地(将数据)异步写入硬盘。数据集在每次服务器(重新)启动的时候从 dump 载入。
可将 Redis 配置成达到若干改变并过了限定的时间后就保存数据集。比如你可以设置 Redis 在 1000 次变化后且自上次储存不超过 60 秒的条件储存。你能够指定任意这些数字的组合。
因为数据是异步写入的,当一次系统崩溃发生,最后的一些查询可能会丢失(the last few queries can get lost)(在很多的应用中可用,但不是全部的)。为了让这种情况不发生问题 Redis 支持另一种更安全的持久模式,被称为 Append Only File(只能添加文件),就是每个收到的用来修改数据集的命令(因此不是一个读取命令,而是一个写入命令)尽可能快地写入一个只能添加文件(AOF)。这些命令在服务器启动的时候被重新执行,用来在内存中重建数据集。
Redis Append Only File 支持一个非常便捷的功能:当服务器长时间运行,它可以在后台以非阻塞方式安全重建一个只添加文件。你可以在 Append Only File HOWTO 找到更多细节。
主从复制实现细节
如果你想保持真正的安全或者你需要均衡(scale)数量巨大的读取,无论你要使用哪种持久性模式Redis 都支持主从复制。
Redis Replication 是一个微不足道的设置。琐碎到为了配置一台 Redis 服务器作为另一台的从服务器,并在假设连接下降的条件下自动同步等等,你全部要做的就是下面一行设置:slaveof 192.168.1.100 6379。如果你想了解更多有关这个功能的资料,我们为你准备了 Replication Howto。
持久但支持有效期
Redis 可以当作 memecached on steroids,因为它就像 memcached 一样快但却拥有更多特性。像 memcached 一样,Redis 也支持设置超时时间,这样一个 key 会自动在限定时间过后被移除。
超越键值(key-value)数据库
通过这些特性你可以把 Redis 作为可扩展(伸缩)应用的唯一数据库,而无需使用关系数据库。我们写好了一个用 PHP + Redis 实现地简单的克隆 Twitter,以展示一个现实世界的例子,链接指向一篇遣词简单的文章,这篇文章解释了例子的设计和内部构件。
多数据库支持
Redis 支持多数据库,通过命令自动从一个数据库到另一个数据库移除 key。作为缺省数据库 0 在每次新连接的时候会被选中,但使用 SELECT 命令却不可能选择不同的数据库。MOVE 操作可以自动把一个项从一个数据库移到另一个数据库。这和 RANDOMKEY 命令配合,可以被用做无锁算法的基础(This can be used as a base for locking free algorithms together with the 'RANDOMKEY' commands.)
了解更多关于 Redis!
想真正感觉什么是 Redis 并且想知道它如何工作,请试阅 A fifteen minutes introduction to Redis data types。
想知道点儿更多Redis 内部如何工作请继续阅读。
Redis 指导
(注意,如果你只对“正式”文档有兴趣你可以跳过本节)
接下来,你可以在本文档找到有关 Redis 命令的细节信息、协议说明等等。这类文档很有用,但……如果你是个刚了解 Redis 的菜鸟,你会发现这样的文档也很•无•聊!Redis 协议被设计为计算机可高效解析,同样,对只想用 “telnet”命令四处溜达的人类来说也足够简单。So,本节将会向读者稍稍表演一下怎么和 Redis 玩儿,Redis 怎么工作。这样你就会对 Redis 产生一种初恋的感觉~
只需“make”即可编译 Redis,用“./redis-server”启动它。服务器将会开始用标准输出(standard output)记录日志,如果你想记录更多信息请编辑 redis.conf,把 记录等级(loglevel)设为 debug,然后重启。
你可以指定一个配置文件作为特有参数:
./redis-server /etc/redis.conf
这不是必须的。服务器甚至可以在没有配置文件的情况下用缺省内置配置启动。
现在让我们尝试把一个 key 设置到给定的 value:
$ telnet localhost 6379
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
SET foo 3
bar
+OK
第一行我们把“set foo 3”发送到服务器。这个意思是“把名为 fool 的 key连同我要发给你的 3 byte设置到名为 bar 的 value”。很简单吧!
(注意,你用小写发送命令服务器也将良好运作,总之命令不是大小写敏感的。)
注意第一二行过后,我们向服务器发送了一行新命令在最后:服务器希望命令和字节序列均以“\r\n”终止。同时从服务器和客户端的观点来看,这是允许我们轻松使用 telnet 命令摆弄 Redis 的最小代价。
服务器和客户端之间会话的最后一行是“+OK”。意思是我们的 key 已经被毫无状况地加入了。事实上只要 “+OK”发送 SET 就不会失败,这让我们知道服务器收到所有命令并且已经实际执行了。
现在我们尝试获取 key 的内容:
GET foo
$3
bar
Ok 这很像于“set”,只是颠倒过来。我们发送了“get foo”,服务器在第一行用 $ 符号后接 value 储存的 key 所包含的 byte 数目作为应答。“\r\n”再次附在 byte 计数和实际数据之后。在 Redis 俚语中,这被称为批量应答(a bulk reply)。
请求一个不存在的 key 会怎样?
GET blabla
$-1
当 key 不存在用长度替换的时候就仅仅发送“$-1”字符串。-1 长度的 bulk reply 没有什么实际含义,它是为了定义“nil” value 并与零长度(zero length)value 区别。另一种检查一个给定 key 是不是确实存在的方法是 EXISTS 命令:
EXISTS nokey
:0
EXISTS foo
:1
正如你所见,服务器第一次应答“:0”,因为 “nokey”(这个 key)不存在。同时“:1”对 foo,这个 key 存在。以冒号开始的应答是完整应答。
Ok……现在你了解了一些基础知识,阅读 REDIS COMMAND REFERENCE 一节学习 Redis 支持的所有命令。如果你想实现一个像样的 Redis实例,请阅读 PROTOCOL SPECIFICATION 一节以了解更多细节。
许可
Redis使用BSD协议进行授权,请阅读源代码中的COPYING文件来了解更多信息。
鸣谢
Redis是由Salvatore Sanfilippo(又叫“antirez”)开发和维护的。
--eof--