Redis自述文档

翻译自redis的readme.html,主要采用意译,2017.4.22晚翻译完成

Redis是一个性能非常强大(主要指访问速度)的key-value数据库,它使用 标准C语言实现,提供了许多方法来存储key-value数据,key的格式是简单 的字符串,值可以支持以下各种数据类型:

  • 字符串
  • 链表
  • 集合
  • 排序集合(zsets)
  • 哈希

每一个类型都有一个可以对其进行操作的命令集,“Redis命令参考”包含这些 命令的最新列表,这些命令通过数据类型来分类组织。Redis源代码还包括一个 Redis命令行接口,可以让您直接与服务器进行交互,这是本简介将提供示例的 方法。 一旦您浏览了Redis快速入门指南,并运行了您的Redis实例,您可以 跟随本说明进行操作。

Redis最强大的一个方面是广泛的命令,它们被优化为使用特定的数据值类型并 作为原子操作来在服务器端执行。 链表类型是一个很好的例子 - Redis实现了 O(1)操作,如LPUSH或RPUSH,并且可以通过LPOP和RPOP方法获取:

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

每个数据可以有更复杂的操作,以list来举例,你可以通过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)

你可以在集合中增加和删除元素,并执行交集,并集和差集操作。

Redis也可以看作一个数据结构服务器。 Redis用户实际上提供了抽象数据类 型的接口,从而避免了实现具体的数据结构和算法的责任 - 实际上Redis中的 算法和数据结构都被正确选择实现,来获得最佳性能。

所有数据保存在内存中,但同时保存在磁盘上

Redis将整个数据集加载并存储到内存中,但是数据集是持久的,因为它同时保 存在磁盘上,这样当服务器重启时,数据可以重新加载到内存中。

有两种支持的持久性:第一种称为快照。 在这种模式下,Redis会异步地写入 磁盘。 每次服务器(重新)启动时,都会从转储中加载数据集。

另外一种方式是可以将Redis配置为在达到一定数量的更改并且经过给定的秒 数后保存数据集。 例如,您可以将Redis配置为经过1000次更改后保存,每 60秒后保存。您可以为这些数字指定任何组合。

因为数据是异步写入的,所以当发生系统崩溃时,最后几个查询可能会丢失(在 许多应用程序中可以接受,但并非全部)。为了使其不成为一个问题,Redis支 持另一种更安全的持久性模式,称为“仅追加文件”,其中每个接收到的命令改变 数据集(所以不是只读命令,而是写命令)写在只追加文件上。 当重新启动服 务器以重建内存中的数据集时,将重新执行此命令。

Redis Append Only File支持非常方便的功能:服务器能够以非阻塞的方式在 后台安全地重建仅追加的文件。 您可以在附加文件HOWTO中找到更多详细信息。

主-备复制非常简单

无论将持久性模式如何设置,如果要保持真正的安全性,或者如果需要扩展到大量并行读取, 你需要使用Redis的主从复制。

Redis复制是微不足道的设置。 为了配置Redis服务器成为另一台服务器的备份,如果链路 断开等等,自动同步,则需要执行以下配置行:slaveof 192.168.1.100 6379.

持久存储也支持过期

Redis可以用于内存缓存,因为它和内存缓存一样的快。 象内存缓存一样,Redis 也支持设置超时,这样存储的内容会在给定时间之后自动删除。

超越key-value数据库

所有这些特性允许你使用Redis作为应用程序的Sole DB,而不需要另外的关 系数据库,我们使用PHP+Redis写了一个真实世界的例子Twitter。链接文件 解释了设计和内部实现的关键点。

多数据库支持

Redis支持多数据库,使用命令可以自动的从一个数据库移动键值到另外数据库 中。默认情况下对任何新连接都是使用DB0。通过SELECT命令可以选择不同 的数据库。使用MOVE命令可以将一项数据从一个DB移到另外一个中。 This can be used as a base for locking free algorithms together with the ‘RANDOMKEY’ commands.

关于Redis更多知识

要真正了解Redis的功能以及它的工作原理,请参考阅读Redis数据类型的十 五分钟介绍

更多地了解Redis在内部如何工作,继续阅读

Redis入门

在本文档中,你可以找到关于Redis命令和协议规范的详细信息。 这种文档非常有用,但是对于新人来说非常枯燥。Redis协议设计对于计算机解 析非常高效,但是也足够简单,可以通过telnet命令来查看。所以这段显示给 读者如何运行Redis并从中获取一些初始的感受,和它如何工作。

通过make命令来编译,通过./redis-server来启动。服务器将启动并将log 输出到标准输出-屏幕中。如果你想输出更详细的内容,编辑redis.conf文件设 置loglevel级别为debug, 然后重启。

你可以指定配置文件作为唯一的参数:

./redis-server /etc/redis.conf

参数不是必须的。服务器可以在没有配置文件情况下,使用内部的默认配置。 现在让我们给主键设置值:

$ telnet localhost 6379
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
SET foo bar
+OK

第一行发送给服务器的字符串是”SET foo bar”. 这意味着主键foo 的值设置 为bar字符串,非常简单。

(注意你可以使用小写字符发送命令,同样可以工作,命令大小写不敏感)

注意在命令结束处会有”rn”结束整个命令,从服务器和客户端两个角度来看,这都 是一个最小的开销,我们可以轻松地使用telnet命令与Redis一起交互。

最后一行是服务器给客户端的反馈”+OK”. 这意味着我们的主键增加成功。实际 上SET命令从来不会失败,”+OK”发给我们让我们知道服务器接收了请求,并 且命令也实际执行了。

现在让我们获取key的内容::

GET foo
$3
bar

和’set’命令非常相似,我们发送”get foo”,服务器响应第一行是一个$符号并接 着一个数字,表示这个主键所存储到内容字节长度。紧接着是”rn”,其后是实 际的数据内容。在Redis语境中,这叫做批量回复(bulk reply).

如果请求一个不存在的主键会发生什么情况?

GET blabla
$-1

如果主键不存在,将返回”$-1”。由于返回的-1长度没有意义,因此表示指定“nil” 值并将其与零长度值区分开来。另外一种方式检查给定的主键是否存在是 EXISTS命令:

EXISTS nokey
:0
EXISTS foo
:1

服务器返回‘:0’表示’onkey’不存在,对于’foo’返回‘:1’表示主键存在。响 应以冒号开始并接着接一个数字返回。

OK,现在你了解了最基本的知识,阅读REDIS COMMAND REFERENCE部分 来学习Redis支持的所有命令,如果你计划实现一个新语言的客户端,请参考 PROTOCOL SPECIFICATION 部分获取详细信息。

参考资料

  • Redis手册