《Redis实战》一1.2 Redis数据结构简介

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介:

本节书摘来异步社区《Redis实战》一书中的第1章,第1.2节,作者: 【美】Josiah L. Carlson(约西亚 L.卡尔森)译者: 黄健宏 责编: 杨海玲,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.2 Redis数据结构简介

正如之前的表1-1所示,Redis可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为STRING(字符串)、LIST(列表)、SET(集合)、HASH(散列)和ZSET(有序集合)。有一部分Redis命令对于这5种结构都是通用的,如DEL、TYPE、RENAME等;但也有一部分Redis命令只能对特定的一种或者两种结构使用,第3章将对Redis提供的命令进行更深入的介绍。

大部分程序员应该都不会对Redis的STRING、LIST、HASH这3种结构感到陌生,因为它们和很多编程语言内建的字符串、列表和散列等结构在实现和语义(semantics)方面都非常相似。有些编程语言还有集合数据结构,在实现和语义上类似于Redis的SET。ZSET在某种程度上是一种Redis特有的结构,但是当你熟悉了它之后,就会发现它也是一种非常有用的结构。表1-2对比了Redis提供的5种结构,说明了这些结构存储的值,并简单介绍了它们的语义。


b2


命令列表 本节在介绍每个数据类型的时候,都会在一个表格里面展示一小部分处理这些数据结构的命令,之后的第 3 章会展示一个更详细(但仍不完整)的命令列表,完整的 Redis 命令列表可以在http://redis.io/commands找到。

这一节将介绍如何表示Redis的这5种结构,并且还会介绍Redis命令的使用方法,从而为本书的后续内容打好基础。本书展示的所有示例代码都是用Python写的,如果读者已经按照附录A里面描述的方法安装好了Redis,那么应该也已经安装好了Python,以及在Python里面使用Redis所需的客户端库。只要读者在电脑里面安装了Redis、Python和redis-py库,就可以在阅读本书的同时,尝试执行书中展示的示例代码了。

请安装Redis和Python 在阅读后续内容之前,请读者先按照附录A中介绍的方法安装Redis和Python。如果读者觉得附录A描述的安装方法过于复杂,那么这里有一个更简单的方法,但这个方法只能用于Debian系统(或者该系统的衍生系统):从http://redis.io/download下载Redis的压缩包,解压压缩包,执行make && sudo make install,之后再执行sudo python -m easy_install redis hiredis(hiredis是可选的,它是一个使用C语言编写的高性能Redis客户端)。

如果读者熟悉过程式编程语言或者面向对象编程语言,那么即使没有使用过Python,应该也可以看懂Python代码。另一方面,如果读者决定使用其他编程语言来操作Redis,那么就需要自己来将本书的Python代码翻译成正在使用的语言的代码。

使用其他语言编写的示例代码 尽管没有包含在书中,但本书展示的Python示例代码已经被翻译成了Ruby代码、Java代码和JavaScript代码,这些翻译代码可以在https://github.com/ josiahcarlson/redis-in-action下载到。跟Python编写的示例代码一样,这些翻译代码也包含相应的注释,方便读者参考。

为了让示例代码尽可能地简单,本书会尽量避免使用Python的高级特性,并使用函数而不是类或者其他东西来执行Redis操作,以此来将焦点放在使用Redis解决问题上面,而不必过多地关注Python的语法。本节将使用redis-cli控制台与Redis进行互动。首先,让我们来了解一下Redis中最简单的结构:STRING。

1.2.1 Redis中的字符串

Redis的STRING和其他编程语言或者其他键值存储提供的字符串非常相似。本书在使用图片表示键和值的时候,通常会将键名(key name)和值的类型放在方框的顶部,并将值放在方框的里面。图1-1以键为hello、值为world的STRING为例,分别标记了方框的各个部分。


1

STRING拥有一些和其他键值存储相似的命令,比如GET(获取值)、SET(设置值)和DEL(删除值)。如果读者已经按照附录A中给出的方法安装了Redis,那么可以根据代码清单1-1展示的例子,尝试使用redis-cli执行SET、GET和DEL,表1-3描述了这3个命令的基本用法。


b3


1

使用 redis-cli 为了让读者在一开始就能便捷地与 Redis 进行交互,本章将使用redis-cli这个交互式客户端来介绍Redis命令。

除了能够GET、SET和DEL字符串值之外,Redis还提供了一些可以对字符串的其中一部分内容进行读取和写入的命令,以及一些能对字符串存储的数值执行自增或者自减操作的命令。第3章将对这些命令进行介绍,但是在此之前,我们还有许多基础知识需要了解,下面来看一下Redis的列表及其功能。

1.2.2 Redis中的列表
Redis对链表(linked-list)结构的支持使得它在键值存储的世界中独树一帜。一个列表结构可以有序地存储多个字符串,和表示字符串时使用的方法一样,本节使用带有标签的方框来表示列表,并将列表包含的元素放在方框里面。图1-2展示了一个这样的示例。


2

Redis列表可执行的操作和很多编程语言里面的列表操作非常相似:LPUSH命令和RPUSH命令分别用于将元素推入列表的左端(left end)和右端(right end);LPOP命令和RPOP命令分别用于从列表的左端和右端弹出元素;LINDEX命令用于获取列表在给定位置上的一个元素;LRANGE命令用于获取列表在给定范围上的所有元素。代码清单1-2展示了一些列表命令的使用示例,表1-4简单介绍了示例中用到的各个命令。


b4


2

即使Redis的列表只支持以上提到的几个命令,它也已经可以用来解决很多问题了,但Redis并没有就此止步——除了上面提到的命令之外,Redis列表还拥有从列表里面移除元素的命令、将元素插入列表中间的命令、将列表修剪至指定长度(相当于从列表的其中一端或者两端移除元素)的命令,以及其他一些命令。第3章将介绍许多列表命令,但是在此之前,让我们先来了解一下Redis的集合。

1.2.3 Redis的集合

Redis 的集合和列表都可以存储多个字符串,它们之间的不同在于,列表可以存储多个相同的字符串,而集合则通过使用散列表来保证自己存储的每个字符串都是各不相同的(这些散列表只有键,但没有与键相关联的值)。本书表示集合的方法和表示列表的方法基本相同,图1-3展示了一个包含3个元素的示例集合。


3

因为Redis的集合使用无序(unordered)方式存储元素,所以用户不能像使用列表那样,将元素推入集合的某一端,或者从集合的某一端弹出元素。不过用户可以使用SADD命令将元素添加到集合,或者使用SRAM命令从集合里面移除元素。另外还可以通过SISMEMBER命令快速地检查一个元素是否已经存在于集合中,或者使用SMEMBERS命令获取集合包含的所有元素(如果集合包含的元素非常多,那么SMEMBERS命令的执行速度可能会很慢,所以请谨慎地使用这个命令)。代码清单1-3展示了一些集合命令的使用示例,表1-5简单介绍了代码清单里面用到的各个命令。

代码清单1-3 SADD、SMEMBERS、SISMEMBER和SREM的使用示例


q3


b5

跟字符串和列表一样,集合除了基本的添加操作和移除操作之外,还支持很多其他操作,比如SINTER、SUNION、SDIFF这3个命令就可以分别执行常见的交集计算、并集计算和差集计算。第3章将对集合的相关命令进行更详细的介绍,另外第7章还会展示如何使用集合来解决多个问题。不过别心急,因为在Redis提供的5种数据结构中,还有两种我们尚未了解,让我们先来看看Redis的散列。

1.2.4 Redis的散列

Redis的散列可以存储多个键值对之间的映射。和字符串一样,散列存储的值既可以是字符串又可以是数字值,并且用户同样可以对散列存储的数字值执行自增操作或者自减操作。图1-4展示了一个包含两个键值对的散列。


4

散列在很多方面就像是一个微缩版的Redis,不少字符串命令都有相应的散列版本。代码清单1-4展示了怎样对散列执行插入元素、获取元素和移除元素等操作,表1-6简单介绍了代码清单里面用到的各个命令。

代码清单1-4 HSET、HGET、HGETALL和HDEL的使用示例


q2



b6

熟悉文档数据库的读者可以将Redis的散列看作是文档数据库里面的文档,而熟悉关系数据库的读者则可以将Redis的散列看作是关系数据库里面的行,因为散列、文档和行这三者都允许用户同时访问或者修改一个或多个域(field)。最后,让我们来了解一下Redis的5种数据结构中的最后一种:有序集合。

1.2.5 Redis的有序集合

有序集合和散列一样,都用于存储键值对:有序集合的键被称为成员(member),每个成员都是独一无二的;而有序集合的值则被称为分值(score),分值必须为浮点数。有序集合是Redis里面唯一一个既可以根据成员访问元素(这一点和散列一样),又可以根据分值以及分值的排列顺序来访问元素的结构。图1-5展示了一个包含两个元素的有序集合示例。


5

和Redis的其他结构一样,用户可以对有序集合执行添加、移除和获取等操作,代码清单1-5展示了这些操作的执行示例,表1-7简单介绍了代码清单里面用到的各个命令。

代码清单1-5 ZADD、ZRANGE、ZRANGEBYSCORE和ZREM的使用示例


q1



b7

现在读者应该已经知道有序集合是什么和它能干什么了,到目前为止,我们基本了解了Redis提供的5种结构。接下来的一节将展示如何通过结合散列的数据存储能力和有序集合内建的排序能力来解决一个常见的问题。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
12天前
|
XML JSON NoSQL
Redis的常用数据结构之字符串类型
Redis的常用数据结构之字符串类型
19 0
|
19天前
|
存储 消息中间件 NoSQL
Redis数据类型详解:选择合适的数据结构优化你的应用
Redis数据类型详解:选择合适的数据结构优化你的应用
|
24天前
|
存储 NoSQL 算法
【Redis技术进阶之路】「底层源码解析」揭秘高效存储模型与数据结构底层实现(字典)(二)
【Redis技术进阶之路】「底层源码解析」揭秘高效存储模型与数据结构底层实现(字典)
36 0
|
24天前
|
存储 NoSQL Redis
作者推荐 |【Redis技术进阶之路】「原理系列开篇」揭秘高效存储模型与数据结构底层实现(SDS)(三)
作者推荐 |【Redis技术进阶之路】「原理系列开篇」揭秘高效存储模型与数据结构底层实现(SDS)
21 0
|
24天前
|
存储 算法 Java
金石推荐 | 【算法数据结构专题】「延时队列算法」史上手把手教你针对层级时间轮(TimingWheel)实现延时队列的开发实战落地(下)(一)
金石推荐 | 【算法数据结构专题】「延时队列算法」史上手把手教你针对层级时间轮(TimingWheel)实现延时队列的开发实战落地(下)
29 1
|
26天前
|
存储 NoSQL Java
Redis 数据结构操作入门
Redis 数据结构操作入门
15 0
|
26天前
|
NoSQL Redis
Netty实战:模拟Redis的客户端
Netty实战:模拟Redis的客户端
11 0
|
1月前
|
存储 NoSQL Redis
KubeSphere 核心实战之二【在kubesphere平台上部署redis】(实操篇 2/4)
KubeSphere 核心实战之二【在kubesphere平台上部署redis】(实操篇 2/4)
22 0
|
14天前
|
消息中间件 存储 搜索推荐
深入理解栈和队列(二):队列
深入理解栈和队列(二):队列
29 0
|
1月前
【栈】数据结构栈的实现
【栈】数据结构栈的实现