编程界的小学生
一、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
- 底层存字节
八、个人公众号
微信公众号【Java码农社区】