当前位置:首页 > 问答 > 正文

Redis本地开发用C语言搞定,手把手教你从零开始跑起来

(来源:知乎专栏《C程序员实战笔记》)

先整明白Redis是个啥玩意儿 Redis说白了就是个超级快的字典盒子(来源:Redis官网介绍),能让你把数据丢在内存里快速存取,比如你写个贪吃蛇游戏,可以用它存玩家分数,比直接写文件快100倍(来源:《Redis设计与实现》第三章),本地开发时用它,相当于给电脑开了个临时数据小黑板,关机就清空,特别适合测试。

装Redis比装软件还简单

  1. 直接官网拖安装包(来源:redis.io/download):

    wget https://download.redis.io/releases/redis-7.0.0.tar.gz
    tar xzf redis-7.0.0.tar.gz
    cd redis-7.0.0
    make

    看到那个蹦出来的redis-server文件没?双击它就能启动!(来源:Redis安装指南)

  2. 懒人终极方案(来源:Homebrew社区): Mac用户直接敲brew install redis,Windows去微软商店搜Redis,点安装就行,跟下个游戏没区别。

    Redis本地开发用C语言搞定,手把手教你从零开始跑起来

C语言连接Redis实战

  1. 准备你的代码武器库:

    #include <hiredis/hiredis.h>  // 去github搜"redis/hiredis"下载这个头文件
    #include <stdio.h>
  2. 连接代码就像交朋友(来源:hiredis示例代码):

    Redis本地开发用C语言搞定,手把手教你从零开始跑起来

    int main() {
        // 打个电话给Redis
        redisContext *c = redisConnect("127.0.0.1", 6379);
        if (c->err) {
            printf("连接失败:%s\n", c->errstr);
            return 1;
        }
        // 往盒子里存个键值对
        redisReply *reply = redisCommand(c, "SET name 小明");
        freeReplyObject(reply);
        // 再取出来看看
        reply = redisCommand(c, "GET name");
        printf("刚存的名字是:%s\n", reply->str);
        freeReplyObject(reply);
        redisFree(c); // 别忘了挂电话
        return 0;
    }

避坑指南(来源:StackOverflow高频问题)

  • 编译报错找不到hiredis?试试gcc -o test test.c -L/usr/local/lib -lhiredis
  • Redis服务器闪退?在终端先输入redis-server --daemonize yes让它后台运行
  • 连接被拒绝?检查是不是忘了启动redis-server,就像没插电就想开电视

搞个实际案例:简易用户系统

// 模拟用户登录(来源:项目实战片段)
void login_user(redisContext *c, char *username) {
    redisReply *reply = redisCommand(c, "INCR login_count:%s", username);
    printf("用户%s第%d次登录\n", username, reply->integer);
    freeReplyObject(reply);
}
// 主函数里这样用
login_user(c, "张三");  // 输出:用户张三第1次登录
login_user(c, "张三");  // 输出:用户张三第2次登录

调试黑科技

  1. 开两个终端,一个运行你的C程序,另一个用redis-cli输入KEYS *查看所有数据
  2. 在代码里插入这段看实时状态:
    reply = redisCommand(c, "INFO memory");
    printf("内存使用情况:%s\n", reply->str);

进阶小技巧(来源:《Redis实战》第五章)

  • EXPIRE key 10给数据设10秒倒计时,适合验证码场景
  • HMSET student name 小明 age 18存对象数据,比多个SET更省事
  • 事务操作:用MULTI开头EXEC像打包快递一样批量执行

最后提醒:本地测试完记得用redis-cli shutdown关服务,不然端口会被一直占用,如果遇到段错误,八成是忘了freeReplyObject,C语言就是这么耿直。