Redis学习笔记(三):字符串数据类型详解

5. Redis数据类型

Redis支持字符串(string)、列表(list)、哈希(hash)、集合(set)及有序集合(sorted set) 5 种数据类型。

5.1 字符串(string)

5.1.1 SET / SETEX / PSETEX / SETNX
  • SET
    SET命令为指定名称的键设置字符串类型的值,若键已存在则覆盖旧值(未指定特定参数的情况下)。
    SET key value [EX seconds|PX milliseconds] [NX|XX] [KEEPTTL]
  • 可选参数
    SET命令有EXPXNXXX以及KEEPTTL五个可选参数,其中KEEPTTL为6.0版本添加的可选参数,其它为2.6.12版本添加的可选参数。
    EX seconds 以秒为单位设置过期时间
    PX milliseconds 以毫秒为单位设置过期时间
    NX 键不存在的时候设置键值
    XX 键存在的时候设置键值
    KEEPTTL 保留设置前指定键的生存时间
    SET命令使用EXPXNX参数,其效果等同于SETEXPSETEXSETNX命令。根据官方文档的描述,未来版本中SETEXPSETEXSETNX命令可能会被淘汰。
  • 返回值
    设置成功则返回OK;返回nil为未执行SET命令,如不满足NXXX条件等。
  • 示例
# 设置k1的值为v1
127.0.0.1:6379>  SET k1 v1
OK
# 获取k1的值
127.0.0.1:6379> GET k1
"v1"
# 当键k1不存在时,设置k1的值为v2
127.0.0.1:6379> SET k1 v2 NX
(nil)
# 因为使用了NX参数,更新失败,返回v1
127.0.0.1:6379> GET k1
"v1"
# 在k2不存在的条件下,设置k2的值为v2,过期时间为5s
127.0.0.1:6379> SET k2 v2 EX 5 NX
OK
# 5s内获取k2的值,返回v2
127.0.0.1:6379> GET k2
"v2"
# 5s后获取k2的值,返回nil
127.0.0.1:6379> GET k2
(nil)
  • SETEX
    SETEX命令为指定名称的键设置值,并以秒为单位设置其生存时间。
    SETEX key seconds value
    SETEX命令效果等同于使用SET key valueEXPIRE key seconds命令,以及SET key value EX seconds命令。SETEX命令具备原子性,它等同于在MULTI/EXEC块中使用SET以及EXPIRE命令。
  • 示例
# 设置k1的过期时间为5s
127.0.0.1:6379> SETEX k1 5 v1
OK
# 等同于
127.0.0.1:6379> SET k1 v1 EX 5
OK
# 等同于
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET k1 v1
QUEUED
127.0.0.1:6379> EXPIRE k1 5
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) (integer) 1
  • PSETEX
    PSETEX命令与SETEX命令相似,二者区别为PSETEX设置的生存时间以毫秒作为单位。
    PSETEX key milliseconds value
  • 示例
# 设置k2的过期时间为5000ms
127.0.0.1:6379> PSETEX k2 5000 v2
OK
127.0.0.1:6379> GET k2
"v2"
127.0.0.1:6379> GET k2
"v2"
127.0.0.1:6379> GET k2
(nil)
  • SETNX
    当指定名称的键不存在时设置字符串值,否则不执行操作。其效果等同于在键不存在时直接使用SET命令,或是在任意情况下使用NX参数。
    SETNX key value
  • 返回值
    当成功设置键值时返回1,否则返回0(即键已存在的情况下)。
  • 示例
# 当k1不存在时,设置值为v1,返回1,表示设置成功
127.0.0.1:6379> SETNX k1 v1
(integer) 1
# 此时k1已存在,因此返回 0
127.0.0.1:6379> SETNX k1 v2
(integer) 0
127.0.0.1:6379> GET k1
"v1"
# 等同于
127.0.0.1:6379> SET k1 v2 NX
(nil)
127.0.0.1:6379> GET k1
"v1"
5.1.2 GET
  • GET
    GET命令为获取指定名称键的键值。
    GET key
  • 返回值
    当键存在且值为字符串时返回对应的值;
    当键不存在时返回nil
    当键值不为字符串时返回错误。
  • 示例
# 设置k1的值为v1
127.0.0.1:6379>  SET k1 v1
OK
# 获取k1的值,返回v1
127.0.0.1:6379> GET k1
"v1"
# 获取k2的值,返回nil
127.0.0.1:6379> GET k2
(nil)
5.1.3 GETSET
  • GETSET
    GETSET命令用于设置键值对的值并返回旧值。
  • 返回值
    若键值对存在则返回旧值;
    若键值对不存在则返回nil
    若键存在但不为字符串类型,则返回错误。
  • 示例
# 清空数据库中的所有key
127.0.0.1:6379> FLUSHALL
OK
# 设置k1的值为v2,由于k1不存在,因此返回nil
127.0.0.1:6379> GETSET k1 v2
(nil)
# 设置k1的值为v1
127.0.0.1:6379> SET k1 v1
OK
# 获取k1的值,返回v1
127.0.0.1:6379> GET k1
"v1"
# 设置k1的值为v2,并返回旧值v1
127.0.0.1:6379> GETSET k1 v2
"v1"
# 获取k1的新值,返回v2
127.0.0.1:6379> GET k1
"v2"
5.1.4 MSET/MGET/MSETNX
  • MSET
    MSET命令用于设置一个或多个键值对,该命令永远返回OKMSETSET命令相同,都会替代存在的键的值。
    MSET key value [key value ...]
    MSET命令具有原子性,所有的键都会一起被设置。其不存在一部分键值被更新,另一部分仍为旧值的情况。
  • MGET
    MGET用于获取所有指定的键值。当某个键不存在时,将返回一个特殊的值nil。
    MGET key [key ...]
  • MSETNX
    MSETNX命令用于设置一个或多个键值对,仅当所有键都不存在时才会执行。同样,MSETNX也具备原子性,所有的键会被一起被设置。
    MSETNX key value [key value ...]
  • 返回值
    当所有的键被设置,则返回1
    当所有的键都没有被设置,即至少一个键已存在的情况,则返回0
  • 示例
127.0.0.1:6379> FLUSHALL
# 批量设置k1 k2 k3的值,返回OK
127.0.0.1:6379> MSET k1 v1 k2 v2 k3 v3
OK
# 批量获取k1 k2 k3 的值,返回 v1 v2 v3
127.0.0.1:6379> MGET k1 k2 k3
1) "v1"
2) "v2"
3) "v3"
# 修改k1的值为v2,但由于k1存在,导致此次设置的键全部失败,返回 0 
127.0.0.1:6379> MSETNX k1 v2 k4 v4 k5 v5
(integer) 0
# k4 k5 并未成功设置,因此返回 nil
127.0.0.1:6379> MGET k1 k2 k3 k4 k5
1) "v1"
2) "v2"
3) "v3"
4) (nil)
5) (nil)
5.1.5 GETRANGE / SETRANGE
  • GETRANGE
    GETRANGE命令的作用为获取字符串值中由startend参数指定范围的子串(包含startend位置的字符)。当偏移值为负数时,指相对于字符串结尾的偏移量。例如当值为redis时,偏移量-1指的是最后一个字符s,偏移量-2指的是倒数第二个字符i
    当偏移量超出字符串的长度时,将会忽略超出的部分。例如值为redis时,获取偏移量从0到10的子串,仍将只返回redis
    GETRANGE key start end
    GETRANGE命令在Redis 2.4.0中被添加,用于替代2.0之前版本中的SUBSTR命令。

  • 示例

127.0.0.1:6379> SET k1 helloworld
OK
# 获取k1值的第0位到最后一位
127.0.0.1:6379> GETRANGE k1 0 -1
"helloworld"
# 获取k1值的第2位到倒数第2位
127.0.0.1:6379> GETRANGE k1 2 -2
"lloworl"
# 当偏移量超出字符串长度时,返回原始字符串
127.0.0.1:6379> GETRANGE k1 0 100
"helloworld"
# 当偏移量错误时,返回为空
127.0.0.1:6379> GETRANGE k1 -2 2
""
  • SETRANGE
    SETRANGE命令用于覆盖字符串中从偏移量开始的子串,并返回修改后的字符串长度。若偏移量大于原字符串的长度,将使用0值(数值0,非字符0)填充。
    SETRANGE key offset value
    由于Redis中字符串的最大长度为512 MB(229),所以偏移量的最大值为`536870911`(229 - 1)。

  • 示例

127.0.0.1:6379> SETRANGE k1 5 WORLD
(integer) 10
127.0.0.1:6379> GET k1
"helloWORLD"
5.1.6 INCR / INCRBY / DECR / DECRBY / INCRBYFLOAT

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

  • INCR / INCRBY
    INCR命令的作用为将字符串对应的整数值递增1,并返回递增后的整型值。在执行该命令前,若键不存在,则将自动创建并设置其值为0。
    INCR key
    INCRBY命令与INCR类似,二者区别为INCRBY命令可指定递增的值,且该值可为在可表示范围内的任意整数值。
    INCRBY key increment
  • 示例
# 设置k1的值为1
127.0.0.1:6379> SET k1 1
OK
# 将k1的值增加1
127.0.0.1:6379> INCR k1
(integer) 2
# 将k1的值增加1
127.0.0.1:6379> INCR k1
(integer) 3
# 将k1的值增加3
127.0.0.1:6379> INCRBY k1 3
(integer) 6
# 设置k2的值为v2,无法解析为整数,报错
127.0.0.1:6379> SET k2 v2
OK
127.0.0.1:6379> INCR k2
(error) ERR value is not an integer or out of range
# 设置k3的值为9223372036854775806
127.0.0.1:6379> SET k3 9223372036854775806
OK
# 将k3的值加1
127.0.0.1:6379> INCR k3
(integer) 9223372036854775807
# 将k3的值再加1,溢出,报错
127.0.0.1:6379> INCR k3
(error) ERR increment or decrement would overflow
  • DECR / DECRBY
    DECRDECRBY命令的作用以及使用方法与上一节中的INCRINCRBY相似,区别为这两个命令做的是递减的操作。同样,DECRDECRBY命令也受64位有符号整数范围的限制。
    DECR key
    DECRBY key decrement
    INCRBY的递增值以及DECRBY的递减值都可为负数,所以二者的也可被相互替代。例如INCRBY key 1等价于DECRBY key -1

  • 示例

# 将k1的值减1,返回5
127.0.0.1:6379> DECR k1 
(integer) 5
# 将k1的值减1,返回4
127.0.0.1:6379> DECR k1 
(integer) 4
# 将k1的值减3,返回1
127.0.0.1:6379> DECRBY k1 3
(integer) 1
# 将k1的值加2
127.0.0.1:6379> DECRBY k1 -2
(integer) 3
  • INCRBYFLOAT
    INCRBYFLOAT与上述四个命令有较为明显的区别,它会将字符串解析为双精度浮点数(double类型),且递增的值接受浮点数。同样,若键不存在则会将其值设置为0,若键值对不为字符串类型或无法解析为双精度浮点数则会返回错误。
    INCRBYFLOAT命令执行后会将计算得到的结果保存至键值对中并返回对应的值,返回的值为字符串值而非上述命令一样的整型值。
    INCRBYFLOAT key increment
    使用INCRBYFLOAT命令时,原字符串的值及递增的值都可包含指数,但在计算后将被保存为小数的形式。在计算后,小数点后多余的0将被删除。浮点数的计算会存在精度的问题,计算的结果最多只保留小数点后的17位。

  • 示例

127.0.0.1:6379> SET k4 100
OK
127.0.0.1:6379> INCRBYFLOAT k4 50.5
"150.5"
127.0.0.1:6379> INCRBYFLOAT k4 100.3
"250.8"

# 当值为指数时,使用INCRBYFLOAT命令后将被转换为小数的形式:
127.0.0.1:6379> SET k5 314e-2
OK
127.0.0.1:6379> INCRBYFLOAT k5 0.0
"3.14"
127.0.0.1:6379> GET k5
"3.14"
5.1.7 APPEND
  • APPEND
    APPEND命令的作用为当指定键存在且为字符串类型时,将指定的值拼接到现有值的最后。若指定键不存在时,其作用类似于使用SET命令,即创建一个空串并拼接参数指定的字符串。
    APPEND key value

  • 示例

127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> SET k1 hello
OK
127.0.0.1:6379> APPEND k1  world
(integer) 10
127.0.0.1:6379> GET k1
"helloworld"
5.1.8 STRALGO
  • STRALGO
    STRALGO命令是6.0版本新增加的命令,用于执行一些复杂的字符串操作算法。
    在当前最新版本中(6.0.5),仅支持了LCS算法(longest common substring,最长公共子串),其使用方式为:
    STRALGO LCS [KEYS ...] [STRINGS ...] [LEN] [IDX] [MINMATCHLEN <len>] [WITHMATCHLEN]

  • 示例

127.0.0.1:6379> STRALGO LCS STRINGS  helloworld helloredis
"hellord"
5.1.9 SETBIT / BITCOUNT / BITOP / BITOPS / BITFIELD
  • SETBIT
    SETBIT命令用于设置指定偏移位的二进制值,设置的值必须为0或1。
    SETBIT key offset value
    使用SETBIT命令时,偏移量的值必须大于等于0,且小于4294967296(2^32)。若偏移量大于原字符串的长度,则该字符串将增长至能存放偏移量的长度,增长的部分将使用0填充。

  • GETBIT
    GETBIT命令用于返回指定指定偏移量的二进制值。
    GETBIT key offset
    使用GETBIT命令时若指定的偏移量大于字符串的长度,将认定超出的部分为连续的0。当键值对不存在时,将认定其为一个空白的字符串,即偏移量大于字符串的长度。与SETBIT命令不同的是,偏移量超出字符串时不会使字符串增长。

  • BITCOUNT
    BITCOUNT命令用于获取指定范围内字符串中二进制值为1的位数。默认情况下计数范围为整个字符串,另外也可手动指定计数开始和结束的位置。不同于上文中介绍的SETBIT以及GETBIT命令,BITCOUNT参数中的偏移量单位为字节而非位。
    BITCOUNT key [start end]
    与前文中介绍过的GETRANGE命令相似,也可以使用负数表示相对于字符串末尾的位置。

  • 示例

127.0.0.1:6379> SETBIT k1 1 1
(integer) 0
12
QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空