计算机网络/计算机科学与应用/系统/运维/开发

Redis 数据类型 String 字符串

Redis 字符串


一个键和单独的一个值关联起来,被关联的键和值既可以是普通的文字数据,也可以是图片、视频、音频、压缩文件等更为复杂的二进制数据


Redis为字符串键提供了一系列操作命令:

为字符串键设置值

获取字符串键的值

在获取旧值的同时为字符串键设置新值

同时为多个字符串键设置值,或者同时获取多个字符串键的值

获取字符串值的长度

获取字符串值指定索引范围内的内容,或者对字符串值指定索引范围内的内容进行修改

将一些内容追加到字符串值的末尾

对字符串键存储的整数值或者浮点数值执行加法操作或减法操作


语法:SET key value 

功能:为字符串键设置值

说明:键和值既可以是文字也可以是二进制数据,成功返回ok 


实例1:创建出一个字符串键,它的键为"number",值为"10086"

127.0.0.1:6379> SET number "10086"
OK


实例2:创建出一个键为"book",值为"The Designand Implementation of Redis"的字符串键

127.0.0.1:6379> SET book "The Design and Implementaion of Redis"
OK


默认情况下,对一个已经设置了值的字符串键执行SET命令将导致键的旧值被新值覆盖。

127.0.0.1:6379> SET song_title "Get Wild"
OK
127.0.0.1:6379> SET song_title "Running to Horizon"
OK
127.0.0.1:6379> GET song_title
"Running to Horizon"


Redis 2.6.12版本开始

用户可以通过向SET命令提供可选的NX选项或者XX选项来指示SET命令是否要覆盖一个已经存在的值

NX 选项表示:

在键没有值的情况下执行设置操作,并返回OK表示设置成功;

如果键已经存在,那么SET命令将放弃执行设置操作,并返回空值nil表示设置失败。


# 对没有值的password 设置值,成功
127.0.0.1:6379> SET password "123456" NX
OK

# 对已经有值的键设置,失败
127.0.0.1:6379> SET password "999999" NX
(nil)


XX选项:

那么SET命令只会在键已经有值的情况下执行设置操作,并返回OK表示设置成功;

如果给定的键并没有值,那么SET命令将放弃执行设置操作,并返回空值表示设置失败。



语法:SET value [NX|XX]

功能:如果用户在执行SET命令时给定了NX选项,那么SET命令只会在键没有值的情况下执行设置操作,并返回OK表示设置成功

说明:如果键已经存在,那么SET命令将放弃执行设置操作,并返回空值nil表示设置失败

实例:

--没有值password键进行设置,成功

127.0.0.1:6379> SET password "123456" NX
OK

-- password键已经有值,设置失败

127.0.0.1:6379> SET password "999999" NX
(nil)


如果用户在执行SET命令时给定了XX选项,那么SET命令只会在键已经有值的情况下执行设置操作,并返回OK表示设置成功;

如果给定的键并没有值,那么SET命令将放弃执行设置操作,并返回空值表示设置失败。


-- 对一个没有值的键mongodb-homepage执行以下SET命令,那么命令将因为XX选项的作用而放弃执行设置操作

127.0.0.1:6379> SET mongodb-homepage "mongodb.com" XX
(nil)


相反,如果我们对一个已经有值的键执行带有XX选项的SET命令,那么命令将使用新值去覆盖已有的旧值:


-- 为键mysql-homepage 设置一个值

127.0.0.1:6379> SET mysql-homepage "mysql.org"
OK

-- 对键的值进行更新

127.0.0.1:6379> SET mysql-homepage "mysql.com" XX
OK

第二条SET命令执行之后,mysql-homepage键的值将从原来的"mysql.org"更新为"mysql.com"


GET:获取字符串键的值

功能:使用GET命令从数据库中获取指定字符串键的值

语法:GET key 

说明:GET命令接受一个字符串键作为参数,然后返回与该键相关联的值

实例:

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"


说明:如果用户给定的字符串键在数据库中并没有与之相关联的值,那么GET命令将返回一个空值

127.0.0.1:6379> GET date
(nil)


Redis的数据库要求所有键必须拥有与之相关联的值,所以如果一个键有值,那么我们就说这个键存在于数据库,反之。


GETSET:获取旧值并设置新值

功能:GETSET命令就像GET命令和SET命令的组合版本,GETSET首先获取字符串键目前已有的值,接着为键设置新值,最后把之前获取到的旧值返回给用户

语法:GETSET key new_value

实例: 

-- number 键现在的值为10086

127.0.0.1:6379> GET number
"10086"


-- 返回旧值

127.0.0.1:6379> GETSET number "12345"
"10086"


-- number键的值已经被更新为12345

127.0.0.1:6379> GET number
"12345"


如果被设置的键并不存在于数据库,那么GETSET命令将返回空值作为键的旧值


-- 键不存在

127.0.0.1:6379> GET counters
(nil)


-- 返回空值作为旧值 

127.0.0.1:6379> GETSET counters 60
(nil)


-- 查看键值

127.0.0.1:6379> GET counters
"60"

MSET 一次为多个字符串键设置值

功能:除了SET命令和GETSET命令之外,Redis还提供了MSET命令用于对字符串键进行设置。

与SET命令和GETSET命令只能设置单个字符串键不同

MSET命令可以一次为多个字符串键设置值

语法: MSET key value [key value ...]

实例: 

127.0.0.1:6379> MSET msg "hello world" num "1000" home "redis"
OK
127.0.0.1:6379> GET msg
"hello world"
127.0.0.1:6379> GET num
"1000"
127.0.0.1:6379> GET home
"redis"

说明:MSET命令也会在执行设置操作之后返回OK表示设置成功 

如果给定的字符串键已经有相关联的值,那么MSET命令也会直接使用新值去覆盖已有的旧值。


执行多条SET命令需要客户端和服务器之间进行多次网络通信,并因此耗费大量的时间;而使用一条MSET命令去代替多条SET命令只需要一次网络通信,从而有效地减少程序执行多个设置操作时的时间。


MGET:一次获取多个字符串键的值

功能:MGET命令就是一个多键版本的GET命令,MGET接受一个或多个字符串键作为参数,并返回这些字符串键的值 

语法:MGET key [key ...]


实例:使用一条MGET命令去获取message、number和homepage这3个键的值

127.0.0.1:6379> MGET message number homepage
1) "hello world"
2) "12345"
3) "redis.io"


--与GET命令一样,MGET命令在碰到不存在的键时也会返回空值

127.0.0.1:6379> MGET not-exists-key
1) (nil)


与MSET命令类似,MGET命令也可以将执行多个获取操作所需的网络通信次数从原来的N次降低至只需一次,从而有效地提高程序的运行效率


MSETNX:只在键不存在的情况下,一次为多个字符串键设置值

语法:MSETNX key value [key value ...]

功能:

MSETNX与MSET的主要区别在于,MSETNX只会在所有给定键都不存在的情况下对键进行设置,

而不会像MSET那样直接覆盖键已有的值:如果在给定键当中,即使有

一个键已经有值了,那么MSETNX命令也会放弃对所有给定键的设置操作。

MSETNX命令在成功执行设置操作时返回1,在放弃执行设置操作时则返回0。


--键k1 k2  k3 都不存在

127.0.0.1:6379> MGET k1 k2 k3 k4
1) (nil)
2) (nil)
3) (nil)
4) "hello world"


-- 键k4存在 所以MSETNX未能设置操作

127.0.0.1:6379> MSETNX ke "one" k2 "two" k3 "three" k4 "four"
(integer) 0


-- 各个键的值没有变化 

127.0.0.1:6379> MGET k1 k2 k3 k4
1) (nil)
2) (nil)
3) (nil)
4) "hello world"


STRLEN:获取字符串值的字节长度

功能:取得字符串键存储的值的字节长度

语法:STRLEN key 

实例:

127.0.0.1:6379> GET number
"12345"

-- number键的值长5字节

127.0.0.1:6379> STRLEN number
(integer) 5
127.0.0.1:6379> GET message
"hello world"


-- message 键的值长11字节

127.0.0.1:6379> STRLEN message
(integer) 11
127.0.0.1:6379> GET book
"The Design and Implementaion of Redis"


-- book键的值长38字节

127.0.0.1:6379> STRLEN book
(integer) 37


对于不存在的键,STRLEN命令将返回0

127.0.0.1:6379> STRLEN not-exists-key
(integer) 0

INCR、DECR :对整数值执行加1操作和减1操作

INCR key 加1

DECR key 减1

127.0.0.1:6379> SET counter 100
OK
127.0.0.1:6379> INCR counter
(integer) 101
127.0.0.1:6379> INCR counter
(integer) 102
127.0.0.1:6379> INCR counter
(integer) 103
127.0.0.1:6379> DECR counter
(integer) 102
127.0.0.1:6379> DECR counter
(integer) 101

INCRBYFLOAT:对数字值执行浮点数加法操作

INCRBYFLOAT命令可以把一个浮点数增量加到字符串键存储的数字值上面,并返回键在执行加法操作之后的数字值作为命令的返回值。

INCRBYFLOAT key increment 


一个存储浮点数值的键

127.0.0.1:6379> SET decimal 3.14
OK
127.0.0.1:6379> GET decimal
"3.14"
将键decimal的值加上2.55
127.0.0.1:6379> INCRBYFLOAT decimal 2.55
"5.69"
127.0.0.1:6379> GET decimal
"5.69"


字符串值的索引

字符串值的正数索引以0为开始,从字符串的开头向结尾不断递增

字符串值的负数索引以-1为开始,从字符串的结尾向开头不断递减


"hello world"的字符串,及其各个字节相对应的正数索引和负数索引

image.png


GETRANGE:获取字符串值指定索引范围上的内容

GETRANGE  key start  end

GETRANGE命令接受的是闭区间索引范围,也就是说,位于start索引和end索引上的值也会被包含在命令返回的内容当中


127.0.0.1:6379> SET message "abcdefghijglmn"
OK
127.0.0.1:6379> GET message
"abcdefghijglmn"

127.0.0.1:6379> GETRANGE message 0 4     # 获取字符串message上0到4的内容 也就是5个值
"abcde"

SETRANGE:对字符串值的指定索引范围进行设置

通过使用SETRANGE命令,用户可以将字符串键的值从索引index开始的部分替换为指定的新内容,被替换内容的长度取决于新内容的长度

SETRANGE  key index substitute

返回字符串值当前的长度作为结果

127.0.0.1:6379> SET message "hello world"
OK
127.0.0.1:6379> GET message
"hello world"
127.0.0.1:6379> SETRANGE message 6 "Redis"
(integer) 11
127.0.0.1:6379> GET message
"hello Redis"
127.0.0.1:6379>


APPEND命令,用户可以将给定的内容追加到字符串键已有值的末尾

APPEND  key suffix

APPEND命令在执行追加操作之后,会返回字符串值当前的长度作为命令的返回值。

127.0.0.1:6379> GET message
"hello Redis"
127.0.0.1:6379> APPEND message "is a daabase"
(integer) 23
127.0.0.1:6379> GET message
"hello Redisis a daabase"
127.0.0.1:6379>


redis 字符串

努力的意义,不在于一定会让你取得多大的成就,只是让你在平凡的日子里,活得比原来的那个自己更好一点。

评论

^