乐趣区

关于redis:每个程序员都应该知道的-Redis-知识-String-底层原理

本文将讲述如下内容:

1.Redis 中 Srting 类型的底层实现原理

  1. 通过 String 底层实现原理的学习,咱们能够学习到哪些底层优化办法

3.Redis 中对于 String 命令介绍

咱们晓得 Redis 是由 C 语言实现的,在介绍 Sring 类型的实现之前咱们先温习一下 C 语言的字符串类型。C 语言中的字符串是以空字符结尾的字符数组,具体阐明见下图:

C 语言中的字符串
1、Redis 中 Srting 类型的底层实现原理

Redis 中没有间接应用 C 语言的字符串,而是构建了一套本人的形象类型,名为简略动静字符串,简称 SDS。

如果你看 Redis 源码会发现这样一种构造体:

SDS 的定义
len 记录 buf 数组中曾经应用字节的数量,也就是 SDS 类型所保留的字符串的长度。

free 记录了 buf 数组中未应用的字节数量

buf 是存储字节的数组,用于保留字符串从下面的构造咱们能够看出:

Redis 的 String 类型封装成 SDS 构造,体现了用空间换工夫的算法思维。就义了一些空间,来换取更快的查问效率。比如说构造体中 len 的值 5 示意这个 SDS 保留了一个五个字节长的字符串,O (1) 的工夫复杂度就能够查问出后果。

Redis 的定位就是数据库层之上的一层缓存层,所以处处都要思考高效。其实缓存自身也是用空间换工夫思维的体现。

解决了 C 字符串容易缓冲区溢出的问题。因为 C 字符串不记录字符串长度,所以通过 C 语言的 strcat 函数拼接字符串的时候,容易造成拼接后的字符串超过了自身申请的字符串的长度,造成缓冲区溢出。SDS 就不会呈现这个问题

空间预调配:在申请空间的时候事后调配好肯定长度的空间。当空间不够用的时候,通过 SDS 提供的 API 能够从新申请一片更大的空间。

惰性开释空间:当申请的空间不再被应用的时候,不是立即开释空间,而是在 SDS 中的 free 属性将这些字节的数量记录下来,期待未来应用

二进制平安:封装后的 SDS 解决了二进制平安问题,所以在 Redis 的 String 类型中能够缓存各种类型数据。SDS 的 API 会以解决二进制的形式来解决 SDS 寄存在 buf 数组里的数据,不会对其中的数据做任何限度、过滤、或假如,数据在写入时是什么样的,它被读取时就是什么样的。

总结一下下面所说的,次要是两个核心思想。第一是 SDS 这种构造的实现;第二是空间换工夫的思维。前面也会有文章专门介绍空间换工夫、工夫换空间两种思维的具体利用。

2、底层优化办法学习

从下面的介绍咱们能够学习到哪些底层优化办法呢?上文重复提到用空间换工夫思维,我想大多数开发人员在理论我的项目开发中都或多或少地应用过这种思维。Redis、Memcache 的设计思路就是这种思维的具体体现。除了 Redis,MySQL 中也有大量使用,比如说索引就是其中之一。在操作系统、计算机体系结构设计中也存在大量这种设计。

除了空间换工夫,内存预调配、惰性开释也是很好的优化办法。比如说 PHP-FPM 过程治理形式中的动静形式(Dynamic),启动的时候事后生成 N 个 Worker 过程,当访问量减少时能够减少 Worker 过程的数量,当访问量降下来后再销毁掉或者保留这些减少的 Worker 过程,方面前面应用。

除了以上办法,还有很多值得学习和借鉴的办法,在此不再一一列举。如果这篇文章对你有帮忙,欢送转发给你的敌人,你们能够一起学习成长。如果有谬误的中央或者表白不清晰的中央,也欢送在评论区指出来。大家的反对就是我的能源,心愿咱们能够一起提高!

3、以下是 Redis 中 String 命令的介绍,能够联合后面讲的原理来学习这些命令,肯定会有不一样的领会。

退出移动版