Redis是一个远程内存数据库,它不仅性能强劲,而且还具有复制特性以及为解决问题而生的独一无二的数据模型。Redis 提供了5种不同类型的数据结构,各式各样的问题都可以很自然地映射到这些数据结构上:Redis的数据结构致力于帮助用户解决问题,而不会像其他数据库那样,要求用户扭曲问题来适应数据库。除此之外,通过复制、持久化( persistence )和客户端分片( client-side sharding )等特性,用户可以很方便地将Redis 扩展成一个能够包含数百GB数据、每秒处理上百万次请求的系统。
一家公司需要对一个保存了6万个客户联系方式的关系数据库进行搜索,搜索可以根据名字、邮件地址、所在地和电话号码来进行,每次搜索需要花费10~15秒的时间。使用Redis重写了一个新的搜索引擎,然后又花费了数周时间来仔细测试这个新系统,使它达到生产级别,最终这个新的搜索系统不仅可以根据名字、邮件地址、所在地和电话号码等信息来过滤和排序客户联系方式,并且每次操作都可以在50毫秒之内完成,这比原来的搜索系统足足快了200倍。
1:Redis简介
2:Redis数据结构简介
Redis可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为STRING (字符串) LIST(列表) SET(集合)、HASH(散列)和ZSET (有序集合)。有一部分Redis命令对于这5种结构都是通用的,如DEL、TYPE、 RENAME 等;但也有一部分Redis命令只能对特定的一种或者两种结构使用
大部分程序员应该都不会对Redis 的STRING、LIST、HASH这3种结构感到陌生,因为它们和很多编程语言内建的字符串、列表和散列等结构在实现和语义方面都非常相似。有些编程语言还有集合数据结构,在实现和语义上类似于Redis的SET。ZSET在某种程度上是一种Redis特有的结构,但是当你熟悉了它之后,就会发现它也是一种非常有用的结构。下表对比了Redis 提供的5种结构,说明了这些结构存储的值,并简单介绍了它们的语义。
2.1 Redis中的字符串
字符串拥有一些和其他键值存储相似的命令,比如GET (获取值) SET (设置值)和DEL(删除值)。
可以根据代码清单如下图展示的例子,尝试使用redis-cli执行SET、GET和DEL,下表描述了这3个命令的基本用法。
除了能够GET、SET和DEL字符串值之外,Redis 还提供了一些可以对字符串的其中一部分内容进行读取和写人的命令,以及一些能对字符串存储的数值执行 自增或者自减操作的命令。以后会讲到
2.2 Redis中的列表
Redis对链表( linked-list )结构的支持使得它在键值存储的世界中独树一帜。一个列表结构可以有序地存储多个字符串,和表示字符串时使用的方法一样,本节使用带有标签的方框来表示列表,并将列表包含的元素放在方框里面。下图展示了一个这样的示例。
Redis列表可执行的操作和很多编程语言里面的列表操作非常相似: LPUSH命令和RPUSH命令分别用于将元素推入列表的左端( left end )和右端( right end); LPOP命令和RPOP命令分别用于从列表的左端和右端弹出元素; LINDEX 命令用于获取列表在给定位置上的一个元素; LRANGE 命令用于获取列表在给定范围上的所有元素。代码清单展示了一些列表命令的使用示例,下表简单介绍了示例中用到的各个命令。
即使Redis的列表只支持以上提到的几个命令,它也已经可以用来解决很多问题了,但Redis并没有就此止步一除 了,上面提到的命令之外, Redis 列表还拥有从列表里面移除元素的命令、将元素插人列表中间的命令、将列表修剪至指定长度(相当于从列表的其中一端或者两端移除元素)的命令,以及其他一些命令。
2.3 Redis中的集合
Redis的集合和列表都可以存储多个字符串,它们之间的不同在于,列表可以存储多个相同的字符串,而集合则通过使用散列表来保证自已存储的每个字符串都是各不相同的(这些散列表只有键,但没有与键相关联的值)。 下图展示了一个包含3个元素的示例集合。
因为Redis的集合使用无序( unordered)方式存储元素,所以用户不能像使用列表那样,将元素推入集合的某一端,或者从集合的某一端弹出元素。不过用户可以使用SADD命令将元素添加到集合,或者使用SREM命令从集合里面移除元素。另外还可以通过SI SMEMBER命令快速地检查一个元素是否已经存在于集合中,或者使用SMEMBERS命令获取集合包含的所有元素(如果集合包含的元素非常多,那么SMEMBERS命令的执行速度可能会很慢,所以请谨慎地使用这个命令)。代码清单展示了一些集合命令的使用示例,下表简单介绍了代码清单里面用到的各个命令。
2.4 Redis的散列
Redis的散列可以存储多个键值对之间的映射。和字符串一样, 散列存储的值既可以是字符串又可以是数字值,并且用户同样可以对散列存储的数字值执行自增操作或者自减操作。下图展示了一个包含两个键值对的散列。
散列在很多方面就像是一个微缩版的Redis, 不少字符串命令都有相应的散列版本。代码清单展示了怎样对散列执行插入元素,获取元素和移除元素等操作,表1-6简单介绍了代码清单里面用到的各个命令。
2.5 Redis的有序集合
有序集合和散列一样,都用于存储键值对:有序集合的键被称为成员( member),每个成员都是各不相同的;而有序集合的值则被称为分值( score),分值必须为浮点数。有序集合是Redis里面唯一个既可以根据成员访问元素(这一点和散列一样),又可以根据分值以及分值的排列顺序来访问元素的结构。下图展示示了一个包含两个元素的有序集合示例。
和Redis的其他结构一样, 用户可以对有序集合执行添加.移除和获取等操作,代码清单展示了这些操作的执行示例,表1-7简单介绍了代码清单里面用到的各个命令
3:总结
Redis是一个可以用来解决问题的工具,它既拥有其他数据库不具备的数据结构,又拥有内存存储(这使得Redis的速度非常快)、远程(这使得Redis可以与多个客户端和服务器进行连接)、持久化(这使得服务器可以在重启之后仍然保持重启之前的数据)和可扩展(通过主从复制和分片)等多个特性,这使得用户可以以熟悉的方式为各种不同的问题构建解决方案。