公开课 redis系列二----五大类型的使用场景

2022-05-09 16:33:38 浏览数 (1)

redis的五大类型是

string, list, hash, set, zset


科普: redis cli的用法

1. redis-cli 打开redis客户端, 这就不用说了

2. help, 查看redis-cli的命令

 这里告诉你redis 命令的类型.

help @<group> 获取一组命令行. 比如获取string类型的一组命令行

重点: 可以试用help @ tab键来切换group的类型

例如: help @ tab

第一个出现的是help @generator, 第二个出现的是help @string

代码语言:javascript复制
help @string

回车, 看看string命令组有哪些命令

为什么说这个? 虽然redis经常用, 但是, 有些功能是盲区, 但是可以让我们很快进入状态. 比如你忘了那个命令怎么写了,那么就使用help, 不用去费劲百度了.


一. string

1. 存储string 和int类型

这个我们都比较熟悉. 来看看string的内部方法.

string可以保存三种类型的数据: string  int  bitmap(二进制) 

使用redis-cli 的help @string. 

我们set 一个字符串和一个int

代码语言:javascript复制
set c1 abcdef
get c1

set c2 9
get c2

接下来我们看看字符串的长度

 我们来看看c1和c2的编码类型, 使用Object命令, 我们不知道Object的用法. 那么就help一下

代码语言:javascript复制
object help

 里面有一个encoding, 这个就是获取指定key的类型

代码语言:javascript复制
// 获取c1的类型
OBJECT encoding c1

// 获取c2的类型
OBJECT encoding c2

我们看看返回的结果

第一个字符串返回的是embstr, 第二个返回的是int 

这里embstr表示的是字符串类型, int是数值类型. 还有一个字符串类型是raw. redis5.X的版本, 字符串长度小于44, 返回embstr类型, 字符串长度>44, 返回raw类型

raw就是 返回原始数据, 未经加工的数据

raw的用法

有时, 我们在set一个汉字的时候, 会发现, get出来的是一个编码, 而不是汉字本身. 例如: 

代码语言:javascript复制
127.0.0.1:6379> set a1 罗
OK

127.0.0.1:6379> get a1
"xe7xbdx97"

如果要想打印出汉字本身, 我们可以使用raw参数, 表示按照原始的未加工的方式输出

代码语言:javascript复制
// 第一步: 启动客户端的时候, 增加--raw参数
redis-cli --raw

// 第二步: get出数据, 这是返回的是原始数据
get a1

int类型还可以使用自增, 自减的本地方法

代码语言:javascript复制
// 每次自增1
127.0.0.1:6379> get c2
9
127.0.0.1:6379> INCR c2
10

// 每次自增指定步长
127.0.0.1:6379> get c2
10
127.0.0.1:6379> INCRBY c2 100
110
127.0.0.1:6379> get c2
110

使用场景: 秒杀, 限流, 值变化

2. bitmap二进制类型 

以前很少接触到二进制类型, 这次突然知道, 为什么大神们都喜欢用二进制表示.

在help @string中可以看到很多bit开头的命令, 这些就是操作二进制的

下面说两个问题

1. 二进制怎么用, 这个是通用的, java, c都是可以这么使用

2. 二进制在什么场景用

使用二进制速度快, 对内存非常友好, 对cpu也非常友好

1) 二进制怎么用

  • 设置1个字节

SETBIT: 这个命令是开辟一个空间, 给某个偏移量设置某个值

代码语言:javascript复制
127.0.0.1:6379> SETBIT c1 1 1
0

参数的含义

代码语言:javascript复制
参数的含义 
c1 -->是key
1 -->表示偏移量
1 -->表示设置偏移量的值

这句话什么意思呢?

代码语言:javascript复制
首先. SETBIT命令会开辟一块空间. 这块空间是一个地址, 按字节来计算
1个字节 = 8byte
开辟完是这样的
00000000


第二: 对这个字节的下标为1的字节, 将其值修改1
修改后: 010000000

接下来, 我们get一下,看看c1是什么东西

代码语言:javascript复制
127.0.0.1:6379> get c1
@

c1是一个@符号. 这表示 01000000这ascii中表示的是@

我们再来setbit c1 7 1 

这是就变成: 01000001了, 这是个什么呢?

代码语言:javascript复制
127.0.0.1:6379> get c1
A

表示01000001这个在ascii中表示的是A

这是他的用法. 我们再来看看c1的长度

代码语言:javascript复制
127.0.0.1:6379> STRLEN c1
1

这里c1 的长度是1, 这里的1表示的一个字节, 我给c1的偏移量始终都没有超过1个字节

  • 设置多个字节

 刚才我们设置了一个1字节的c1, 那么看看下面这个是什么呢?

代码语言:javascript复制
// 给c1 再设置第九个偏移量为1
127.0.0.1:6379> SETBIT c1 9 1
0

// 取出c1 结果为A@
127.0.0.1:6379> get c1
A@

为什么会这样?

代码语言:javascript复制
SETBIT c1 9 1 给9个偏移量设置1, 1byte只有8位, 给下标为9的位set, 那就要再开辟一个字节. 变成这样
代码语言:javascript复制
01000001 01000000

我们来看现在是几个字节

代码语言:javascript复制
127.0.0.1:6379> STRLEN c1
2

果然, 现在是两个字节.

也就是说: setbit可以的动态拓宽字节

  • BITCOUNT的用法
代码语言:javascript复制
// BITCOUNT统计指定key的字节中1的个数

127.0.0.1:6379> BITCOUNT c1 0 1
3

BITCOUNT什么意思? BITCOUNT统计指定key的字节中1的个数

参数是什么意思呢?

代码语言:javascript复制
// 参数含义:
c1 表示的是要统计的key
0 代表从第0个字节开始统计, 不是位数, 是字节数
1 代表从到第1个字节结束, 不是位数, 是字节数

所以, c1 统计的结果是0和1两个字节中包含1的个数, 答案是3个

比如说, 我还可以统计, 0号字节---0号字节有多少个1, 1号字节---1号字节有多少个1

代码语言:javascript复制
127.0.0.1:6379> BITCOUNT c1 0 0
2
127.0.0.1:6379> BITCOUNT c2 1 1
1

0号字节---0号字节有多少个1, 有2个1

1号字节---1号字节有多少个1, 有1个1

  • 案例: 再来看 如果一年有365天, 我要标记哪天早起了. 我应该怎么做呢?

首先, 我们先来开辟一个365位的空间

代码语言:javascript复制
127.0.0.1:6379> SETBIT c3 365 0

我们看看这个空间占了多少字节?

代码语言:javascript复制
127.0.0.1:6379> STRLEN c3
46

占了46个字节. 哇

0 人点赞