Redis 7.0 源码环境搭建与阅读技巧
天下武功,无坚不摧,唯快不破!我的名字叫 Redis,全称是 Remote Dictionary Server。
有人说,组 CP,除了要了解她外,还要给机会让她了解你。
那么,作为开发工程师的你,是否愿意认真阅读此心法抓住机会来了解我,运用到你的系统中提升性能。
我遵守 BSD 协议,由意大利人 Salvatore Sanfilippo 使用 C 语言编写的一个基于内存实现的键值型非关系(NoSQL)数据库。
我是一个内存数据结构存储、可作为数据库、缓存、消息队列、流处理引擎,速度快是我的特点。
根据官方数据,Redis 的 QPS 可以达到约 100000(每秒请求数)。
我提供了 String(字符串)、Hashes(散列表)、Lists(列表)、Sets(无序集合)、Sorted Sets(可根据范围查询的排序集合)、Bitmap(位图)、HyperLogLog、Geospatial (地理空间)和 Stream(流)等数据结构。
数据结构的使用技法和实现原理是你核心筑基必经之路,好好修炼。
除此之外,我还具有主从复制、Lua 脚本、LRU 淘汰机制,事务和不同级别的磁盘持久化功能,并通过 Redis Sentinel(哨兵)和 Redis Cluster(Redis 集群)实现高可用,这部分内容,重中之重,高手必备。
我还支持一些原子操作,支持异步复制实现快速非阻塞同步和自动重连,另外需要注意的是,推荐你在 Lunix /Unix 系统上部署,官方并没有在 Windows 系统上构建安装包。
1.1.1 Redis 能干啥
程许媛:“Redis 你说了这么多?你能干啥?别王婆卖瓜,自卖自夸。”
缓存
这是我被使用的最多的场景,能极大提升应用程序的性能。当单个 MySQL 读写压力比较大,场景是读多写少的时候,把热点数据存储在更快的存储中,也就是 Redis。
读取数据
- 先从缓存中读取数据是否命中。
- 缓存未命中,则查询数据库获取数据,并把数据写到 Redis 中,让后续读取相同数据的请求命中缓存,最后把数据返回给调用者。
- 缓存命中,直接返回。
写数据
至于修改数据,程序员想了很多方法去尽可能保证 Redis 与 MySQL 的数据一致性。
- 先写 MySQL 数据,再删除 Redis 缓存数据。
- 监听 MySQL binlog 日志,修改 Redis 数据。
排行榜
使用 MySQL 等关系型数据库,非常麻烦,性能也差,而直接使用 Redis SortedSet 轻松搞定。
消息队列
简单消息队列,在一些不需要高可靠,但是数据量大会给 MySQL 带来非常大压力的场景,比如:到货通知、未读消息、邮件发送之列的。程序员可以使用 Lists 或者 Stream 来实现一个队列。
分布式锁
Redisson 这个框架,就是使用 Redis 弄出了一套分布式锁解决方案。
计数器
Redis 的命令都是原子性的,程序员可以轻松地利用 INCR,DECR命令来构建计数器系统。
还有很多场景,我会在后面章节详细道来,学完之后,我相信你定能筑基锻体,念头通达,升职加薪。
千古无同局,叶底能否藏花,我们未来印证,愿此心法能让你学有所成,你来,我等着。
1.1.2 源代码编译
经过上一篇的 Redis 简介,我相信你一定想继续了解 Redis。本章节会通过源代码编译来安装 Redis 7.0.5,让你在自己的机器上搭建一套可以 Debug 的 Redis 7.0.5 源码环境。
这也是后续原理分析的基础,推荐你部署在 macOS 或者 Linux 上搭建,如果你是 Windows 环境,那就搞一个虚拟机在上面装一个 Linux 系统,再继续搭建 Redis 环境。
程许媛:“我的电脑是 mac OS 系统,你就用这个来演示吧。”
获取源代码
有两种方式,第一种是从官网下载 Redis 源码压缩包,如图 1-1 所示。

图 1-1
将压缩包解压得到一个文件夹。
第二种方式,通过 git clone 获取源码。
从 Github 上,使用 git clone https://github.com/redis/redis.git指令下载,下载完成后你会得到如下文件。

图 1-2
进入 redis 目录,使用 git checkout 切换到 7.0.5 这个 tag 。
gir checkout tags/7.0.5 -b 7.0.5
编译 Redis
在编译之前,需要安装一些环境依赖,Redis 是 C 语言编写的,所以还需要 gcc 编译器。
执行 gcc -v判断是否安装了编译器。

图 1-3
没有安装的话,使用如下指令安装。
xcode-select --install
一切准备就绪,进入 redis 的源码目录,执行 make命令,这个就好比 Java 中的 mvn 命令。
make CFLAGS="-g -O0" MALLOC=jemalloc
命令后边的 “-O0” 参数表示告诉编译器不要优化代码,防止你在 Debug 的时候, IDE 里面的 Redis 源码与实际运行的代码对应不上。
MALLOC=jemalloc ,指定在 mac OS 系统上 Redis 使用 jemalloc 内存分配器来分配内存,Linux 默认使用该分配器。
需要注意的是内存碎片自动清理功能只在 jemalloc 内存分配器生效。
如果安装包用于生产环境的 Linux 系统上,那么直接使用指令 make命令即可。
编译成功,将会看到图 1-4 中Hint: It's a good idea to run 'make test' ;),提示我们可以运行单元测试,这一步可以省略。

图 1-4
启动 Redis
编译成功,进入 src 源码目录下,你会看到一个 redis-server 的可执行程序,使用如下指令启动。
./redis-server ../redis.conf

图 1-5
代码调试环境搭建
编译好了,我们还差一个方便阅读和调试源码的工具。为了方便阅读和 debug 源码,极力推荐你使用 CLion 来阅读和调试 Redis 源码,我使用的是 CLion 2021.3 版本。
安装好以后,打开 CLion,点击 open,选择 Redis 源码目录即可。

图 1-6
之后检查下 Run Debug 是否出现这些选项,选择编辑。

图 1-7
选择编辑 redis-server ,指定启动配置文件 redis.conf的目录,保存。

图 1-8
在 server.c 的main() 方法加断点,Debug 启动 redis -server,进行源码 Debug。

图 1-9
大功告成,接下来就可以在 Redis 的知识海洋里呛水了。
目录结构
在知识海洋呛水之前,先来了解下 Redis 的目录结构,从 Redis 整体目录结构来对系统有个全局的认识,了解一个系统的主要组成,同时防止陷入细节或者无从下手。
deps
这个目录主要包含 Redis 所依赖的第三方代码库。
- Jemalloc,内存分配器,默认情况下选择该内存分配器来代替 Linux 系统的 libc-malloc,libc-malloc 性能不高,且碎片化严重。
- hiredis,这是官方 C 语言客户端。
- linenoise 是一种读线替换。它由 Redis 的同一作者开发,但作为一个单独的项目进行管理,并根据需要进行更新。
- lua,顾名思义,就是 lua 相关的功能。
- hdr_histogram,用于生成每个命令的延迟跟踪直方图。
src 目录
这是 Redis 源码的重要组成部分,里面有 commands 和 modules 两个子目录,其余功能模块的源码都在 src 目录下,这是最重要的目录。
modules目录包含了实现Redis module的示例代码,commands里面都是 json 格式的文件,包含了每个指令的元信息。
tests 目录
顾名思义,功能模块测试和单元测试的代码就在这里。
- cluster,Redis Cluster 功能测试。
- sentinel,哨兵集群功能测试。
- unit,单元测试。
- integration,主从复制功能测试。
剩下的 assets、helpers、modules、support 四个目录中是用来支撑测试功能的。
utils 目录
辅助性功能的脚本或者代码,比如用于创建 Redis Cluster 的脚本,lru 算法效果展示代码等。
除此之外,Redis 源码目录还有两个重要的文件,redis.conf 和 sentinel.conf,分别用于配置 Redis 实例运行和哨兵配置。
Redis 7.0 源码环境搭建与阅读技巧的更多相关文章
- spring5.0源码项目搭建
一.准备相应环境以及下载spring项目 Ps:此处只讲解安装gradle 1.JDK安装 2.Idea安装 3.gradle安装 Gradle下载路径:https://services.gradle ...
- Linux Kafka源码环境搭建
本文主要讲述的是如何搭建Kafka的源码环境,主要针对的Linux操作系统下IntelliJ IDEA编译器,其余操作系统或者IDE可以类推. 1.安装和配置JDK确认JDK版本至少为1.7,最好是1 ...
- 【ZooKeeper系列】3.ZooKeeper源码环境搭建
前文阅读: [ZooKeeper系列]1.ZooKeeper单机版.伪集群和集群环境搭建 [ZooKeeper系列]2.用Java实现ZooKeeper API的调用 在系列的前两篇文章中,介绍了Zo ...
- MyBatis源码环境搭建
之前研究mybatis都是参考前面学习的人的一些经验,并没有自己搭建源码环境进行.现在以mybatis3.4.6版本搭建,搭建过程中各种failed,下面大致记录环境搭建过程. 1.mybatis3. ...
- CentOS 7.0源码包搭建LNMP方法分享(实际环境下)
CentOS 7.0编译安装Nginx1.6.0+MySQL5.6.19+PHP5.5.14 一.配置防火墙,开启80端口.3306端口 CentOS 7.0默认使用的是firewall作为防火墙,这 ...
- 1-web应用之LAMP源码环境搭建
目录 一.LAMP环境的介绍 1.LAMP环境的重要性 2.LAMP组件介绍 二.Apache源码安装 1.下载Apache以及相关依赖包 2.安装Apache以及相关 ...
- 【一步一步】Spring 源码环境搭建
平时项目中基本上都会用到spring,但是源码还没有深入的了解过.趁这段时间稍微空闲点,开始研究下spring 源码.下面是spring 源码的环境搭建. 主要分为如下步骤: ①安装jdk,gradl ...
- Tomcat7源码环境搭建
一.下载Tomcat7源码 从官网上下载Tomcat源码, http://mirror.bit.edu.cn/apache/tomcat/tomcat-7/v7.0.70/src/apache-t ...
- Spring源码阅读 源码环境搭建(一)
ring 源码阅读的搭建(一) 一 下载spring源码 进入官方网页:https://spring.io/projects/spring-framework 进入相关的github位置,下载zip包 ...
- Hadoop源码学习笔记之NameNode启动场景流程一:源码环境搭建和项目模块及NameNode结构简单介绍
最近在跟着一个大佬学习Hadoop底层源码及架构等知识点,觉得有必要记录下来这个学习过程.想到了这个废弃已久的blog账号,决定重新开始更新. 主要分以下几步来进行源码学习: 一.搭建源码阅读环境二. ...
随机推荐
- 图像分割_评价指标_PSNR峰值信噪比和SSIM结构相似度
PSNR psnr是"Peak Signal to Noise Ratio"的缩写,即峰值信噪比,是一种评价图像的客观标准. 为了衡量经过处理后的影像品质,我们通常会参考PSNR值 ...
- axios详解以及完整封装方法
""" 一.axios是什么 Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中. 它是 isomorphic 的(即同一套代码可以运行 ...
- 树莓派命令——linux命令tips
sudo python3 test.py 和 python3 test.py 完全不是一个东西,有时候是链接的编译器不同,环境是完全不同,sudo会调用一些无关资源,反而容易造成程序运行失败或浪费cp ...
- 零基础入门——从零开始学习PHP反序列化笔记(二)
魔术方法 魔术方法介绍 __construct() 触发时机:实例化对象之前 构造函数,在实例化一个对象的时候,首先会去自动执行的一个方法; <?php class User { public ...
- cdn 引入的资源需要通过 externals 排除打包哦~
cdn 指的是通过相互连接的网络系统,使用最靠近用户的服务器将音乐.图片等资源以高效率和低成本的方式将内容传递给用户. 在 webpack 中,我们可能会将引入的第三方资源会编译成单独的文件,作为静态 ...
- 浏览器端模块化方式es module详解
在es module出现之前还有社区推出amd和cmd的规范,这两者还有其特定的编写方式,使用起来不算很方便.es module被官方推出来就成为了浏览器端实现模块化的一个很好的方案. 想要在浏览 ...
- python处理类似json的文件
前言 有些文件长得像json的键值对格式,但又不完全是.有时需要提取出其中某些值,可以先手动处理成json文件,然后用python的json模块. 示例1:每行键值对 提取其中的caseId的值 {& ...
- 【go笔记】简单的http服务
前言 Go语言通过内置的标准库net/http可以非常方便地实现web服务.不借助任何框架,单凭标准库,50行代码内即可实现简单的web服务. http的ListenAndServe()函数原型: f ...
- CVE-2020-0796 SMB远程代码执行漏洞复现
前言: 这个windows的永恒之黑漏洞,不得不复现一下啦! 这个漏洞诸多大佬都已经复现了,现在跟随大佬的脚步,逐个复现一下: 可参考:https://www.adminxe.com/1220.htm ...
- selenium + python自动化环境搭建
Selenium是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firef ...