Redis二进制安全
为了便于理解,举一个例子:
在很多编辑器中,都会默认/n是换行字符,也就意味着一串字符存进去,涉及/n都会做一个默认的转义处理,这在编辑语言中,C也有这个特性,例如字符串Hello,\0 World!,如果求一下它的长度, strlen("Hello,\0 World!"),返回的会是6,因为C语言中默认\0是字符串结束符,而这,就是非二进制安全的,因为编译器做了默认处理。
而二进制安全的意思是,不会对存入的字节做任何处理,你怎么存我怎么返回,如果你用utf-8编码,存一个 中 字,占 3 个字节,用GBK编码,占两个字节。存一个 10 占用 2 个字节,存 100 要占 3 个字节。 Redis就 用了二进制安全的技术,不将数据进行任何转换,以二进制的方式来什么存什么。为此,同一个 Redis 服务的客户端要统一编码格式,不然数据的读和存会有不一致的问题。
二进制安全定义
Binary-safe is a computer programming term mainly used in connection with string manipulating functions. A binary-safe function is essentially one that treats its input as a raw stream of data without any specific format. It should thus work with all 256 possible values that a character can take (assuming 8-bit characters).
二进制安全是一种主要用于字符串操作函数相关的计算机编程术语。一个二进制安全功能(函数),其本质上将操作输入作为原始的、无任何特殊格式意义的数据流。其在操作上应包含一个字符所能有的256种可能的值(假设为8比特字符)
特殊格式
Special characters:Most functions are not binary safe when using any special or markup characters, such as escape codes or those that expect null-terminated strings. A possible exception would be a function whose explicit purpose is to search for a certain character in a binary string.
大多数的函数当其使用任何特别的或标记字符,如转义码,那些期望 null 结尾的字符串(如C语言中的字符串),不是二进制安全的。一个可能的例外是该函数的明确的目的是在某二进制字符串搜索某特定字符。
数据格式
Data format:Binary safe functions are required when working with data of unknown format (otherwise the format would not be preserved) such as arbitrary files, encrypted data, and the like. The length of the data must be known by the function in order to operate on the entirety of the data.
数据格式:在处理未知格式的数据(尽管此格式无需保存),例如随意的文件、加密数据及类似情况时,二进制安全功能是必须的。函数必须知道数据长度,以便函数操作整体数据。
密码学范畴
二进制安全是指,在传输数据时,保证二进制数据的信息安全,也就是不被篡改、破译等,如果被攻击,能够及时检测出来。 二进制安全包含了密码学的一些东西,比如加解密、签名等。
其他解释
二进制安全功能(binary-safe function)是指在一个二进制文件上所执行的不更改文件内容的功能或者操作。这能够保证文件不会因为某些操作而遭到损坏。二进制数据是按照一串0和1的形式编码的。而绝大多数的程序会给某些特殊的比特串赋予不同的格式代码,所以当用户使用一个程序读取一个二进制文件时,该文件会被按照这个程序的规则进行解释。如果这个程序所使用的格式编码和文件被写入的格式编码一致,那么这个文件可以被正常读取,否则该文件的格式代码之中会被附加一些无意义的符号,也可能会导致文件损坏。如果最严重的情况发生,这样的操作会因为损坏导致你的数据永久丢失。所以你应该将重要的文件保存在只读性的存储介质上,例如光盘。
所以根据维基的解释,可以这么理解二进制安全:
它并不像C语言那样,使用’\0’作为判定一个字符串的结尾,所以如果你保存的字符串内存在’\0’,c语言自会识别前面的数据,后面的就会被忽略掉,所以说是不安全的。而redis是使用了独立的len,这样可以保证即使存储的数据中有’\0’这样的字符,它也是可以支持读取的。而且前面介绍到Redis的string可以支持各种类型(图片、视频、静态文件、css文件等)。
Redis 二进制安全的体现
- 那关系到二进制安全,我们不注意时,会出现一些“看起来”摸不着头脑的问题。
- 比如,当 Terminal 设置的编码格式不同时,其 redis-cli set 的中文字符串在 redis 中存的数据不同。
- 比如都用
set k1 中命令,Terminal 设置的编码格式为 UTF-8 时,“中”是“\xe4\xb8\xad”,用get命令取到的也是此字符串,而用 GBK 存储时为“\xd6\xd0”。用strlen命令返回的结果也不同,前者为 3 后者为 2。这是因为命令行工具会用不同的编码格式将中文编码成不同的二进制数据,然后传给 Redis 存储起来。 - redis 返回的数据默认是用字符串形式返回的。当启动 redis-cli 时加上参数
--raw时,则能获取到 redis 存储的原始二进制数据,此时 Terminal 便也会对这些二进制数据进行解码。如果 Terminal 取到了不同于自己的编码格式的 Terminal set 的数据就会产生乱码问题。 - 因此,在项目工程中,如果有两个服务分别开启一个客户端去连一个 Redis 时,一定要注意编码格式统一的问题。
Redis二进制安全的更多相关文章
- 关于Redis 二进制内容的 可视化尝试
二进制内容的 能否可视化? 网上的资料比较少啊! -------------------------------------------------------------------------- ...
- Redis二进制安全概念
二进制安全是指,在传输数据时,保证二进制数据的信息安全,也就是不被篡改.破译等,如果被攻击,能够及时检测出来. 二进制安全包含了密码学的一些东西,比如加解密.签名等. 举个例子,你把数据1111000 ...
- Redis二进制反转算法分析
在 redis 源码中 dictScan 算法中用到了用到了非常经典的二进制反转算法,该算法对二进制的反转高效而实用,同时对于理解位运算也有非常大的帮助.先呈现源码: /* Function to r ...
- [转]Redis实现分析
Redis实现分析 浏览次数:1018次 KITERUNNER_T 2014年10月19日 字号: 大 中 小 分享到: QQ空间 新浪微博 腾讯微博 人人网 豆瓣网 开心网 更多 1 1 环境准 ...
- Redis 5种主要数据类型和命令
redis是键值对的数据库,有5中主要数据类型: 字符串类型(string),散列类型(hash),列表类型(list),集合类型(set),有序集合类型(zset) 几个基本的命令: KEYS * ...
- 预热一下吧《实现Redis消息队列》
应用场景 为什么要用redis?二进制存储.java序列化传输.IO连接数高.连接频繁 一.序列化 这里编写了一个java序列化的工具,主要是将对象转化为byte数组,和根据byte数组反序列化成ja ...
- go中redis使用小结
最近做了个关于redis的项目,那么就整理下遇到和未遇到的问题 1.redis的简介安装 2.redis的数据结构 3.Redis基本使用 4.Redis的并发 5.Redis的落地 一.redis的 ...
- Linux+Redis实战教程_day02_3、redis数据类型_4、String命令_5、hash命令_6、java操作redis数据库技术
3. redis数据类型[重点] redis 使用的是键值对保存数据.(map) key:全部都是字符串 value:有五种数据类型 Key名:自定义,key名不要过长,否则影响使用效率 Key名不要 ...
- [redis] 介绍安装
redis相关网站 官方网站:http://redis.io/ redis简介 官方介绍:http://redis.io/topics/introduction 百度百科:http://baike.b ...
随机推荐
- Unity使用小剧场—创建的按钮On Click()只有MonoScript怎么办
前言: 在游戏开发过程中遇到了一些小问题,以后都放到小剧场里,今天介绍怎么给按钮赋予方法并解决标题所述问题. 步骤: 1. 不管怎么说,先新建一个按钮 右键场景-[UI]-[Button] 这里会自动 ...
- Proguard结合maven使用
添加插件配置 项目是maven项目,则可以在 pom 的 build 标签下添加插件 <plugin> <groupId>com.github.wvengen</grou ...
- Android 音视频开发(一):PCM 格式音频的播放与采集
什么是 PCM 格式 声音从模拟信号转化为数字信号的技术,经过采样.量化.编码三个过程将模拟信号数字化. 采样 顾名思义,对模拟信号采集样本,该过程是从时间上对信号进行数字化,例如每秒采集 44100 ...
- CentOS7安装Elasticsearch7
下载地址:https://www.elastic.co/cn/downloads/elasticsearch 使用YUM安装 # 下载并安装公共签名密钥 rpm --import https://ar ...
- yum被系统升级锁定
Another app is currently holding the yum lock; waiting for it to exit... 可能是系统自动升级正在运行,yum在锁定状态中. 已经 ...
- 云计算之4---Cockpit
cockpit是一个简单可用的监控工具,你可以添加多个主机进行监控,上限是20台 .也可以使用cockpit来管理虚拟机/容器,也可以安装其他组件开启更多功能. 注意:cockpit没有告警功能,不适 ...
- JVM笔记——类加载
1.在java代码中,类型(如class enum interface)的加载.连接.初始化过程都是在程序运行期完成的.这个特性,使得本为静态语言的java,拥有了动态语言的某些特征 加载:查找并加载 ...
- WebService 适用场合
适用场合 1.跨防火墙通信 如果应用程序有成千上万的用户,而且分布在世界各地,那么客户端和服务器之间的通信将是一个棘手的问题.因为客户端和服务器之间通常会有防火墙或者代理服 务器.在这种情况下,使用D ...
- Choreographer全解析
前言 今天继续屏幕刷新机制的知识讲解,上文说到vsync的处理,每一帧UI的绘制前期处理都在Choreographer中实现,那么今天就来看看这个神奇的舞蹈编舞师是怎么将UI变化反应到屏幕上的. 代码 ...
- node环境使用lowdb轻量数据库以及基本用法
1.安装: npm install lowdb --save 2..引入lowdb,设置表 const low = require('lowdb'); const FileSync = requir ...