Redis 字符串操作实战(全)

目录

[SET 存入键值对](#SET 存入键值对)

SETNX

SETEX

SETBIT

SETRANGE

[MSET 批量存入键值对](#MSET 批量存入键值对)

MSETNX

PSETEX

[BITCOUNT 计算值中1的数量](#BITCOUNT 计算值中1的数量)

[BITOP 与或非异或操作](#BITOP 与或非异或操作)

[DECR 减1](#DECR 减1)

DECRBY

[APPEND 追加](#APPEND 追加)

[INCR 自增](#INCR 自增)

INCRBY

INCRBYFLOAT

[GET 取值](#GET 取值)

GETBIT

GETRANGE

[GETSET 取旧值赋新值](#GETSET 取旧值赋新值)

[MGET 批量取值](#MGET 批量取值)

[STRLEN 计算值的长度](#STRLEN 计算值的长度)


SET 存入键值对

SET key value [EX seconds | PX milliseconds | EXAT timestamp | PXAT milliseconds-timestamp | KEEPTTL ] [NX|XX]

  • EX seconds: 设置键的过期时间为 second 秒。 SET key value EX second 效果等同于 SETEX key second value
  • PX milliseconds : 设置键的过期时间为 millisecond 毫秒。 SET key value PX millisecond 效果等同于 PSETEXkey millisecond value
  • EXAT timestamp:指定过期时间为Unix时间,单位是秒
  • PXAT milliseconds-timestamp:指定过期时间为Unix时间,单位是毫秒
  • KEETTTL:保存ttl时间
  • NX : 只在键不存在时,才对键进行设置操作,常用于添加。 SET key value NX 效果等同于 SETNX key value
  • XX: 只在键已经存在时,才对键进行设置操作,常用于更新

存入字符串键值对

如果 key 已经持有其他值, set 就覆写旧值,无视类型。

对于某个原本带有生存时间(TTL)的键来说, 当 set 命令成功在这个键上执行时, 这个键原有的 TTL 将被清除。

127.0.0.1:6379> set time '2023-09-14'
OK
127.0.0.1:6379> get time
"2023-09-14"
# 设置过期时间EX 5 单位是秒
127.0.0.1:6379> set time '2023-09-14' EX 5
OK
127.0.0.1:6379> get time
"2023-09-14"
# 过5秒之后time已过期,获取不到
127.0.0.1:6379> get time
(nil)
# 设置过期时间PX 5000 单位是毫秒
127.0.0.1:6379> set time '2023-09-14' PX 5000
OK
127.0.0.1:6379> get time
"2023-09-14"
# 过5000毫秒之后time已过期,获取不到
127.0.0.1:6379> get time
(nil)
127.0.0.1:6379> set time '2023-09-14' NX
OK
# NX:key为time已存在,设置失败
127.0.0.1:6379> set time '2023-09-14' NX
(nil)
# XX:key为time已存在,设置成功
127.0.0.1:6379> set time '2023-09-14' XX
OK
# XX:key为time1不存在,设置失败
127.0.0.1:6379> set time1 '2023-09-14' XX
(nil)

时间复杂度为O(1)。

SET 成功时才返回OK。

SETNX

SETNX key value(set if not exists的简写):将 key 的值设为 value ,当且仅当 key 不存在。若给定的 key 已经存在,则 SETNX 不做任何动作。

127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> setnx name zhangsan
(integer) 0
127.0.0.1:6379> set name zhangxan nx
(nil)
127.0.0.1:6379> get name
"lisi"

时间复杂度为O(1)。成功返回OK,否则返回0。

SETEX

SETEX key seconds value:将值 value 关联到 key ,并将 key 的生存时间设为 seconds (以秒为单位)。如果 key 已经存在, SETEX 命令将覆写旧值。

该命令相当于以下两条命令 set key value; expire key seconds; 两条命令。

SET key value
EXPIRE key seconds  # 设置生存时间

不同的是,SETEX是一个原子操作。

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> setex name 10 xxian
OK
127.0.0.1:6379> get name
"xxian"
127.0.0.1:6379> get name
(nil)

时间复杂度为O(1)。

成功返回OK,seconds不合法时,报错ERR value is not an integer or out of range。

SETBIT

SETBIT key offset value:对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。

位的设置或清除取决于 value 参数,可以是 0 也可以是 1 。key不存在时生一个新的字符串值。

字符串会进行伸展(grown)以确保它可以将 value 保存在指定的偏移量上。当字符串值进行伸展时,空白位置以 0 填充。

offset 参数必须大于或等于 0 ,小于 2^32 (bit 映射被限制在 512 MB 之内)。

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> setbit bit 1 1
(integer) 0
127.0.0.1:6379> setbit bit 3 1
(integer) 0
127.0.0.1:6379> setbit bit 5 1
(integer) 0
127.0.0.1:6379> setbit bit 7 0
(integer) 0
127.0.0.1:6379> setbit bit 9 0
(integer) 0
127.0.0.1:6379> getbit bit 1
(integer) 1
127.0.0.1:6379> getbit bit 7
(integer) 0
127.0.0.1:6379> getbit bit 2
(integer) 0

时间复杂度为O(1)。

成功返回0,offset有错或value有错时报错。

SETRANGE

SETRANGE key offset value:用 value 参数覆写(overwrite)给定 key 所储存的字符串值,从偏移量 offset 开始。不存在的 key 当作空白字符串处理。

MSET 批量存入键值对

MSET key value [key value ...]:批量存储字符串键值对(同时设置一个或多个 key-value 对),如果某个给定 key 已经存在,那么mset会用新值覆盖原来的旧值。

127.0.0.1:6379> mset name 'xxjava' age 25 address '贵州'
OK
127.0.0.1:6379> mget name age address
1) "xxjava"
2) "25"
3) "\xe8\xb4\xb5\xe5\xb7\x9e"

注:mset 是一个原子性(atomic)操作,所有给定 key 都会在同一时间内被设置,某些给定 key 被更新而另一些给定 key 没有改变的情况,不可能发生。

时间复杂度为O(N), N 为要设置的 key 数量。

MSET 不可能失败,所以总是返回OK。

MSETNX

MSETNX key value [key value ...]:同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。

即使只有一个给定 key 已存在, MSETNX 也会拒绝执行所有给定 key 的设置操作。(MSETNX是原子性)

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> msetnx a 1 b 2 c 3 d 4
(integer) 1
127.0.0.1:6379> mget a b c d
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> msetnx a 1 e 5 f 6 g 7
(integer) 0
# 不成功是因为key为a 的已经厦

时间复杂度O(N),N为KEY的数量。

成功返回1,否则返回0(至少有一个key已经存在)。

PSETEX

PSETEX key milliseconds value:与 SETEX 命令相似。

不同之处

  • SETEX是以秒为单位设置 key 的生存时间
  • PSETEX是以毫秒为单位设置 key 的生存时间

BITCOUNT 计算值中1的数量

BITCOUNT key [start] [end]:计算给定字符串中,被设置为 1 的比特位的数量。

一般情况下,给定的整个字符串都会被进行计数,通过指定额外的 start 或 end 参数,可以让计数只在特定的位上进行。

start 和 end 可以是负数::比如 -1 表示最后一个位,而 -2 表示倒数第二个位,以此类推。

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> setbit bit 1 1
(integer) 0
127.0.0.1:6379> setbit bit 3 1
(integer) 0
127.0.0.1:6379> setbit bit 5 1
(integer) 0
127.0.0.1:6379> setbit bit 7 0
(integer) 0
127.0.0.1:6379> setbit bit 9 0
(integer) 0
127.0.0.1:6379> getbit bit 1
(integer) 1
127.0.0.1:6379> getbit bit 7
(integer) 0
127.0.0.1:6379> getbit bit 2
(integer) 0
127.0.0.1:6379> bitcount bit
(integer) 3

时间复杂度为O(N)。

返回被设置为1的数量。

BITOP 与或非异或操作

BITOP operation destkey key [key ...]:对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上。

有四种操作:

  • AND: BITOP AND destkey key [key ...] ,对一个或多个 key 求逻辑并,并将结果保存到 destkey 。
  • OR:BITOP OR destkey key [key ...] ,对一个或多个 key 求逻辑或,并将结果保存到 destkey。
  • XOR:BITOP XOR destkey key [key ...] ,对一个或多个 key 求逻辑异或,并将结果保存到 destkey 。
  • NOT:BITOP NOT destkey key ,对给定 key 求逻辑非,并将结果保存到 destkey。

注:多key的情况,短的key补0,空key全补0。

求逻辑并 AND操作 和 求逻辑或 OR 操作:

127.0.0.1:6379> flushdb
OK

# 设置xx1为1100
127.0.0.1:6379> setbit xx1 0 1
(integer) 0
127.0.0.1:6379> setbit xx1 1 1
(integer) 0

# 设置xx2为0011
127.0.0.1:6379> setbit xx2 2 1
(integer) 0
127.0.0.1:6379> setbit xx2 3 1
(integer) 0

# and 求逻辑并 xx1 and xx2 = 1100 and 0011 = 0000
127.0.0.1:6379> bitop and destkey xx1 xx2
(integer) 1
127.0.0.1:6379> getbit destkey 0
(integer) 0
127.0.0.1:6379> getbit destkey 1
(integer) 0
127.0.0.1:6379> getbit destkey 2
(integer) 0
127.0.0.1:6379> 
127.0.0.1:6379> getbit destkey 3
(integer) 0

# or 求逻辑或 xx1 or xx2 = 1100 or 0011 = 1111
127.0.0.1:6379> bitop or destkey xx1 xx2
(integer) 1
127.0.0.1:6379> getbit destkey 0
(integer) 1
127.0.0.1:6379> getbit destkey 1
(integer) 1
127.0.0.1:6379> getbit destkey 2
(integer) 1
127.0.0.1:6379> getbit destkey 3
(integer) 1

求逻辑异或 XOR操作 和 求逻辑非 NOT 操作

127.0.0.1:6379> flushdb
OK

# 设置k1 为1001
127.0.0.1:6379> setbit k1 0 1
(integer) 0
127.0.0.1:6379> setbit k1 1 0
(integer) 0
127.0.0.1:6379> setbit k1 2 0
(integer) 0
127.0.0.1:6379> setbit k1 3 1
(integer) 0


# 设置k2 为0011
127.0.0.1:6379> setbit k2 0 0
(integer) 0
127.0.0.1:6379> setbit k2 1 0
(integer) 0
127.0.0.1:6379> setbit k2 2 1
(integer) 0
127.0.0.1:6379> setbit k2 3 1
(integer) 0

# XOR 求逻辑异或 k1 xor k2 = 1001 xor 0011 = 1010
127.0.0.1:6379> bitop xor destkey k1 k2
(integer) 1
127.0.0.1:6379> getbit destkey 0
(integer) 1
127.0.0.1:6379> getbit destkey 1
(integer) 0
127.0.0.1:6379> getbit destkey 2
(integer) 1
127.0.0.1:6379> getbit destkey 3
(integer) 0


# 对 k1 求逻辑非 not 1001 = 0110
127.0.0.1:6379> bitop not destkey k1
(integer) 1
127.0.0.1:6379> getbit destkey 0
(integer) 0
127.0.0.1:6379> getbit destkey 1
(integer) 1
127.0.0.1:6379> getbit destkey 2
(integer) 1
127.0.0.1:6379> getbit destkey 3
(integer) 0

时间复杂度为O(N),N为max(len(k1), len(k2))的值。

返回到destkey中。

DECR 减1

DECR key:将 key 中储存的数字值减一。

  • 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECR 操作。

  • 若值不为数字类型,则返回错误。

  • 本操作的值限制在 64 位(bit)有符号数字表示之内。

    127.0.0.1:6379> flushdb
    OK
    127.0.0.1:6379> set age 100
    OK
    127.0.0.1:6379> decr age
    (integer) 99
    127.0.0.1:6379> get age
    "99"

    key不存在

    127.0.0.1:6379> decr name
    (integer) -1

    key不为数字

    127.0.0.1:6379> set name 'cxian'
    OK
    127.0.0.1:6379> decr name
    (error) ERR value is not an integer or out of range

时间复杂度为O(1)。

返回执行命令DECR后的值。

当值不为数字则报错。

DECRBY

DECRBY key decrement:将 key 所储存的值减去减量 decrement 。

  • 若key不存在,则新给key赋值为0,然后再执行DECRBY操作

  • 若key的值不为数字,则返回错误;

  • 本操作的值限制在 64 位(bit)有符号数字表示之内。

    127.0.0.1:6379> flushdb
    OK
    127.0.0.1:6379> set age 100
    OK
    127.0.0.1:6379> DECRBY age 30
    (integer) 70

    key不存在

    127.0.0.1:6379> DECRBY name 30
    (integer) -30
    127.0.0.1:6379> set name 'cxian'
    OK

    key不为数字

    127.0.0.1:6379> DECRBY name 30
    (error) ERR value is not an integer or out of range
    127.0.0.1:6379>

时间复杂度为O(1)。返回执行命令DECRBY后的值。当值不为数字则报错。

APPEND 追加

APPEND key value:如果 key 已经存在并且是一个字符串,APPEND 命令将 value 追加到 key 原来的值的末尾;如果 key 不存在,APPEND就简单地将给定 key 设为 value ,就像执行 SET key value 一样。

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set name 'xiao'
OK
127.0.0.1:6379> APPEND name ' xian'
(integer) 9
127.0.0.1:6379> get name
"xiao xian"

时间复杂度为O(1)。

返回追加后字符串的长度。

相关命令:

  • STRLEN key: 输出key的值的长度
  • GETRANGE key start end:返回 key 中字符串值的子字符串,字符串的截取范围由 start 和 end 两个偏移量决定(包括 start 和 end 在内)。
  • SETRANGE key offset value: 用 value 参数覆写(overwrite)给定 key 所储存的字符串值,从偏移量 offset 开始

INCR 自增

INCR key:将 key 中储存的数字值增一。

  • 若key不存在,则新给key赋值为0,然后再执行 INCR 操作

  • 若key的值不为数字,则返回错误

  • 本操作的值限制在 64 位(bit)有符号数字表示之内。

    127.0.0.1:6379> flushdb
    OK
    127.0.0.1:6379> keys *
    (empty array)

    key不存在

    127.0.0.1:6379> incr age
    (integer) 1

    key存在

    127.0.0.1:6379> set age 100
    OK
    127.0.0.1:6379> incr age
    (integer) 101

时间复杂度为O(1)。

返回INCR命令后key的值。

INCRBY

INCRBY key increment:所DECR相似,不同在于DECRBY是减,而INCRBY是相加。

INCRBYFLOAT

INCRBYFLOAT key increment:对key 对应的值转为浮点数加上浮点数增量 increment。

  • 如果 key 不存在,那么 INCRBYFLOAT 会先给 key 赋值为0 ,再执行加法操作。

  • 如果命令执行成功,那么 key 的值会被更新为(执行加法之后的)新值,并且新值会以字符串的形式返回给调用者。

  • key的值和increment都可以用指数符号形式表示(如2.0e7 、 3e5 、 90e-2等)

    127.0.0.1:6379> flushdb
    OK

    key不存在

    127.0.0.1:6379> incrbyfloat age 2.55
    "2.55"

    key存在

    127.0.0.1:6379> set age 100
    OK
    127.0.0.1:6379> incrbyfloat age 2.55
    "102.55"

    key的值不为数字类型

    127.0.0.1:6379> set name 'cxian'
    OK
    127.0.0.1:6379> incrbyfloat name 2.55
    (error) ERR value is not a valid float

时间复试度O(1)。

返回执行INCRBYFLOAT命令后的值。

GET 取值

GET key:返回 key 所关联的字符串值。

  • key 不存在,返回nil

  • key 的值不为字符串,返回一个错误(GET只处理字符串)

    127.0.0.1:6379> flushdb
    OK

    key不存在

    127.0.0.1:6379> get age
    (nil)
    127.0.0.1:6379> set age '100'
    OK
    127.0.0.1:6379> get age
    "100"

    key对应的值不为字符串get报错

    127.0.0.1:6379> lpush fruits apple banana orange
    (integer) 3
    127.0.0.1:6379> get fruits
    (error) WRONGTYPE Operation against a key holding the wrong kind of value

时间复杂度O(1)。

返回key对应的值。

GETBIT

GETBIT key offset:对 key 所储存的字符串值,获取指定偏移量上的位(bit)。

  • 当 offset 比字符串值的长度大,或者 key 不存在时,返回 0

    127.0.0.1:6379> flushdb
    OK

    设code的值为1001

    127.0.0.1:6379> setbit code 0 1
    (integer) 0
    127.0.0.1:6379> setbit code 1 0
    (integer) 0
    127.0.0.1:6379> setbit code 2 0
    (integer) 0
    127.0.0.1:6379> setbit code 3 1
    (integer) 0

    取位置3的值

    127.0.0.1:6379> getbit code 3
    (integer) 1

    取位置2的值

    127.0.0.1:6379> getbit code 2
    (integer) 0

    取位置1的值

    127.0.0.1:6379> getbit code 1
    (integer) 0

    取位置0的值

    127.0.0.1:6379> getbit code 0
    (integer) 1

    取offset比key的值长度大

    127.0.0.1:6379> getbit code 64
    (integer) 0

    取不存在的

    key127.0.0.1:6379> get id
    (nil)
    127.0.0.1:6379> getbit id 0
    (integer) 0

时间复杂度O(1)。

返回字符串值指定偏移量上的位(bit)

GETRANGE

GETRANGE key start end:返回 key 中字符串值的子字符串,字符串的截取范围由 start 和 end 两个偏移量决定(包括 start 和 end 在内)。

  • 负数偏移量表示从字符串最后开始计数, -1 表示最后一个字符, -2 表示倒数第二个,以此类推

  • 通过保证子字符串的值域(range)不超过实际字符串的值域来处理超出范围的值域请求。

    127.0.0.1:6379> flushdb
    OK
    127.0.0.1:6379> SET address "shuangshuangguiyang"

    返回过引0-3的字符串,包括3

    127.0.0.1:6379> getrange address 0 3
    "shua"

    返回-3~-1 即 倒数第三个~最后一个(属从左往右,正常返回)

    127.0.0.1:6379> getrange address -3 -1
    "ang"

    返回-1~-3 即 最后一个~倒数第三个(属从右往左,返回空串)

    127.0.0.1:6379> getrange address -1 -3
    ""

    返回3~0 即 第四个~第一个(属从右往在,返回空串)

    127.0.0.1:6379> getrange address 3 0
    ""

    不在key的值的长度范围之外的部分返回空串

    127.0.0.1:6379> getrange address 10 100
    "ngguiyang"

时间复杂度为O(N)(N为返回字符串的长度)。

返回截取得同的子字符串。

GETSET 取旧值赋新值

GETSET key value:将给定 key 的值设为 value ,并返回 key 的旧值。

  • 若key不存在,则设置key的值为value,返回nil

  • 若key存在且不为字符串,返回错误

    127.0.0.1:6379> flushdb
    OK

    key不存在

    127.0.0.1:6379> getset name 'cxian'
    (nil)
    127.0.0.1:6379> get name
    "cxian"

    key存在且为字符串

    127.0.0.1:6379> getset name lisi
    "cxian"

    key存在且不为字符串

    127.0.0.1:6379> lpush fruits apple banana orange
    (integer) 3
    127.0.0.1:6379> getset fruits 123
    (error) WRONGTYPE Operation against a key holding the wrong kind of value

时间复杂度为O(1)。

返回给定key的旧值。

  • 当key不存在返回nil
  • 当key旧值不为字符串报错

MGET 批量取值

MGET key [key ...]:依次返回所有(一个或多个)给定 key 的值。

  • 当key不存在 或key的值不为字符串,返回nil

    127.0.0.1:6379> flushdb
    OK
    127.0.0.1:6379> set age 88
    OK
    127.0.0.1:6379> lpush fruits apple banana orange pear
    (integer) 4

    fruits为集合和name不存在,返回nil

    127.0.0.1:6379> mget age fruits name

    1. "88"
    2. (nil)
    3. (nil)

时间复杂度O(N),N为key的数量。

返回一个包含所有给定 key 的值的列表。

STRLEN 计算值的长度

STRLEN key:返回 key 所储存的字符串值的长度。

  • 当key不存在是,返回0

  • 当key的值不为字符时报错

    127.0.0.1:6379> flushdb
    OK
    127.0.0.1:6379> set age 100
    OK
    127.0.0.1:6379> lpush fruits apple banana orange pear
    (integer) 4

    key存在返回对应值的长度

    127.0.0.1:6379> strlen age
    (integer) 3

    key不存在返回0

    127.0.0.1:6379> strlen name
    (integer) 0

    key存在但不为字符串,报错

    127.0.0.1:6379> strlen fruits
    (error) WRONGTYPE Operation against a key holding the wrong kind of value

相关推荐
非 白几秒前
【Java】代理模式
java·开发语言·代理模式
muxue1789 分钟前
go:运行第一个go语言程序
开发语言·后端·golang
米饭好好吃.10 分钟前
【Go】Go wire 依赖注入
开发语言·后端·golang
闲猫10 分钟前
go 接口interface func (m Market) getName() string {
开发语言·后端·golang
Good Note11 分钟前
Golang的静态强类型、编译型、并发型
java·数据库·redis·后端·mysql·面试·golang
可爱de艺艺11 分钟前
Go入门之struct
开发语言·后端·golang
信徒_14 分钟前
Go 语言中的协程
开发语言·后端·golang
m0_7482365827 分钟前
跟据spring boot版本,查看对应的tomcat,并查看可支持的tomcat的版本范围
spring boot·后端·tomcat
web1511736022333 分钟前
Spring Boot项目中解决跨域问题(四种方式)
spring boot·后端·dubbo
喜-喜38 分钟前
Python pip 缓存清理:全面方法与操作指南
python·缓存·pip