Redis二进制安全

最近有很多小伙伴问我,什么是Redis的二进制安全,其实这个二进制安全,只是Redis当中自有的一个特征,听起来还挺高级,其实很普通的一个概念。

我们都知道,Redis在与外界交互的时候,客户端给到Redis的是字节数组。我们一般面向流的时候,分为字符流和字节流,当客户端通过Socket访问Redis的时候,Redis从Socket中获取到的是字节流,并没有拿字符流。为什么不拿字符流呢?因为如果Redis它只存字节,没有从字节取出东西按着某一编码集转化的话,换言之,只要未来双方客户端有统一的编解码,数据就不会被破坏。

Redis支持的语言超级多,不同语言对于同一类型的宽度理解是不一样的,就会发生溢出。这也是为什么在多语言开发的时候,我们倾向于使用JSON、XML等文本表述数据的方式进行交互,而不使用序列化。因为一旦序列化之后,就需要多增加一步编解码,其实就是统一约定好各数据类型的长度。否则,你那边认为int是两位,我这边认为int是四位,就很容易取出后溢出。那么Redis作为一个非常核心的一个中间商,它就只取字节流。

虽然Redis知道99999是int类型,但是Redis不会将9999按照某一种数据类型进行存储(比如按照一个字节或者两个字节),Redis就是一个字符一个字节,一个字符一个字节。

当存的是汉子“中”的时候,这个strlen却是3

因为终端和Redis之间的通信编码是UTF-8,如果切换成GBK的话,strlen就是2

另外补充一点,此时直接get k2得到的是编码,而不是汉字,因为Redis只会识别ASCII码值,超出ASCII值的就按照十六进制进行显示。

可以通过在启动Redis客户端时添加–raw参数让Redis触发编码集的格式化,从当前的编码集中显示这个汉字。

其实归根结底就是因为Redis是二进制安全的。说白就是Redis底层存储的时候就是按照字节去存的,上层只是在Key上面做一些优化,Key上面如果没有encoding的话,每次进行计算都要判断一下这个能不能转换成目标类型。有了encoding之后,就相当于上一次做的计算转换的目标类型是OK的,只管直接计算就可以了,多多少少能提高数据处理时的效率。

所以使用Redis的时候,一定要在用户端沟通好数据的编码和解码,因为Redis中是没有所谓的数据类型的。
————————————————
版权声明:本文为CSDN博主「FeenixOne」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/FeenixOne/article/details/120158984

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值