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) 32127.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) 34127.0.0.1:6379> GET "Extreme Pizza""300 Broadway, Washington, DC 20009"
3 工作原理
SET 和GET 可能是Redis 中最常用的命令了。SET 命令的用法非常简单:
SET<key> <value>
如果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) 1127.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"OK127.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 12345OK127.0.0.1:6379> OBJECT ENCODING myKey"int" 127.0.0.1:6379> SET myKey "a string"OK127.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"OK127.0.0.1:6379> OBJECT ENCODING myKey"raw"
作者:博文视点
链接:https://www.jianshu.com/p/00e99f0bfbb1
共同学习,写下你的评论
评论加载中...
作者其他优质文章