你真的懂Redis的string类型?

一、help

一定要学会用help,且下意识的去用help,而不是去百度翻阅文档。
一定要学会用help,且下意识的去用help,而不是去百度翻阅文档。
一定要学会用help,且下意识的去用help,而不是去百度翻阅文档。

1.help类型

不光可以查看redis的N大类型,还可以查看事务、连接、集群等等等等。输入help 然后按tab键就行了。比如下面是看string这个类型的所有api。为什么说不去看文档,而是看这个,因为每个版本的命令可能也不同,所以直接help看当前服务器支持的命令不香吗?
在这里插入图片描述

2.help命令

上面是看数据类型的全部命令,这个是看具体某个命令的用法,而不用眼花缭乱的去上面那一坨里找到这个命令再查看。比如查看lpush的用法(lpush是list类型的)。他连哪个版本出的,属于哪个数据类型(group)都告诉你了。
在这里插入图片描述

接下来言归正传谈论string

二、string只代表字符串类型吗?

  • 字符串类型
  • int类型
  • bitmap类型(下个篇幅重点)

三、正反向索引

1.描述

string类型再存储的时候会创建两套索引:正向索引、反向索引。
比如我们执行命令 set key hello

2.正向索引

h e l l o
0 1 2 3 4

3.反向索引

h e l l o
-5 -4 -3 -2 -1

4、验证正反向索引

下图对照上图一起看,我不会骗你的。实战出真理。

在这里插入图片描述

四、如何查看数据类型

1、type

比如type我们刚才set的key
在这里插入图片描述
那我们继续set一个数字呢?然后类型是啥?
在这里插入图片描述
为什么还是string?不是说string可以代表int类型吗? type只能看大类型,看具体小类型需要object encoding

2、object encoding

我怎么知道object有encoding这个关键字?object help可看。无须理会emb是什么意思,知道str是字符串就行。

在这里插入图片描述
正因为他是int类型,所以我们才能执行incr、decrby等命令。
但是我们给刚才的key1 append一个其他数字,然后再看类型,这时候就不是int了,也很好理解,int都不支持append操作,字符串才支持,append完你在incr等命令,就又会变成int。
在这里插入图片描述

五、底层存储单位

1、小常识:二进制安全

  • 字节流
  • 字符流

redis选择的字节流,因为字节在各大语言等都一样,比如各大语言交互都用json/xml统一一样,而不是序列化的方式,因为序列化的话可能每种语言不同,都需要自己写编码器解码器,你认为你那边int是4字节,我这边认为是2字节。结果对不上。我用2字节取你4字节溢出了。 所以redis选择字节流。所以你set a 111,OBJECT encoding a是int类型,但是strlen a 是3,他不会认为你是int类型就占用4个字节,长度就是4,他只会认为你每个1代表一个字符一个字节,所以长度是3
在这里插入图片描述

2、底层存储

如果存中文会占用几个字节?
显然是根据编码来的,UTF-8一个中文占用3字节,GBK一个中文占用2字节。

先来看utf8的情况
在这里插入图片描述
再来看gbk的情况
在这里插入图片描述

很明显发现utf8是3个字节存储空间。gbk是占用两个字节。
我用的xshell,xshell更改编码的方法如下
文件–属性–终端–编码

所以服务端存储的编码与客户端的编码必须一致,否则就会出现比如服务端用UTF-8存储的中文,但是客户端用的GBK取出的。那么会导致乱码,因为字节数都不一样。
可以验证下:(目前是UTF8)

可以明显发现取出utf8存储的中文就能正常显示,取出gbk存储的中文则是一个不是我们想要的结果。
在这里插入图片描述
redis-cli --raw 可以显示出中文。

六、Redis作者细腻的地方

Redis作者很细腻的,处处为我们广大开发着想。

  • 比如为什么要有getset这种命令?

getset设置新值并将老值返回,遇到这种场景的话可以减少IO,一个命令直接搞定,否则你可能需要写2-3个命令才能完成这个操作。

七、总结

  • help命令
  • string能存哪些类型
  • 正反向索引
  • type&object encoding
  • 底层存字节
发布了28 篇原创文章 · 获赞 33 · 访问量 8292

猜你喜欢

转载自blog.csdn.net/ctwctw/article/details/104995246