前文中我们介绍了Redis中对于字符串类型的键值对进行诸如设置、获取、删除等操作的命令。在本文中,我们将继续介绍Redis中字符串类型的相关命令,主要为对该类型键值对值的操作。

STRLEN

STRLEN命令被用于获取指定字符串类型键值对值的长度。当键值对不存在时将返回0,若键值对值类型不为字符串时,将返回错误。

STRLEN key

示例

redis> STRLEN greeting
(integer) 0
redis> SET greeting "hello redis"
OK
redis> STRLEN greeting
(integer) 11
# 当键值对不为字符串时
redis> LPUSH students "John Doe" "Jane Doe"
(integer) 2
redis> STRLEN students
(error) WRONGTYPE Operation against a key holding the wrong kind of value

GETRANGE

GETRANGE命令的作用为获取字符串值中由startend参数指定范围的子串(包含startend位置的字符)。当偏移值为负数时,指相对于字符串结尾的偏移量。例如当值为redis时,偏移量-1指的是最后一个字符s,偏移量-2指的是倒数第二个字符i

当偏移量超出字符串的长度时,将会忽略超出的部分。例如值为redis时,获取偏移量从010的子串,仍将只返回redis

GETRANGE key start end

GETRANGE命令在Redis 2.4.0中被添加,用于替代2.0之前版本中的SUBSTR命令。

示例

redis> SET greeting "hello"
OK
redis> GETRANGE greeting 0 4
"hello"
redis> GETRANGE greeting 0 -1
"hello redis"
redis> GETRANGE greeting -5 -1
"redis"
# 当偏移量超出字符串长度时
redis> GETRANGE greeting 0 20
"hello redis"
# 当偏移量错误时
redis> GETRANGE greeting 8 3
""

SETRANGE

SETRANGE命令用于覆盖字符串中从偏移量开始的子串,并返回修改后的字符串长度。若偏移量大于原字符串的长度,将使用0值(数值0,非字符0)填充。

SETRANGE key offset value

由于Redis中字符串的最大长度为512 MB(2^29),所以偏移量的最大值为536870911(2^29 - 1)。

示例

redis> SET greeting "hexxo guys"
OK
redis> SETRANGE greeting 6 "redis"
(integer) 11
redis> GET greeting
"hexxo redis"
# 只修改部分字符
redis> SETRANGE greeting 2 "ll"
(integer) 11
redis> GET greeting
"hello world"
# 偏移量大于原字符串长度
redis> SETRANGE name 5 "John Doe"
(integer) 13
redis> GET name
"\x00\x00\x00\x00\x00John Doe"

APPEND

APPEND命令的作用为当指定键存在且为字符串类型时,将指定的值拼接到现有值的最后。若指定键不存在时,其作用类似于使用SET命令,即创建一个空串并拼接参数指定的字符串。

APPEND key value

示例

redis> EXISTS greeting
(integer) 0
redis> APPEND greeting "hello"
(integer) 5
redis> APPEND greeting " world"
(integer) 11
redis> GET greeting
"hello world"

EXISTS

APPEND命令的示例中我们提到了一个EXISTS命令,该命令用于获取指定键中存在的数量。若指定的键存在,则该命令执行后将返回1,否则返回0。从Redis 3.0.3开始EXISTS命令支持获取多个键存在的数量。

EXISTS命令和前文中的DEL等命令一样,不仅限于字符串类型的键值对。

EXISTS key [key ...]

若参数中有重复的键,也将会被多次计数。例如下面示例中,使用EXISTS key1 key1 key2命令,参数中指定的两个key1也将被重复计数,其返回结果为3。

示例

redis> MSET key1 "value1" key2 "value2"
OK
redis> EXISTS key1
(integer) 1
redis> EXISTS key3
(integer) 0
redis> EXISTS key1 key2 key3
(integer) 2
# 重复的键名也会多次计数
redis> EXISTS key1 key1 key2
(integer) 3

INCR / INCRBY

当字符串的值可表示为一个数值时,可使用INCRINCRBYDECRDECRBY以及INCRBYFLOAT命令进行递增或递减的操作。

Redis中并不存在专门的整数类型,它们将以字符串的形式被储存,所以我们上面提到的几个命令也都是字符串的操作命令。在执行这些命令前,Redis会将对应的字符串解析为对应的64位有符号整数。若键值不为字符串或字符串无法被解析为指定范围的整数,将会返回错误。同样,执行操作得到的结果也必须为在64为有符号整数所内表示的范围内。

INCR命令的作用为将字符串对应的整数值递增1,并返回递增后的整型值。在执行该命令前,若键不存在,则将自动创建并设置其值为0。

INCR key

INCRBY命令与INCR类似,二者区别为INCRBY命令可指定递增的值,且该值可为在可表示范围内的任意整数值。

INCRBY key increment

示例

redis> INCR count
(integer) 1
redis> GET count
"1"
redis> INCRBY count 2
(integer) 3
redis> INCRBY count -1
(integer) 2

当字符串的值不为整数值或超出范围时,将返回错误:

# 非整数值
redis> SET greeting "hello"
OK
redis> INCR greeting
(error) ERR value is not an integer or out of range
# 超出范围
redis> SET count 9223372036854775806
OK
redis> INCR count
(integer) 9223372036854775807
redis> INCR count
(error) ERR value is not an integer or out of range

DECR / DECRBY

DECRDECRBY命令的作用以及使用方法与上一节中的INCRINCRBY相似,区别为这两个命令做的是递减的操作。同样,DECRDECRBY命令也受64位有符号整数范围的限制。

DECR key
DECRBY key decrement

INCRBY的递增值以及DECRBY的递减值都可为负数,所以二者的也可被相互替代。例如INCRBY key 1等价于DECRBY key -1

示例

redis> DECR count
(integer) -1
redis> GET count
"-1"
redis> DECRBY count 2
(integer) -3
redis> DECRBY count -1
(integer) -2

INCRBYFLOAT

INCRBYFLOAT与上述四个命令有较为明显的区别,它会将字符串解析为双精度浮点数(double类型),且递增的值接受浮点数。同样,若键不存在则会将其值设置为0,若键值对不为字符串类型或无法解析为双精度浮点数则会返回错误。

INCRBYFLOAT命令执行后会将计算得到的结果保存至键值对中并返回对应的值,返回的值为字符串值而非上述命令一样的整型值。

INCRBYFLOAT key increment

使用INCRBYFLOAT命令时,原字符串的值及递增的值都可包含指数,但在计算后将被保存为小数的形式。在计算后,小数点后多余的0将被删除。浮点数的计算会存在精度的问题,计算的结果最多只保留小数点后的17位。

示例

redis> SET balance 1000
OK
redis> INCRBYFLOAT balance 50.5
"1050.5"
redis> INCRBYFLOAT balance -100.5
"950"

当值为指数时,使用INCRBYFLOAT命令后将被转换为小数的形式:

redis> SET pi 314e-2
OK
redis> INCRBYFLOAT pi 0.0
"3.14"
redis> GET pi
"3.14"

结束语

上文中为大家介绍了Redis中对字符串类型的值进行操作的一些命令,接下来的文章中将会继续为大家介绍位操作的命令以及Redis中其它类型的命令。

参考文献