Redis7.0源码调试环境搭建及源码引导技巧我叫Redis,全名RemoteDictionaryServer。有人说,组CP,除了认识她,还要给她认识你的机会。那么,作为开发工程师的你是否愿意仔细阅读这个方法,抓住机会了解我,并将其应用到你的系统中来提高性能。我遵守BSD许可证,这是由意大利人SalvatoreSanfilippo用C语言编写的键值非关系(NoSQL)数据库的内存实现。我是内存中的数据结构存储,可以作为数据库、缓存、消息队列、流处理引擎。速度快是我的特点。根据官方数据,Redis的QPS可以达到10万左右(每秒请求数)。我提供String(字符串)、Hashes(哈希表)、Lists(列表)、Sets(无序集合)、SortedSets(可以根据范围查询的排序集合)、Bitmap(位图)、HyperLogLog、Geospatial(地理空间)以及Stream(流)等数据结构。数据结构的使用技巧和实现原理是你打好核心基础的必由之路,所以要好好练习。另外我还有主从复制,Lua脚本,LRU淘汰机制,事务和不同级别的磁盘持久化,通过RedisSentinel(哨兵)和RedisCluster(Redis集群)实现高可用,这部分,最重要的东西,高手必备。我还支持一些原子操作和异步复制来实现快速非阻塞同步和自动重连。另外需要注意的是,建议大家部署在Lunix/Unix系统上。官方安装包不是在Windows系统上构建的。1.1.1Redis能干什么程旭源:“Redis,你说了这么多?你能干什么?不卖瓜,卖瓜吹牛。”这是我用的最多的场景,可以极大的提升应用的性能。.当单个MySQL的读写压力比较大,而且是读多写少的场景时,将热点数据存放在速度更快的存储中,即Redis。读取数据,先从缓存中读取数据,看是否命中。如果缓存未命中,则查询数据库获取数据,并将数据写入Redis,以便后续读取相同数据的请求命中缓存,最后将数据返回给调用者。缓存命中,直接返回。写数据对于修改数据,程序员想了很多办法,尽量保证Redis和MySQL的数据一致性。先写入MySQL数据,再删除Redis缓存数据。监听MySQLbinlog日志,修改Redis数据。排行榜用的是MySQL等关系型数据库,很麻烦,性能也不好,但是直接用RedisSortedSet好办。消息队列是一个简单的消息队列,在一些对可靠性要求不高,但数据量大给MySQL造成很大压力的场景下,如:到达通知、未读消息、邮件发送等。程序员可以使用列表来实现队列。分布式锁Redisson框架使用Redis创建分布式锁解决方案。计数器Redis命令是原子的,程序员可以很容易地使用INCR和DECR命令来构建计数器系统。场景还是很多的,我会在后面的章节详细讲解,学完相信你一定能打基础强身健体,领悟你的想法,升职加薪。千古无一,夜帝能不能藏花,以后再证明,希望这个方法能让你有所收获,你来,我等。1.1.2源码编译经过上一篇关于Redis的介绍,相信大家一定想继续了解Redis。本章将通过源码编译的方式安装Redis7.0.5,让您在自己的机器上搭建一个可以调试的Redis7.0.5源码环境。这也是后面原理分析的基础。建议您将其部署在macOS或Linux上。如果是Windows环境,那就搭建一个虚拟机,在上面安装Linux系统,然后继续搭建Redis环境。程旭源:“我的电脑是MacOS系统,你可以用这个来演示。”获取源代码的方式有两种。首先是从官网下载Redis源码压缩包,如图1-1所示。图1-1解压压缩包得到一个文件夹。第二种方式是通过gitclone获取源码。从Github,使用gitclonehttps://github.com/redis/redis.git命令下载。下载完成后,您将获得以下文件。图1-2进入redis目录,使用gitcheckout切换到7.0.5标签。gircheckouttags/7.0.5-b7.0.5编译Redis在编译前需要安装一些环境依赖。Redis是用C语言写的,所以还需要gcc编译器。执行gcc-v判断编译器是否安装。如果没有安装图1-3,使用如下命令安装。xcode-select--install万事俱备,进入redis的源代码目录,执行make命令。您可以将其与Java中的mvn命令进行比较。makeCFLAGS="-g-O0"MALLOC=jemalloc命令后面的"-O0"参数表示告诉编译器不要优化代码,防止IDE中的Redis源代码与实际运行代码不对应。正在调试。MALLOC=jemalloc,指定Redis在MacOS系统上使用jemalloc内存分配器,Linux默认使用该分配器。如果是Linux系统,则无需指定该参数。内存碎片自动清理功能只在jemalloc内存分配器中有效,所以增加这个参数来指定内存分配器。如果是在Linux系统上的生产环境中使用,那么直接使用命令make即可。如果编译成功,会看到图1-4中的Hint:It'sagoodideatorun'maketest';),提示我们可以运行单元测试,这一步可以省略。图1-4启动Redis编译成功,进入src源码目录,会看到一个redis-server可执行程序,使用如下命令启动。./redis-server../redis.conf图1-5代码调试环境搭建编译完成。我们仍然需要一个阅读和调试源代码的工具。为了方便阅读和调试源码,强烈推荐您使用CLion阅读和调试Redis源码。我使用的是支持Makefile项目的CLion2021.3。安装完成后,打开CLion,点击打开,选择Redis源码目录。在图1-6之后,查看RunDebug中是否出现这些选项,选择Edit。图1-7选择编辑redis-server,指定启动配置文件redis.conf所在目录,并保存。图1-8在server.c的main()方法中添加断点,Debug启动redis-server,进行源码调试。图1-9大功告成,接下来就可以沉浸在Redis的知识海洋中了。目录结构在知识的汪洋大海前,先了解一下Redis的目录结构。从Redis整体的目录结构,我们可以对系统有一个全局的了解,了解一个系统的主要组成部分,防止卡在细节上或者无从下手。deps目录主要包含Redis依赖的第三方代码库。内存分配器jemalloc默认被选中,用来替代linux系统的libc-malloc。libc-malloc性能不高,碎片严重。hiredis,官方C语言客户端。linenoise是读取行的替代品。它由与Redis相同的作者开发,但作为一个单独的项目进行管理并根据需要进行更新。lua,顾名思义,就是lua相关的函数。hdr_histogram,为每个命令生成延迟跟踪直方图。src目录是Redis源码的重要组成部分。有两个子目录,命令和模块。其他功能模块的源码都在src目录下,这是最重要的目录。modules目录包含了实现Redis模块的示例代码,commands都是json格式的文件,其中包含了每条命令的meta信息。tests目录,顾名思义,就是功能模块测试和单元测试代码所在的地方。cluster,Redis集群功能测试。哨兵,哨兵集群功能测试。单元,单元测试。集成、主从复制功能测试。剩下的assets、helpers、modules、support四个目录用来支撑测试功能。utils目录下辅助功能的脚本或代码,比如创建RedisClusters的脚本,展示lru算法效果的代码等。另外,Redis源码目录下还有两个重要的文件,redis.conf和sentinel.conf,分别用于配置Redis实例运行和sentinel配置。
