深入Redis技术内幕:从开发一个GPT模块开始

你距离拥有一个GPT还有3步,编码、编译、启动...

编写FakeGPT代码

价值亿元的AI模块搞里头

c 复制代码
// fakegpt.c
int FakeGPT_chat(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
    ...###价值亿元的AI代码太过惊世骇俗,手动马赛克###...
    return REDISMODULE_OK;
}

int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
    // 初始化模块API
    if (RedisModule_Init(ctx, "FakeGPT", 1, REDISMODULE_APIVER_1) == REDISMODULE_ERR) 
        return REDISMODULE_ERR;
    // 创建命令 FakeGPT.chat
    if (RedisModule_CreateCommand(ctx, "FakeGPT.chat", FakeGPT_chat, "fast random", 1, 1, 1) == REDISMODULE_ERR)
        return REDISMODULE_ERR;
    return REDISMODULE_OK;
}

将自定义模块代码编译为动态链接库备用

bash 复制代码
 gcc -o fakegpt.so -fPIC -shared fakegpt.c

编译Redis源码

  • Windows系统编译Redis源码除了需要gccmake外,还需要依赖一些系统头文件,需要先安装msys2环境,然后在msys2中安装gcc、make、pkg-config包之后就可以编译Redis源码了(如果已经安装过WSL,可以直接在WSL环境下编译,没安装过WSL则推荐使用更轻量级的msys2)
bash 复制代码
# https://www.msys2.org 下载安装完成后,通过以下命令安装相关工具包
# git 用于下载源码,gcc、make、pkg-config 用于编译源码,gdb用于调试
pacman -S gcc make pkg-config git gdb
# 安装成功后,下载Redis源码
cd ~
git clone -b 6.0 https://github.com/redis/redis.git
# 编译源码,noopt表示编译器不做优化,方便后续调试代码
cd redis && make noopt
# Hint: It's a good idea to run 'make test' ;) 当你看到这段输出的时候,表示编译完成了
  • macOS和Linux环境下编译Redis源码属于有手就行,这里不再赘述...

见证时刻的奇迹

启动Redis服务器:

启动Redis命令行工具,加载自定义模块,然后:

完美!

调试源码

GDB调试Redis

VSCode调试Redis

Windows下配置launch.json

json 复制代码
{
   "version": "0.2.0",
   "configurations": [
      {
           "name": "GDB-redis-server",
           "type": "cppdbg",
           "request": "launch",
           "program": "${workspaceFolder}/src/redis-server.exe",
           "args": [],
           "stopAtEntry": true,
           "cwd": "${workspaceFolder}",
           "environment": [],
           "externalConsole": false,
           "MIMode": "gdb",
           "miDebuggerPath": "C:\Users\...\env\msys2\usr\bin\gdb.exe"
      }
  ]
}

macOS下gdb需要配置安全证书和sodu权限,比较麻烦,推荐使用lldb调试,配置launch.json如下

json 复制代码
{
   "version": "0.2.0",
   "configurations": [
      {
           "name": "Redis Server Run",
           "type": "cppdbg",
           "request": "launch",
           "program": "${workspaceFolder}/src/redis-server",
           "args": [],
           "stopAtEntry": true,
           "cwd": "${workspaceFolder}",
           "environment": [],
           "externalConsole": false,
           "MIMode": "lldb"
      }
  ]
}

VSCode也支持在DEBUG CONSOLE执行原生gdb/lldb命令

如果调试过程中发现无法定位到源码(比如通过gdb命令行打断点显示的是一个内存地址而不是符号),打开src/.make-settings文件,查看上一次编译的优化参数是否为-O0

通过执行一次make distclean清除编译缓存,然后再重新编译make noopt

Tips:Windows下低版本(16.x)的VSCode可能会导致gdb启动失败,如果通过gdb命令行调试没问题,VSCode启动gdb报错的情况,建议升级VSCode到最新版本再尝试

相关推荐
jvmind_dev4 分钟前
频繁 new JedisCluster 之后,对象池为什么回不去了?
java·后端
掘金者阿豪5 分钟前
给你的AI龙虾打造一间像素办公室!Star Office UI部署+公网访问完整教程
后端
学长毕业设计15 分钟前
基于SpringBoot的咖啡馆管理系统的设计与实现(源码+文档+讲解视频)
java·spring boot·后端
骇客野人18 分钟前
SpringBoot业财一体化系统设计和落地实施方案
java·spring boot·后端
学长毕业设计22 分钟前
基于SpringBoot的教学资源推荐系统的设计与实现(源码+文档+讲解视频)
java·spring boot·后端
用户8508692761528 分钟前
一次线上文件上传 Bug 引发的区块链分布式存储深度排查
后端
名字还没想好☜29 分钟前
Java Cleaner 实战:替代废弃的 finalize() 做堆外资源清理,以及强引用导致永不回收的坑
java·后端·spring
大勇前进42 分钟前
写了5年代码,我重新开始认真写单元测试
后端
长大19881 小时前
TypeScript 真的是 JavaScript 的"平替"吗?5 个真实项目踩坑记录
后端
泡海椒1 小时前
响应自动序列化:JSON 响应一键转 Java 实体对象,JQuick-Curl 第三方接口调用不再手动解析
后端·github