Redis 字符串操作实战(全)

目录

SET 存入键值对

SETNX

SETEX

SETBIT

SETRANGE

MSET 批量存入键值对

MSETNX

PSETEX

BITCOUNT 计算值中1的数量

BITOP 与或非异或操作

DECR 减1

DECRBY

APPEND 追加

INCR 自增

INCRBY

INCRBYFLOAT

GET 取值

GETBIT

GETRANGE

GETSET 取旧值赋新值

MGET 批量取值

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 效果等同于 PSETEX key 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

你可能感兴趣的:(Redis,redis,缓存,数据库,java,后端)