书籍推荐:《Redis使用手册》 作者:黄建宏
String 是最基本的键值对类型,这种类型的键值对会将数据库中的单独的键与单独的值关联起来。被关联的键和值既可以是简单的字符、文字,也可以是图像、视频、音频、压缩文件等二进制数据。
键 | 值 |
---|---|
“message” | “hello word” |
“redis_log.jpg” | “\x8cf\xfug\xjghjhd\xjgjjh\kkxc …” |
redis为字符串键提供了一系列的操作命令,通过这些命令可以:
-
为字符串键设置值
127.0.0.1:6379> SET number "10086" OK
如果用户在执行
SET
命令时,给定NX
选项就意味着
SET
命令在没有值的情况下给键设置值。假如该键有值则SET
将会放弃该操作,并返回一个空值nil
表示设置失败。127.0.0.1:6379> SET number "10086" OK 127.0.0.1:6379> SET number "10010" NX (nil)
如果用户在执行
SET
命令时,给定XX
选项就意味着
SET
命令在有值的情况下给键设置值。假如该键没有值则SET
将会放弃该操作,并返回一个空值nil
表示设置失败。(下例中键number3
无值)127.0.0.1:6379> SET number3 "10010" XX (nil)
对已有值的键
number
执行SET命令:127.0.0.1:6379> SET number "10086" OK 127.0.0.1:6379> SET number "10010" XX OK
注意:
- NX和XX等可选项的SET命令出现在Redis 2.6.12后
- Redis数据库的键的存放方式是无序的,一个新加入的键可以出现在数据库的任何位置上。
- 为已有值的键重新设置值会覆盖原值。
-
获取字符串键的值
用户可以使用
GET
命令获取键的值,GET
命令接收字符串键作为参数,返回字符串键的值。127.0.0.1:6379> GET number "10010"
如果用户给定的键在数据库中并没有与之对应的值,就会返回空值(nil)
127.0.0.1:6379> GET number5 (nil)
注意:
Redis要求所有键都必须有与之对应的值,所以不存在”有键没值“和”没键有值“的情况,只存在”有值有键“的情况。 -
在获取旧值的同时为字符串键设置新值
用户可以使用GETSET命令获取旧值,并为该键设置新值。
127.0.0.1:6379> GET number "10010"、 127.0.0.1:6379> GETSET number "10086" "10010" 127.0.0.1:6379> GET number "10086"
当数据库中并没有与SETGET的键值对时:会返回空(nil)作为旧值,并为改键设置值。
127.0.0.1:6379> GET number5 (nil) 127.0.0.1:6379> GETSET number5 "10011" (nil) 127.0.0.1:6379> GET number5 "10011"
注意:
这意味着这种为键赋值的方式,是先GET再SET
Redis 1.0.0开始使用
-
同时为多个字符串键设置值
使用命令MSET为多个字符串键设置值:
127.0.0.1:6379> MSET message "hello world" number "10086" homepage "redis.io" OK 127.0.0.1:6379> GET message "hello world" 127.0.0.1:6379> GET number "10086" 127.0.0.1:6379> GET homepage "redis.io"
使用命令MSETNX为多个字符串键设置值:
MSETNX key value [key value ...]
MSETNX命令只有在要设置的键在数据库中不存在时才能使用,否则返回0
示例:
127.0.0.1:6379> GET number1000 "10086" -- number1000,"10086" 已经存在于数据库 127.0.0.1:6379> MSETNX number1000 "10010" number1001 "10011" number1002 "10012" (integer) 0 127.0.0.1:6379> GET number1000 "10086" 127.0.0.1:6379> GET number1001 (nil) -- 此时返回0,值并未改变
127.0.0.1:6379> MGET number1001 number1002 number1003 1) (nil) 2) (nil) 3) (nil) -- number1001,number1002,number1003在数据库中不存在 127.0.0.1:6379> MSETNX number1001 "1001" number1002 "1002" number1003 "1003" 127.0.0.1:6379> MGET number1001 number1002 number1003 1) "1001" 2) "1002" 3) "1003" (integer) 1 -- 三个键都没有在数据库中对应相应的值,此时能执行MSETNX命令,成功后返回1
属性 值 复杂度 O(N),其中 N 为用户给定的字符串键数量。 版本要求 MGET
命令从 Redis 1.0.0 开始可用。为什么要使用MSET:
MSET
命令除了可以让用户更为方便地执行多个设置操作之外, 还能够有效地提高程序的效率: 执行多条SET
命令需要客户端和服务器之间进行多次网络通信, 并因此耗费大量的时间; 通过使用一条MSET
命令去代替多条SET
命令, 可以将原本所需的多次网络通信降低为只需一次网络通信, 从而有效地减少程序执行多个设置操作时所需的时间。 -
同时获取多个字符串键的值
MGET
命令就是一个多键版本的GET
命令, 它接受一个或多个字符串键作为参数, 并返回这些字符串键的值:MGET key [key ...]
MGET
命令返回一个列表作为结果, 这个列表按照用户执行命令时给定键的顺序排列各个键的值: 比如说, 列表的第一个元素就是第一个给定键的值, 而列表的第二个元素则是第二个给定键的值, 以此类推。作为例子, 以下代码展示了如何使用一条
MGET
命令去获取message
、number
和homepage
三个键的值:127.0.0.1:6379> MGET message number homepage 1) "hello world" 2) "10086" 3) "redis.io"
碰到空值也会返回空:
127.0.0.1:6379> MGET message number homepage 1) (nil) 2) "10086" 3) "redis.io"
为什么要使用MGET命令:
跟
MSET
命令类似,MGET
命令也可以将执行多个获取操作所需的网络通信次数从原来的 N 次降低至只需一次, 从而有效地提高程序的运行效率。属性 值 复杂度 O(N),其中 N 为用户给定的字符串键数量。 版本要求 MGET
命令从 Redis 1.0.0 开始可用。 -
获取字符串值的长度
通过对字符串键执行
STRLEN
命令, 用户可以取得字符串键储存的值的字节长度:STRLEN key
示例:
127.0.0.1:6379> STRLEN number (integer) 5 127.0.0.1:6379> GET number "10086"
属性 值 复杂度 O(1) 版本要求 STRLEN
命令从 Redis 2.2.0 开始可用。 -
获取字符串指定索引范围内的值
通过使用
GETRANGE
命令, 用户可以获取字符串值从start
索引开始, 直到end
索引为止的所有内容:GETRANGE key start end
示例:
127.0.0.1:6379> GET number "10086" 127.0.0.1:6379> GETRANGE number 1 4 "0086"
注意:
GETRANGE
命令接受的是闭区间索引范围, 也即是说, 位于start
索引和end
索引上的值也会被包含在命令返回的内容当中。举个例子, 以下代码展示了如何使用
GETRANGE
命令去获取message
键的值的不同部分:redis> GETRANGE message 0 4 -- 获取字符串值索引 0 至索引 4 上的内容 "hello" redis> GETRANGE message 6 10 -- 获取字符串值索引 6 至索引 10 上的内容 "world" redis> GETRANGE message 3 7 -- 获取字符串值的中间部分 "lo wo" redis> GETRANGE message -11 -7 -- 使用负数索引获取指定内容 "hello"
下图展示了上面的这四个命令是如何根据索引去获取值的内容的:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UsjZ4bAB-1623837117777)(http://redisguide.com/_images/IMAGE_GETRANGE_1.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1yq5nYH8-1623837117786)(http://redisguide.com/_images/IMAGE_GETRANGE_3.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1xjrqMQ5-1623837117793)(http://redisguide.com/_images/IMAGE_GETRANGE_4.png)]
其他信息
属性 值 复杂度 O(N),其中 N 为被返回内容的长度。 版本要求 GETRANGE
命令从 Redis 2.4.0 开始可用。 -
指定索引范围内的内容进行修改
通过使用
SETRANGE
命令, 用户可以将字符串键的值从索引index
开始的部分替换为指定的新内容, 被替换内容的长度取决于新内容的长度:SETRANGE key index substitute
SETRANGE
命令在执行完设置操作之后, 会返回字符串值当前的长度作为结果。比如说, 我们可以通过执行以下命令, 将
message
键的值从原来的"hello world"
修改为"hello Redis"
:redis> GET message "hello world" redis> SETRANGE message 6 "Redis" (integer) 11 -- 字符串值当前的长度为 11 字节 redis> GET message "hello Redis"
这个例子中的
SETRANGE
命令会将message
键的值从索引 6 开始的内容替换为"Redis"
, 图 2-7 展示了这个命令的执行过程。
图 2-7
SETRANGE
命令修改message
键的过程[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qYFgEzoY-1623837117796)(http://redisguide.com/_images/IMAGE_SETRANGE_MESSAGE_1.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sCTqBjvH-1623837117799)(http://redisguide.com/_images/IMAGE_SETRANGE_MESSAGE_3.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IEJ1Be0t-1623837117800)(http://redisguide.com/_images/IMAGE_SETRANGE_MESSAGE_4.png)]
自动扩展被修改的字符串
当用户给定的新内容比被替换的内容更长时,
SETRANGE
命令就会自动扩展被修改的字符串值, 从而确保新内容可以顺利写入。比如说, 以下代码就展示了如何通过
SETRANGE
命令, 将message
键的值从原来的 11 字节长修改为 41 字节长:redis> GET message "hello Redis" redis> SETRANGE message 5 ", this is a message send from peter." (integer) 41 redis> GET message "hello, this is a message send from peter."
图 2-8 展示了这个
SETRANGE
命令扩展字符串并进行写入的过程。
图 2-8
SETRANGE
命令的执行过程示例SETRANGE 命令执行之前的字符串值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qWMwPujP-1623837117804)(http://redisguide.com/_images/IMAGE_EXPAND_SETRANGE_1.png)]
将字符串值扩展至 41 字节长
对字符串值进行设置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VWmKZujX-1623837117807)(http://redisguide.com/_images/IMAGE_EXPAND_SETRANGE_3.png)]
在值里面填充空字节
SETRANGE
命令除了会根据用户给定的新内容自动扩展字符串值之外, 还会根据用户给定的index
索引扩展字符串: 当用户给定的index
索引超出字符串值的长度时, 字符串值末尾直到索引index-1
之间的部分将使用空字节进行填充, 换句话说, 这些字节的所有二进制位都会被设置为0
。举个例子, 对于字符串键
greeting
来说:redis> GET greeting "hello"
当我们执行以下命令时:
redis> SETRANGE greeting 10 "world" (integer) 15
SETRANGE
命令会先将字符串值扩展为15
个字节长, 然后将"hello"
末尾直到索引9
之间的所有字节都填充为空字节, 最后再将索引10
到索引14
的内容设置为"world"
。 图 2-9 展示了这个扩展、填充、最后设置的过程。
图 2-9
SETRANGE greeting 10 "world"
的执行过程执行 SETRANGE 之前的字符串值
将字符串值从 5 个字节扩展至 15 个字节
使用空字节填充索引 5 至索引 9
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-webTvgeB-1623837117810)(http://redisguide.com/_images/IMAGE_FILLED_SETRANGE_3.png)]
将索引 10 至索引 14 的内容设置为 “world”
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oFz1dggg-1623837117811)(http://redisguide.com/_images/IMAGE_FILLED_SETRANGE_4.png)]
通过执行
GET
命令, 我们可以取得greeting
键在执行SETRANGE
命令之后的值:redis> GET greeting "hello\x00\x00\x00\x00\x00world"
可以看到,
greeting
键的值现在包含了多个\x00
符号, 而每个\x00
符号就代表一个空字节。其他信息
属性 值 复杂度 O(N),其中 N 为被修改内容的长度。 版本要求 SETRANGE
命令从 Redis 2.2.0 开始可用。 -
将一些内容尾加到指定字符串键的值后
通过调用
APPEND
命令, 用户可以将给定的内容追加到字符串键已有值的末尾:APPEND key suffix
APPEND
命令在执行追加操作之后, 会返回字符串值当前的长度作为返回值。示例:
127.0.0.1:6379> GET number "10086" 127.0.0.1:6379> APPEND number " shi yi dong ke fu dian hua" (integer) 32 127.0.0.1:6379> GET number "10086 shi yi dong ke fu dian hua"
假如该键不存在,会先将该键设置为空再尾加:
127.0.0.1:6379> GET number1004 (nil) 127.0.0.1:6379> APPEND number1004 "1004" (integer) 4 127.0.0.1:6379> GET number 1004 (error) ERR wrong number of arguments for 'get' command 127.0.0.1:6379> GET number1004 "1004"
属性 值 复杂度 O(N),其中 N 为新追加内容的长度。 版本要求 APPEND
命令从 Redis 2.0.0 开始可用。 -
对字符串存储的整数或浮点数执行加法或减法操作
如果值能被解释为以下两种类型就能被解析为数字:
-
一种是能够使用 C 语言的
long long int
类型储存的整数, 在大多数系统中, 这种类型储存的都是 64 位长度的有符号整数, 取值范围介于-9223372036854775808
和9223372036854775807
之间; -
第二种是能够使用 C 语言的
long double
类型储存的浮点数, 在大多数系统中, 这种类型储存的都是 128 位长度的有符号浮点数, 取值范围介于3.36210314311209350626e-4932
和1.18973149535723176502e+4932L
之间。
对整数进行加减法:
加法:
INCRBY key value
加法加一:
INCR key
减法:
xxxxxxxxxx x DECRBY key value
减法减一:
x DECR key
示例:
127.0.0.1:6379> GET number "10010" -- 加法 127.0.0.1:6379> INCRBY number 1000 (integer) 11010 127.0.0.1:6379> GET number "11010" -- 减法 127.0.0.1:6379> DECRBY number 1000 (integer) 10010 127.0.0.1:6379> GET number "10010" -- 加一 127.0.0.1:6379> INCR number (integer) 10011 -- 减一 127.0.0.1:6379> DECR number (integer) 10010
注意:
当键在数据库中并不存在时,会将该键默认为0后再执行整数的加减法。浮点数加减法:
INCRBYFLOAT key increment
浮点加:
redis> SET decimal 3.14 -- 一个储存着浮点数值的键 OK redis> GET decimal "3.14" redis> INCRBYFLOAT decimal 2.55 -- 将键 decimal 的值加上 2.55 "5.69" redis> GET decimal "5.69"
浮点减:
redis> SET decimal 3.14 -- 一个储存着浮点数值的键 OK redis> GET decimal "3.14" redis> INCRBYFLOAT decimal -1.00 -- 将键 decimal 的值加上 2.55 "2.14" redis> GET decimal "2.14"
注意:当键不存在时:默认为0再加减
-