在Redis 中操作字符串的基本命令

管理员账号

2018-06-01

Redis 作为一个流行的key-value 内存数据存储,由于性能高、数据类型丰富、API 功能强大c助希望在业务场景中交付低延迟服务的用户。

使用Redis 进行应用设计和开发的一个核心概念是数据类型。与关系数据库不同,在Redis 中不存在需要我们担心的表或模式。在使用Redis 进行应用设计和开发时,我们首先应该考虑的是,Redis原生支持的哪种数据类型最适合我们的场景。此外,我们无法像在关系数据库中那样,使用SQL 来操作Redis 中的数据。相反,我们需要直接使用API 发送数据所对应的命令,来操作想要操作的目标数据。

字符串类型是编程语言和应用程序中最常见和最有用的数据类型,也是Redis 的基本数据类型之一。事实上,Redis 中所有的键都必须是字符串。本案例将演示在Redis 中操作字符串的基本命令。

为了更好地说明,我们将展示一个类似于Yelp 的示例程序(本书中将其称为Relp)。Relp 是一个供用户评论和推荐优秀餐厅、购物中心或其他服务的应用。在Relp 中,我们可以浏览一个城市中不同的Redis 4.x Cookbook 中文版餐厅,找到在一定距离范围内排名前十的健身房,给本地服务打分和发表评论意见,等等。我们会把Relp 所涉及的数据全部存储到Redis 中。

1 准备工作

我们需要按照启动和停止Redis 一节中的步骤安装一个Redis 服务器,并使用redis-cli 连接到这个Redis 服务器。

2 操作步骤

接下来,让我们按照以下的步骤来学习如何使用字符串类型。

1.打开一个终端,并使用redis-cli 连接到Redis。

2.使用SET 命令将一个字符串值关联到一个键。在Relp 中,我们可以将餐厅名称和地址分别用作键和值;例如,假设我们想设置“Extreme Pizza”餐厅的地址:

127.0.0.1:6379> SET "Extreme Pizza" "300 Broadway, New York, NY"
OK

3.使用GET 命令可以轻松地取回字符串的值:

127.0.0.1:6379> GET "Extreme Pizza"
"300 Broadway, New York, NY"

4.当GET 一个不存在的键时会返回(nil):

127.0.0.1:6379> GET "Yummy Pizza"
(nil)

5.STRLEN 命令返回字符串的长度;例如,如果我们想获取“Extreme Pizza”地址的长度,可以使用:

127.0.0.1:6379> STRLEN "Extreme Pizza"
(integer) 26

6.对不存在的键执行STRLEN 命令会返回0。

Redis 还提供了一些命令来直接操作字符串。使用这些命令的好处是,不需要通过GET 命令来读取一个字符串的值,再用SET 命令将(处理后的)字符串写回去。

使用APPEND 命令可以向一个键的字符串值末尾追加字符串:

127.0.0.1:6379> APPEND "Extreme Pizza" " 10011"
(integer) 32
127.0.0.1:6379> GET "Extreme Pizza"
"300 Broadway, New York, NY 10011"

使用SETRANGE 命令可以覆盖字符串值的一部分;例如,如果我们想更新“Extreme Pizza”的地址,可以使用:

127.0.0.1:6379> SETRANGE "Extreme Pizza" 14 "Washington, DC 20009"
(integer) 34
127.0.0.1:6379> GET "Extreme Pizza"
"300 Broadway, Washington, DC 20009"

3 工作原理

SET 和GET 可能是Redis 中最常用的命令了。SET 命令的用法非常简单:

SET

如果SET 命令执行成功,Redis 会返回OK。APPEND 命令会将字符串追加到现有字符串的末尾,并返回新字符串的长度。如果键不存在,那么Redis 将首先创建一个空字符串并与键相关联,然后再执行APPEND 命令。SETRANGE 命令会覆盖字符串的一部分(从指定的偏移开始,直到整个字符串的末尾)。在Redis 中,字符串的偏移是从0 开始的。SETRANGE 命令会在覆盖完成后返回新字符串的长度。

4 更多细节

如果某个键已经存在,那么SET 命令会覆盖该键此前对应的值。有时,我们不希望在键存在的时候盲目地覆盖键;这时,我们可以使用EXIST 命令来测试键的存在性。事实上,Redis 提供了SETNX 命令(简称为不存在时SET),用于原子性地、仅在键不存在时设置键的值。如果键的值设置成功,则SETNX 返回1;如果键已经存在,则返回0 且不覆盖原来的值:

127.0.0.1:6379> SETNX "Lobster Palace" "437 Main St, Chicago, IL"
 (integer) 1
127.0.0.1:6379> SETNX "Extreme Pizza" "100 Broadway, New York, NY"
(integer) 0

SET 命令中的NX 选项与SETNX 一样。相反地,SET 命令的XX 选项表示仅在键已经存在时才设置值。
我们可以通过使用MSET 和MGET 命令来一次性地设置和获取多个键的值。使用MSET 的优点在于整个操作是原子性的,意味着所有的键都是在客户机和服务器之间的一次通信中设置的。因此,我们可以通过使用MSET 命令而不是发出多个SET 命令来节省网络开销。MSET 和MGET 命令的用法为:

MSET key value [key value...]
MGET key value [key value...]
127.0.0.1:6379> MSET "Sakura Sushi" "123 Ellis St, Chicago, IL" "Green Curry
Thai" "456 American Way, Seattle, WA"
OK
127.0.0.1:6379> MGET "Sakura Sushi" "Green Curry Thai" "nonexistent"
1) "123 Ellis St, Chicago, IL"
2) "456 American Way, Seattle, WA"
3) (nil)

在这里有必要提一下字符串在Redis 内部是如何进行编码的。Redis 使用了三种不同的编码方式来存储字符串对象,并会根据每个字符串值自动决定所使用的编码方式:

int:用于能够使用64 位有符号整数表示的字符串。

embstr:用于长度小于或等于44 字节(在Redis 3.x 中曾经是39 字节)的字符串;这种类型的编码在内存使用和性能方面更有效率。

raw:用于长度大于44 字节的字符串。

我们可以使用OBJECT 命令来查看与键相关联的Redis 值对象的内部编码方式:

127.0.0.1:6379> SET myKey 12345
OK
127.0.0.1:6379> OBJECT ENCODING myKey
"int"
127.0.0.1:6379> SET myKey "a string"
OK
127.0.0.1:6379> OBJECT ENCODING myKey
"embstr"
127.0.0.1:6379> SET myKey "a long string whose length is more than 44 bytes"
OK
127.0.0.1:6379> OBJECT ENCODING myKey
"raw"

5 相关内容

OBJECT 命令除了用于查看编码外还有更多的功能,该命令还允许我们查看Redis 对象的refcount 和idletime(参见https://redis.io/commands/object)。

受篇幅所限,在本案例中我们无法演示字符串类型相关的所有Redis 命令。请读者参阅https://redis.io/-commands#string 学习字符串相关的所有命令。

本文选自《Redis 4.x Cookbook中文版》

读者评论

相关博文

  • 在Redis 中操作字符串的基本命令

    在Redis 中操作字符串的基本命令

    管理员账号 2018-06-04

    Redis 作为一个流行的key-value 内存数据存储,由于性能高、数据类型丰富、API 功能强大c助希望在业务场景中交付低延迟服务的用户。 使用Redis 进行应用设计和开发的一个核心概念是数据类型。与关系数据库不同,在Re...

    管理员账号 2018-06-04
    372 0 0 0