当前位置: 首页 > news >正文

Linux搭建redis调试环境

Linux环境调试redis

  • Linux环境搭建
    • 安装VSCode
    • 加载redis源码
  • Windows环境搭建
  • redis 调用堆栈介绍
  • 后言

Linux环境搭建

安装VSCode

进入VsCode官网下载对应版本的安装包,以ubuntu的安装包(.dep)为例。
(1)安装。

sudo dpkg -i xxxx.dep

执行信息:

正在选中未选择的软件包 code。
(正在读取数据库 ... 系统当前共安装有 234542 个文件和目录。)
正准备解包 code_1.72.2-1665614327_amd64.deb  ...
正在解包 code (1.72.2-1665614327) ...
正在设置 code (1.72.2-1665614327) ...
正在处理用于 gnome-menus (3.13.3-6ubuntu3.1) 的触发器 ...
正在处理用于 desktop-file-utils (0.22-1ubuntu5.2) 的触发器 ...
正在处理用于 bamfdaemon (0.5.3~bzr0+16.04.20180209-0ubuntu1) 的触发器 ...
Rebuilding /usr/share/applications/bamf-2.index...
正在处理用于 mime-support (3.59ubuntu1) 的触发器 ...
正在处理用于 shared-mime-info (1.5-2ubuntu0.2) 的触发器 ...

(2)启动VSCode,进入VSCode扩展安装C/C++插件。
vscode_c_and_cpp

加载redis源码

(1)下载redis源码。

git clone https://gitee.com/mirrors/redis.git -b 6.0

(2)使用VSCode打开下载的redis文件夹。
(3)在redis文件夹下的.vscode创建tasks.json和launch.json。
tasks.json

{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "build-redis",
            "command": "/usr/bin/make",
            "args": [
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "调试器生成的任务。"
        }
    ],
    "version": "2.0.0"
}

launch.json

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "启动 redis",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/src/redis-server",
            "args": ["redis.conf"],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "将反汇编风格设置为 Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "build-redis",
            "miDebuggerPath": "/usr/bin/gdb"
        }
    ]
}

(4) 启动调试。
start_debug
(5)设置断点就可以进行调试了。

Windows环境搭建

(1)按照虚拟机(VMware+Ubuntu)和vscode。
(2)在 vscode 安装 remote-ssh和remote-ssh:editing Configuration Files插件,连接到虚拟机。
(3)vscode安装C/C++和C/C++ Extension Pack插件。
(4)根据个人喜好,vscode安装其他插件:vscode-lua、cmake、Project Manager。
remote_ssh
cpp_and_c
lua_vscode
cmake_vscode
pm_vscode

redis 调用堆栈介绍

启动调试后,在调用堆栈有redis启动的相关线程。可以看到redis不是单线程的,所说的redis单线程是指命令处理、逻辑处理是单线程。就是不管有多少条连接去操作redis的数据,redis对命令的处理都在一个线程完成。

redis不是单线程
redis-server
主线程
命令处理
网络事件的监听
bio_close_file
后台线程,异步关闭大文件
bio_aof_fsync
后台线程,aof持久化, 异步刷盘
bio_lazy_free
异步清理大块内存
io_thd_1
IO操作线程
io_thd_2
IO操作线程
io_thd_3
IO操作线程
jemalloc_bg_thd
jemalloc后台线程,内存池管理
  1. redis-server是主线程,所说的redis是单线程主要指redis-server这个线程,用于处理命令。
  2. bio开头的线程是后台IO线程,bio_close_file的作用是关闭大文件。比如调用close(fd)时,当fd对应的文件比较大时,就会通过这个线程来关闭文件。redis做持久化时,需要将内存中的数据刷到磁盘中,redis会fork一个子进程,在子进程中进行持久化,持久化过程中产生的rdb文件储存着内存中的数据,这个rdb文件是一个比较大的文件,这就涉及到关闭大文件的问题,redis就是通过bio_close_file线程来关闭大文件。
  3. bio开头的线程是后台IO线程,bio_aof_fsync是aof持久化(当前redis进程中直接进行刷盘)刷盘后台线程。即当前命令和数据在当前进程、线程直接刷到磁盘中。
  4. io_thd_* 是redis支持的开启多个线程进行读写IO操作。
  5. jemalloc_bg_thd是redis使用的内存池,做内存管理相关工作。

后言

本专栏知识点是通过<零声教育>的系统学习,进行梳理总结写下文章,对c/c++linux系统提升感兴趣的读者,可以点击链接,详细查看详细的服务:C/C++服务器课程

相关文章:

  • 精确的数字-C++数据类型
  • C# 中的多线程和异步编程
  • 前端初识算法
  • SQL->基础->进阶
  • keepalived实现nginx负载均衡机高可用
  • 如何通过优化 Python 中的 GPU 使用率将视频处理速度提高 5 倍(教程含源码)
  • python获取文件夹下所有图片目录
  • 【MySQL】慢SQL搜集工具、SQL脱敏聚合处理
  • 手机号发验证码实现用户注册登录
  • 程序员缺乏经验的 7 种表现,你中了几个?
  • Spring框架中的核心技术之AOP
  • 用户体验与响应式字体二三事|rem单位与flexible.js、rpx单位与css媒体查询
  • 408 | 【2009年】计算机统考真题 自用回顾知识点整理
  • MyMusic 重点实现
  • 云计算敏捷团队的 10 个最佳实践工具
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 【Amaple教程】5. 插件
  • dva中组件的懒加载
  • JavaScript服务器推送技术之 WebSocket
  • laravel with 查询列表限制条数
  • Mysql5.6主从复制
  • PAT A1120
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • 多线程事务回滚
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 原生JS动态加载JS、CSS文件及代码脚本
  • #define
  • #QT(TCP网络编程-服务端)
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (二开)Flink 修改源码拓展 SQL 语法
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (十六)Flask之蓝图
  • (十六)串口UART
  • (转)linux下的时间函数使用
  • (转)visual stdio 书签功能介绍
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • ***原理与防范
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET 命令行参数包含应用程序路径吗?
  • .NET构架之我见
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • .net知识和学习方法系列(二十一)CLR-枚举
  • .NET中使用Protobuffer 实现序列化和反序列化
  • .pyc文件是什么?
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • [2019.3.5]BZOJ1934 [Shoi2007]Vote 善意的投票
  • [Angular] 笔记 6:ngStyle
  • [BUUCTF]-PWN:wustctf2020_number_game解析(补码,整数漏洞)
  • [C++]AVL树怎么转