7. Redis中字符串详解
String类型
命令 | 说明 |
---|---|
set | 设置key的值 |
get | 获取对应的key的值 |
strlen | 获取key的值的长度 |
append | 在原有的value的基础上追加内容 |
incr | 将key存储的内容加1 |
incrby | 将key存储的内容加指定的值 |
incrbyfloat | 将key存储的内容累加一个float类型的数据 |
decr | 将key存储的内容减1 |
decrby | 将key存储的内容减去指定的值 |
getrange | 截取value的值 |
setrange | 修改value的部分内容,根据偏移量修改 |
getset | 获取设置key的值并返回原来的旧值 |
mget | 批量获取值 |
mset | 批量设置值 |
setex | 设置key对应的value,同时设置过期时间,单位是秒 |
psetex | 设置key对应的value,同时设置过期时间,单位是毫秒 |
setnx | 只有在 key 不存在时设置 key 的值,set if not exists |
msetnx | 兼具了mset和setnx的特性 |
Set命令
设置指定 key 的值
127.0.0.1:6379> set name abc
OK
12
Get命令
返回 key 的值,如果 key 不存在时,返回 nil。 如果 key 不是字符串类型,那么返回一个错误。
127.0.0.1:6379> get name
"abc"
127.0.0.1:6379> get aaa
(nil)
1234
StrLen命令
获取value的长度
127.0.0.1:6379> strlen name
(integer) 10
12
Append
如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾,如果key不存在则报错
127.0.0.1:6379> append name 123
(integer) 6
127.0.0.1:6379> get name
"abc123"
127.0.0.1:6379> append aaa
(error) ERR wrong number of arguments for 'append' command
123456
Incr命令
将 key 中储存的数字值增一。 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。 如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误
127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> get age
"18"
127.0.0.1:6379> incr age
(integer) 19 #正常数字增1
127.0.0.1:6379> incr aaa
(integer) 1 # 不存在 初始为0增1
127.0.0.1:6379> incr name # 类型不匹配报错
(error) ERR value is not an integer or out of range
12345678910
IncrBy命令
将 key 所储存的值加上特定的值
127.0.0.1:6379> incrby age 5
(integer) 24
127.0.0.1:6379> incrby age 5
(integer) 29
1234
IncrByFloat命令
将 key 所储存的值加上给定的浮点增量值
127.0.0.1:6379> incrbyfloat age 2.3
"31.3"
127.0.0.1:6379> incrbyfloat age 2.3
"33.6"
1234
Decr
将 key 中储存的数字值减一。 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECR 操作。 如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误
127.0.0.1:6379> get age
"18"
127.0.0.1:6379> decr age
(integer) 17
1234
DecrBy
将key中存储的数字减固定的值
27.0.0.1:6379> decrby age 8
(integer) 9
127.0.0.1:6379> decrby age 8
(integer) 1
1234
GetRange
获取value值的子集 命令 getrange key start end
127.0.0.1:6379> getrange name 2 5
"c123"
127.0.0.1:6379> getrange name 4 6
"23"
127.0.0.1:6379> getrange name 2 6
"c123"
123456
SetRange命令
用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始
127.0.0.1:6379> set name helloworld
OK
127.0.0.1:6379> get name
"helloworld"
127.0.0.1:6379> setrange name 5 redis
(integer) 10
127.0.0.1:6379> get name
"helloredis"
12345678
GetSet命令
获取设置key的值并返回原来的旧值
127.0.0.1:6379> getset name 波波烤鸭
"abc123"
127.0.0.1:6379> get name
"\xe6\xb3\xa2\xe6\xb3\xa2\xe7\x83\xa4\xe9\xb8\xad"
1234
MGet命令
批量获取值
127.0.0.1:6379> mget name age address
1) "abc"
2) "1"
3) "sz"
1234
MSet命令
批量设置值
127.0.0.1:6379> mset a1 a1 a2 a2 a3 a3 a4 a4
OK
127.0.0.1:6379> mget a1 a2 a3 a4
1) "a1"
2) "a2"
3) "a3"
4) "a4"
1234567
SetEx命令
设置key对应的value,同时设置过期时间,单位是秒
127.0.0.1:6379> setex name1 20 test
OK
127.0.0.1:6379> ttl name1
(integer) 16
127.0.0.1:6379> ttl name1
(integer) 6
127.0.0.1:6379> ttl name1
(integer) -2
12345678
PSetEx命令
这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位
127.0.0.1:6379> psetex name2 20000 aaa
OK
127.0.0.1:6379> ttl name2
(integer) 17
127.0.0.1:6379> pttl name2
(integer) 4020
127.0.0.1:6379> pttl name2
(integer) 381
12345678
SetNx命令
只有在 key 不存在时设置 key 的值,set if not exists
127.0.0.1:6379> setnx name aaa
(integer) 0
127.0.0.1:6379> get name
"abc"
127.0.0.1:6379> setnx name3 aaa
(integer) 1
127.0.0.1:6379> get name3
"aaa"
12345678
MSetNx命令
兼具了mset和setnx的特性,但是批量设置中只要有一个key存在,则所有的操作都失效。
127.0.0.1:6379> msetnx b1 bb1 b2 bb2 b3 bb3
(integer) 1
127.0.0.1:6379> mget b1 b2 b3
1) "bb1"
2) "bb2"
3) "bb3"
127.0.0.1:6379> msetnx a1 aaa b5 bbb b6 bbb
(integer) 0
127.0.0.1:6379> mget a1 b5 b6
1) "a1"
2) (nil)
3) (nil)
string 字符串的使用场景
string 类型的使用场景非常多,如下列举一些:
- 计数器
- 统计多个单位的数量
- 对象缓存存储
- 分数,粉丝数,点赞量 等等
String中的bit命令
GetBit命令
用于对 key 所储存的字符串值,获取指定偏移量上的位(bit)
127.0.0.1:6379> set k1 a
OK
127.0.0.1:6379> getbit k1 0
(integer) 0
127.0.0.1:6379> getbit k1 1
(integer) 1
127.0.0.1:6379> getbit k1 2
(integer) 1
127.0.0.1:6379> getbit k1 3
(integer) 0
127.0.0.1:6379> getbit k1 4
(integer) 0
127.0.0.1:6379> getbit k1 5
(integer) 0
127.0.0.1:6379> getbit k1 6
(integer) 0
127.0.0.1:6379> getbit k1 7
(integer) 1
123456789101112131415161718
当偏移量 OFFSET 比字符串值的长度大,或者 key 不存在时,返回 0 。
SetBit命令
用于对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit),返回的结果是该位上原来的bit值。比如我们设置 k1为a,k2为c,a对应的ASCII码为97(01100001),c对应的ASCII码为99(01100011),相差了一个1,如此我们就可以通过setbit来调整
127.0.0.1:6379> set k2 c
OK
127.0.0.1:6379> get k1
"a"
127.0.0.1:6379> get k2
"c"
127.0.0.1:6379> setbit k1 6 1
(integer) 0
127.0.0.1:6379> get k1
"c"
12345678910
如此我们就将k1的值快速调整为了c。
BitCount命令
用来统计二进制中为1的个数,比如a(97 01100001)为3,c(99 01100011)为4.
127.0.0.1:6379> get k1
"a"
127.0.0.1:6379> get k2
"c"
127.0.0.1:6379> bitcount k1
(integer) 3
127.0.0.1:6379> bitcount k2
(integer) 4
12345678
实际使用官网给出了例子,统计在线人数。
假设现在我们希望记录自己网站上的用户的上线频率,比如说,计算用户 A 上线了多少天,用户 B 上线了多少天,诸如此类,以此作为数据,从而决定让哪些用户参加 beta 测试等活动 —— 这个模式可以使用 SETBIT 和 BITCOUNT 来实现。 比如说,每当用户在某一天上线的时候,我们就使用 SETBIT ,以用户名作为 key ,将那天所代表的网站的上线日作为 offset 参数,并将这个 offset 上的为设置为 1 。 举个例子,如果今天是网站上线的第 100 天,而用户 peter 在今天阅览过网站,那么执行命令 SETBIT peter 100 1 ;如果明天 peter 也继续阅览网站,那么执行命令 SETBIT peter 101 1 ,以此类推。 当要计算 peter 总共以来的上线次数时,就使用 BITCOUNT 命令:执行 BITCOUNT peter ,得出的结果就是 peter 上线的总天数。
性能 前面的上线次数统计例子,即使运行 10 年,占用的空间也只是每个用户 10*365 比特位(bit),也即是每个用户 456 字节。对于这种大小的数据来说, BITCOUNT 的处理速度就像 GET 和 INCR 这种 O(1) 复杂度的操作一样快。
BitOp命令
对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上。BITOP 命令支持 AND(与) 、 OR(或) 、 NOT(非) 、 XOR(异或)运算。比如a 01100001和c 01100011进行相关运算
127.0.0.1:6379> get k1
"a"
127.0.0.1:6379> get k2
"c"
127.0.0.1:6379> bitop and k3 k1 k2
(integer) 1
127.0.0.1:6379> get k3
"a"
127.0.0.1:6379> bitop or k4 k1 k2
(integer) 1
127.0.0.1:6379> get k4
"c"
127.0.0.1:6379> bitop xor k5 k1 k2
(integer) 1
127.0.0.1:6379> get k5
"\x02"
12345678910111213141516
not运算注意参数个数
127.0.0.1:6379> bitop not k6 k1
(integer) 1
127.0.0.1:6379> get k6
"\x9e"
1234
BitPos命令
返回字符串里面第一个被设置为1或者0的bit位。 返回一个位置,把字符串当做一个从左到右的字节数组,第一个符合条件的在位置0,其次在位置8,等等。还是以a为例01100001
127.0.0.1:6379> bitpos k1 1
(integer) 1
127.0.0.1:6379> bitpos k1 0
(integer) 0