百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Redis 7.0 源码调试环境搭建与源码导读技巧

mhr18 2024-11-20 18:37 30 浏览 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。

读取数据

  1. 先从缓存中读取数据是否命中。
  2. 缓存未命中,则查询数据库获取数据,并把数据写到 Redis 中,让后续读取相同数据的请求命中缓存,最后把数据返回给调用者。
  3. 缓存命中,直接返回。

写数据

至于修改数据,程序员想了很多方法去尽可能保证 Redis 与 MySQL 的数据一致性。

  • 先写 MySQL 数据,再删除 Redis 缓存数据。
  • 监听 MySQL binlog 日志,修改 Redis 数据。

排行榜

使用 MySQL 等关系型数据库,非常麻烦,性能也差,而直接使用 Redis SortedSet 轻松搞定。

消息队列

简单消息队列,在一些不需要高可靠,但是数据量大会给 MySQL 带来非常大压力的场景,比如:到货通知、未读消息、邮件发送之列的。程序员可以使用 Lists 来实现一个队列。

分布式锁

Redisson 这个框架,就是使用 Redis 弄出了一套分布式锁解决方案。

计数器

Redis 的命令都是原子性的,程序员可以轻松地利用 INCRDECR命令来构建计数器系统。

还有很多场景,我会在后面章节详细道来,学完之后,我相信你定能筑基锻体,念头通达,升职加薪。

千古无同局,叶底能否藏花,我们未来印证,愿此心法能让你学有所成,你来,我等着。

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

图 1-1

将压缩包解压得到一个文件夹。

第二种方式,通过 git clone 获取源码。

从 Github 上,使用 git clone https://github.com/redis/redis.git指令下载,下载完成后你会得到如下文件。

图 1-2

图 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

图 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 默认使用该分配器,如果是 Linux 系统,无需指定该参数。

内存碎片自动清理功能只在 jemalloc 内存分配器生效,所以才加上这个参数指定内存分配器。

如果在 Linux 系统上用于生产环境,那么直接使用指令 make命令即可。

编译成功,将会看到图 1-4 中Hint: It's a good idea to run 'make test' ;),提示我们可以运行单元测试,这一步可以省略。

图 1-4

图 1-4

启动 Redis

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

./redis-server ../redis.conf

图 1-5

图 1-5

代码调试环境搭建

编译好了,我们还差一个方便阅读和调试源码的工具。为了方便阅读和 debug 源码,极力推荐你使用 CLion 来阅读和调试 Redis 源码,我使用的是 CLion 2021.3 版本,它支持 Makefile 的项目。

安装好以后,打开 CLion,点击 open,选择 Redis 源码目录即可。

图 1-6

图 1-6

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

图 1-7

图 1-7

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

图 1-8

图 1-8

server.cmain() 方法加断点,Debug 启动 redis -server,进行源码 Debug。

图 1-9

图 1-9

大功告成,接下来就可以在 Redis 的知识海洋里呛水了。

目录结构

在知识海洋呛水之前,先来了解下 Redis 的目录结构,从 Redis 整体目录结构来对系统有个全局的认识,了解一个系统的主要组成,同时防止陷入细节或者无从下手。

deps

这个目录主要包含 Redis 所依赖的第三方代码库。

  • Jemalloc,内存分配器,默认情况下选择该内存分配器来代替 Linux 系统的 libc-malloc,libc-malloc 性能不高,且碎片化严重。
  • hiredis,这是官方 C 语言客户端。
  • linenoise 是一种读线替换。它由 Redis 的 同一作者开发,但作为一个单独的项目进行管理,并根据需要进行更新。
  • lua,顾名思义,就是 lua 相关的功能。
  • hdr_histogram,用于生成每个命令的延迟跟踪直方图。

src 目录

这是 Redis 源码的重要组成部分,里面有 commandsmodules 两个子目录,其余功能模块的源码都在 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 实例运行和哨兵配置。


来源:https://mp.weixin.qq.com/s/pXqtEiRWt1nou7T2AueHtw

作者:码哥字节

相关推荐

【推荐】一个开源免费、AI 驱动的智能数据管理系统,支持多数据库

如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!.前言在当今数据驱动的时代,高效、智能地管理数据已成为企业和个人不可或缺的能力。为了满足这一需求,我们推出了这款开...

Pure Storage推出统一数据管理云平台及新闪存阵列

PureStorage公司今日推出企业数据云(EnterpriseDataCloud),称其为组织在混合环境中存储、管理和使用数据方式的全面架构升级。该公司表示,EDC使组织能够在本地、云端和混...

对Java学习的10条建议(对java课程的建议)

不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...

SQLShift 重大更新:Oracle→PostgreSQL 存储过程转换功能上线!

官网:https://sqlshift.cn/6月,SQLShift迎来重大版本更新!作为国内首个支持Oracle->OceanBase存储过程智能转换的工具,SQLShift在过去一...

JDK21有没有什么稳定、简单又强势的特性?

佳未阿里云开发者2025年03月05日08:30浙江阿里妹导读这篇文章主要介绍了Java虚拟线程的发展及其在AJDK中的实现和优化。阅前声明:本文介绍的内容基于AJDK21.0.5[1]以及以上...

「松勤软件测试」网站总出现404 bug?总结8个原因,不信解决不了

在进行网站测试的时候,有没有碰到过网站崩溃,打不开,出现404错误等各种现象,如果你碰到了,那么恭喜你,你的网站出问题了,是什么原因导致网站出问题呢,根据松勤软件测试的总结如下:01数据库中的表空间不...

Java面试题及答案最全总结(2025版)

大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...

数据库日常运维工作内容(数据库日常运维 工作内容)

#数据库日常运维工作包括哪些内容?#数据库日常运维工作是一个涵盖多个层面的综合性任务,以下是详细的分类和内容说明:一、数据库运维核心工作监控与告警性能监控:实时监控CPU、内存、I/O、连接数、锁等待...

分布式之系统底层原理(上)(底层分布式技术)

作者:allanpan,腾讯IEG高级后台工程师导言分布式事务是分布式系统必不可少的组成部分,基本上只要实现一个分布式系统就逃不开对分布式事务的支持。本文从分布式事务这个概念切入,尝试对分布式事务...

oracle 死锁了怎么办?kill 进程 直接上干货

1、查看死锁是否存在selectusername,lockwait,status,machine,programfromv$sessionwheresidin(selectsession...

SpringBoot 各种分页查询方式详解(全网最全)

一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...

《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略

《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...

LoadRunner(loadrunner录制不到脚本)

一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...

Redis数据类型介绍(redis 数据类型)

介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...

RMAN备份监控及优化总结(rman备份原理)

今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...

取消回复欢迎 发表评论: