Redis知识整理(三)
String类型 – 字符型
set的NX与XX
- NX
- If Not Exist
- 如果不存在这个key则设置这个key的值为value
- 一般用于分布式锁,多个client获取一个连接
- 用于创建
- XX
- if Exist
- 只有存在这个key才可以操作
- 用于更新
- 下图中 k1对应的value为hello k2不存在
mset与mget
- 批量处理
- 一次set多个kv,一次获取多个k值
> mset k3 a k4 b
> mget k3 k4
APPEND拼接
- 拼接字符串到后面
GETRANGE获取部分
- 获取字符串的部分字符
SETRANGE覆盖部分
- 覆盖字符串的部分内容 从start开始,一直覆盖到value值的结束
STRLEN查询长度
- 查询key对应的长度
String类型 – 数值型
Type命令
查看key对应的value类型
OBJECT encoding命令
三种类型
- esbstr
- raw
- int
其中esbstr字符串长度达到一定限制会变成raw
类型之间可以相互转换
查看key对应的value编码
>set k1 99
>set k2 hello
>type k1
"string"
>type k2
"string"
> OBJECT encoding k1
"int"
> OBJECT encoding k2
"embstr"
INCR加1
- 对“int”类型的数加一
INCRBY累加
- 对“int”类型的数加多个
DECR减一
DECRBY累减
INCRBYFLOAT加小数
>INCR k1
(integer) 100
>get k1
"100"
>INCRBY k1 22
(integer) 122
>DECR k1
(integer) 121
>get k1
"121"
>DECRBY k1 21
(integer) 100
Redis的二进制安全
使用字节流而不是字符流
数值计算时会把字节拿出来,计算后将encoding置为raw
根据不同的编码,设置中文的STRLEN是不一样的
K2是UTF-8 K3是GBK
redis是二进制安全的
与redis交互的时候传递的都是字节数组
encoding存在的意义是可以加速
- 如果当前类型是esbstr,数值类型计算会直接报错
- 如果当前类型是int,则直接计算
- 如果当前类型是raw,会先判断是否可以计算
所以同样会带来一个问题:
使用redis存储字符时,必须提前约定好编解码的字符集
String类型 – bitmap
setbit设置偏移
setbit key offset value
设置key对应的偏移值
>setbit k1 1 1
0
>STRLEN k1
1
>get k1
@
>setbit k1 7 1
0
>STRLEN k1
1
>get k1
A
>setbit k1 9 1
0
>STRLEN k1
2
>get k1
A@
#ASCII码显示
bitpos查看偏移量
bitpos key bit [start] [end]
key对应的value的bit位图中的第几位中第一个的bit值
返回的是在bit在二进制位中的位置,而不是对应的字节中的位置
>bitpos k1 1 0 0
1
>bitpos k1 1 1 1
9
bitcount查看位出现的次数
统计单位字节内1出现的次数
>BITCOUNT k1 0 1
3
>BITCOUNT k1 0 0
2
>BITCOUNT k1 1 1
1
Bitop位运算
BITOP operation destkey key [key…]
operation值的是位运算
- and
- or
# 提前准备好k1的值 0100 0001 ----> A
# 提前准备好k2的值 0100 0010 ----> B
> bitop and andkey k1 k2
(integer)1
> get andkey
"@"
# andkey的值 0100 0000
> bitop or orkey k1 k2
(integer)1
> get orkey
"C"
# orkey的值 0100 0011
BitMap实际应用
统计用户登陆情况
以userId为key,给400位用来记录每一天是否登陆,登陆为1,不登陆为0
> setbit zhangsan 1 1
> setbit zhangsan 7 1
> setbit zhangsan 364 1
# 一共64个字节 足够
> STRLEN zhangsan
(integer) 64
# 统计最后两个字节 16天内的登陆情况
> BITCOUNT zhangsan -2 -1
(integer) 1
占用空间小,二进制运算速度快
活跃用户统计
以日期为key,以userId映射到偏移位,登陆为1,未登陆为0
> setbit 20210802 1 1
> setbit 20210803 1 1
> setbit 20210803 7 1
# 进行或运算 登陆一天即为活跃用户
> bitop or destkey 20210802 20210803
# 计算活跃用户数 二进制或运算 天然去重
> BITCOUNT destkey 0 -1
(integer) 2
知识整理
正反向索引
- 元素是既有正向索引也有反向索引
- 0 1 2 对应 0 -2 -1