Redis高性能原因:

1)Redis是基于内存的存储数据库,绝大部分的命令处理只是纯粹的内存操作,内存的读写速度非常快。
2)Redis是单进程线程的服务(实际上一个正在运行的Redis Server肯定不止一个线程,但只有一个线程来处理网络请求),避免了不必要的上下文切换,同时不存在加锁/释放锁等同步操作。
3)Redis使用多路I/O复用模型(select、poll、epoll),可以高效处理大量并发连接。
4)Redis中的数据结构是专门设计的,增、删、改、查等操作相对简单。

Redis主要优点:

1)Redis是内存型的数据库,也就是说Redis中的key-value对是存储在内存中的,因而效率比磁盘型的快。
2)Redis的工作模式为单线程,不需要线程间的同步操作。Redis采用单线程主要因为其瓶颈在内存和带宽上,而不是CPU。
3)Redis中key-value的value不仅可以是字符串,也可以是复杂的数据类型,如链表、集合、散列表等。
4)Redis支持数据持久化,可以采用RDB、AOF、RDB&AOF三种方案。计算机重启后可以在磁盘中进行数据恢复。
5)Redis支持主从结构,可以利用从实例进行数据备份。

二进制安全

二进制安全(Binary-safe)是指一个系统、函数或库在处理二进制数据时,可以正确地识别和处理所有的字节,包括NULL字节(值为0的字节)和非打印字符。

在许多语言(如C/C++)中,字符串默认以NULL字节('\0')作为结束标记。这意味着,如果在字符串中间的位置有一个NULL字节,那么字符串就会在这个位置被截断。例如,如果你有一个字符串"Hello\0World",那么大多数C语言的字符串操作函数只会识别到"Hello"部分。

然而,在处理二进制数据(如图片、音频、视频或者加密的数据)时,可能会在任意位置遇到NULL字节。如果一个系统、函数或库不是二进制安全的,那么它可能无法正确处理这些数据。

二进制安全的函数或库会准确地处理包含任意字节的数据。它们通常需要额外的参数或者机制来指定数据的长度,而不是依赖于NULL字节来判断数据的结束位置。

例如,在C语言中,函数memcpy()就是二进制安全的,它可以正确地复制包含NULL字节的数据;而函数strcpy()就不是二进制安全的,因为它会在遇到NULL字节时停止复制。

“通俗地讲,C语言中,用“\0”表示字符串的结束,如果字符串中本身就有“\0”字符,字符串就会被截断,即非二进制安全;若通过某种机制,保证读写字符串时不损害其内容,则是二进制安全。”

柔性数组

  • 柔性数组(Flexible Array Members)是C语言标准C99引入的一种特殊的数据结构。它被定义在一个结构体的最后一个成员,并且没有指定数组的大小。
  • 柔性数组成员通常用于包含一些可变数量的数据,其大小在运行时决定。当分配内存给这个结构体时,你可以按照实际需要的数据量来分配更多的内存,这部分内存将被arr数组使用。
  • 数组和结构体其他成员在内存中是连续的,可以提高访问速度。但是需要注意的是,柔性数组只能定义在结构体的最后,并且一个结构体中只能有一个柔性数组。

redis的sds是如何保证字符串的二进制安全呢?


Architecture
0 声望0 粉丝

知其然, 更要知其所以然~


« 上一篇
http状态码
下一篇 »
Redis RDB