字符串(string)键是Redis最基本的键值对类型,这种类型的键值对会在数据库中把单独的一个键和单独的一个值关联起来,被关联的键和值既可以是普通的文字数据,也可以是图片、视频、音频、压缩文件等更为复杂的二进制数据。需要注意的是通常情况下我们很少把多媒体文件存储在Redis中。
Redis为字符串键提供了一系列操作命令,通过使用这些命令,用户可以:
- 为字符串键设置值。
- 获取字符串键的值。
- 在获取旧值的同时为字符串键设置新值。
- 同时为多个字符串键设置值,或者同时获取多个字符串键的值。
- 获取字符串值的长度。
- 获取字符串值指定索引范围内的内容,或者对字符串值指定索引范围内的内容进行修改。
- 将一些内容追加到字符串值的末尾。
- 对字符串键存储的整数值或者浮点数值执行加法操作或减法操作。
- 接下来将对以上提到的字符串键命令进行介绍,并演示如何使用这些命令去解决各种实际问题。
set:为字符串键设置值
创建字符串键最常用的方法就是使用SET命令,这个命令可以为一个字符串键设置相应的值。在最基本的情况下,用户只需要向SET命令提供一个键和一个值就可以了:
SET key value
注意:Redis命令不需求大小写,但是键值对区分大小写
与之前提到过的一样,这里的键和值既可以是文字也可以是二进制数据。SET命令在成功创建字符串键之后将返回OK作为结果。比如通过执行以下命令,我们可以创建出一个字符串键,它的键为"number",值为"10086":
redis> SET number "10086"
OK
再比如,通过执行以下命令,我们可以创建出一个键为"book",值为"The Design and Implementation of Redis"的字符串键:
redis> SET book "The Design and Implementation of Redis"
OK
在默认情况下,对一个已经设置了值的字符串键执行SET命令将导致键的旧值被新值覆盖。举个例子,如果我们连续执行以下两条SET命令,那么第一条SET命令设置的值将被第二条SET命令设置的值所覆盖:
redis> SET user "admin"
OK
reids> SET user "Jack"
OK
在第二条SET命令执行完毕之后,user键的值将从原来的"admin"变为"Jack"。
从Redis 2.6.12版本开始,用户可以通过向SET命令提供可选的NX选项或者XX选项来指示SET命令是否要覆盖一个已经存在的值:
SET key value [NX/XX]
如果用户在执行SET命令时给定了NX选项,那么SET命令只会在键没有值的情况下执行设置操作,并返回OK表示设置成功;如果键已经存在,那么SET命令将放弃执行设置操作,并返回空值nil表示设置失败。
以下代码展示了带有NX选项的SET命令的行为:
redis> SET password "123456" NX
OK -- 对尚未有值的password键进行设置,成功
redis> SET password "999999" NX
(nil) -- password键已经有了值,设置失败
因为第二条SET命令没有改变password键的值,所以password键的值仍然是刚开始时设置的"123456"。
如果用户在执行SET命令时给定了XX选项,那么SET命令只会在键已经有值的情况下执行设置操作,并返回OK表示设置成功;如果给定的键并没有值,那么SET命令将放弃执行设置操作,并返回空值表示设置失败。
如果我们对一个没有值的键mongodb-homepage执行以下SET命令,那么命令将因为XX选项的作用而放弃执行设置操作:
redis> SET mongodb-homepage "mongodb.com" XX
(nil)
相反,如果我们对一个已经有值的键执行带有XX选项的SET命令,那么命令将使用新值去覆盖已有的旧值:
redis> SET mysql-homepage "mysql.org"
OK -- 为键mysql-homepage设置一个值
redis> SET mysql-homepage "mysql.com" XX
OK -- 对键的值进行更新
在第二条SET命令执行之后,mysql-homepage键的值将从原来的"mysql.org"更新为"mysql.com"。
GET:获取字符串键的值
用户可以使用GET命令从数据库中获取指定字符串键的值:
GET KEY
GET命令接受一个字符串键作为参数,然后返回与该键相关联的值。以上一小节中的数据为例:
redis>GET number
“10086”
redis>GET password
"123456"
另外,如果用户给定的字符串键在数据库中并没有与之相关联的值,那么GET命令将返回一个空值:
redis>get name
(nil)
上面这个GET命令的执行结果表示数据库中并不存在date键,也没有与之相关联的值。
因为Redis的数据库要求所有键必须拥有与之相关联的值,所以如果一个键有值,那么我们就说这个键存在于数据库;相反,如果一个键没有值,那么我们就说这个键不存在于数据库。