redis

Redis学习笔记系列(三)——基本数据类型之字符串

2020-10-07  本文已影响0人  复旦猿

5. Redis数据类型

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

5.1 字符串(string)

5.1.1 SET / SETEX / PSETEX / SETNX
# 设置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)
# 设置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
# 设置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)
# 当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
# 设置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
# 清空数据库中的所有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
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
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
""
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为有符号整数所内表示的范围内。

# 设置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
# 将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
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
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
127.0.0.1:6379> STRALGO LCS STRINGS  helloworld helloredis
"hellord"
5.1.9 SETBIT / BITCOUNT / BITOP / BITOPS / BITFIELD
127.0.0.1:6379> SETBIT k1 1 1
(integer) 0
127.0.0.1:6379> SETBIT k1 10 1
(integer) 0
127.0.0.1:6379> GET k1
"@ "
127.0.0.1:6379> GETBIT k1 1
(integer) 1
127.0.0.1:6379> GETBIT k1 10
(integer) 1
127.0.0.1:6379> GETBIT k1 2
(integer) 0
127.0.0.1:6379> GETBIT k1 1000
(integer) 0
127.0.0.1:6379> BITCOUNT k1
(integer) 2
127.0.0.1:6379> BITCOUNT k1 0 1
(integer) 2
# 设置k1的值为 11111111 11111101
127.0.0.1:6379> SET k1 "\xff\xfd"
OK
# 返回1的个数,15
127.0.0.1:6379> BITCOUNT k1
(integer) 15
# 返回首个1的位置
127.0.0.1:6379> BITPOS k1 1 0 -1
(integer) 0
# 返回首个0的位置
127.0.0.1:6379> BITPOS k1 0 0 -1
(integer) 14
# 在第1个字节内,返回首个0出现的位置,返回-1
127.0.0.1:6379> BITPOS k1 0 0 0 
(integer) -1
# 10101010
127.0.0.1:6379> SET k1 "\xaa"
OK
# 01010101
127.0.0.1:6379> SET k2 "\x55"
OK
127.0.0.1:6379> BITOP AND k3 k1 k2
(integer) 1
# AND: 10101010 & 01010101 = 00000000
127.0.0.1:6379> GET k3
"\x00"
# OR: 10101010 | 01010101 = 11111111
127.0.0.1:6379> BITOP OR k4 k1 k2
(integer) 1
127.0.0.1:6379> GET k4
"\xff"
# XOR: 10101010 ^ 01010101 = 11111111
127.0.0.1:6379> BITOP XOR k5 k1 k2
(integer) 1
127.0.0.1:6379> GET k5
"\xff"
# NOT:  !10101010 = 01010101
127.0.0.1:6379> BITOP NOT k6 k1
(integer) 1
# 字符U二进制值为 01010101
127.0.0.1:6379> GET k6
"U"
# 不同长度的字符串进行位运算:
# key1的值将以0填充为 10101010 00000000
# 10101010 00000000 | 01010101 01010101 = 11111111 01010101
127.0.0.1:6379> BITOP OR k8 k1 k7
(integer) 3
127.0.0.1:6379> GET k8
"\xff55"
redis> BITFIELD k1 INCRBY i5 100 1 GET u4 0
1) (integer) 1
2) (integer) 0

BITFIELD命令提供了下列支持的子命令:
GET <type> <offset> 返回指定位域的值,若超出字符串的长度,超出部分将为0。
SET <type> <offset> <value> 设置指定位域的值,并返回旧值。若超出字符串的长度,超出部分将以0填充。
INCRBY <type> <offset> <increment> 对指定位域的值进行自增操作(通过使用负的自增值进行减法的操作),并返回最新的值。若超出字符串的长度,超出部分将以0填充。

# 0111 1111
127.0.0.1:6379> BITFIELD k1 SET i8 0 127
1) (integer) 0
127.0.0.1:6379> GET k1
"\x7f"
# 11111 有符号为 -1
127.0.0.1:6379> BITFIELD k1 GET i5 1
1) (integer) -1
# 11111 无符号为 31
127.0.0.1:6379> BITFIELD k1 GET u5 1
1) (integer) 31

127.0.0.1:6379> BITFIELD k1 SET i8 0 120
1) (integer) 0
# 使用FAIL使发生溢出时不执行操作
127.0.0.1:6379> BITFIELD k1 OVERFLOW FAIL INCRBY i8 0 10
1) (nil)
# 使用SAT使发生溢出时保持在边界值
127.0.0.1:6379> BITFIELD k1 OVERFLOW SAT INCRBY i8 0 10
1) (integer) 127
# 使用WRAP使发生溢出时值按环绕模式改变
127.0.0.1:6379> BITFIELD k1 OVERFLOW WRAP INCRBY i8 0 1
1) (integer) -128

写在最后

如果你觉得我写的文章帮到了你,欢迎点赞、评论、分享、赞赏哦,你们的鼓励是我不断创作的动力~

上一篇 下一篇

猜你喜欢

热点阅读