`
xpenxpen
  • 浏览: 723348 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

redis源码阅读笔记(11)——服务器与客户端

阅读更多
1.高层视角

可首先阅读《Redis设计与实现》中的服务器与客户端
原文已经相当详细了,可以代码结合文章细细品读。

2. 服务器启动过程

1)初始化服务器全局状态。  initServerConfig()
2)Sentinel功能初始化 initSentinel()
3)载入配置文件。    loadServerConfig()
4)创建 daemon 进程。   daemonize()
5)初始化服务器功能模块。 initServer()
6)打印 ASCII LOGO。   redisAsciiArt()
6)从AOF文件或者RDB文件中载入数据。   loadDataFromDisk()
7)开始事件循环。   aeMain()
8)服务器关闭,停止事件循环。  aeDeleteEventLoop()

其中第5部分的细节是

初始化 Redis 进程的信号功能。  setupSignalHandlers()
初始化日志功能。   openlog()
初始化客户端功能。
初始化共享对象。   createSharedObjects()
初始化事件功能。   aeCreateEventLoop()
初始化数据库。
初始化网络连接。   listenToPort()
初始化订阅与发布功能。
初始化各个统计变量。  resetServerStats()
关联服务器常规操作(cron job)到时间事件,关联客户端应答处理器到文件事件。  aeCreateTimeEvent()
如果 AOF 功能已打开,那么打开或创建 AOF 文件。
设置内存限制。
初始化cluster。    clusterInit()
初始化复制功能有关的脚本缓存。   replicationScriptCacheInit()
初始化 Lua 脚本环境。   scriptingInit()
初始化慢查询功能。    slowlogInit()
初始化后台操作线程。  bioInit()

3.命令表
一个命令用redisCommand 结构表示,redisCommandTable是所有命令的表格。
struct redisCommand redisCommandTable[] = {
    {"get",getCommand,2,"r",0,NULL,1,1,1,0,0},
    {"set",setCommand,-3,"wm",0,NULL,1,1,1,0,0},
    //......
};

struct redisCommand {
    // 命令名字
    char *name;
    // 实现函数
    redisCommandProc *proc;
    // 参数个数
    int arity;
    // 字符串表示的 FLAG
    char *sflags; /* Flags as string representation, one char per flag. */
    // 实际 FLAG
    int flags;    /* The actual flags, obtained from the 'sflags' field. */
    //......
};

注意redisCommandTable这种带大括号的初始化方法,
这是C语言里对struct类型的变量的一种初始化方法——顺序初始化。
顺序初始化的特点是: 按照成员定义的顺序,从前到后逐个初始化。
优点就是可以把一条记录写在一行里,不用一个个属性用.(点)的方式来一行行设置了。维护起来比较直观方便。

然后为了快速定位命令,redis用一个哈希表维护了可以执行的所有命令。
populateCommandTable函数用来初始化这张命令表,这个函数在initServerConfig里被调用。
struct redisServer {
    // 命令表(受到 rename 配置选项的作用)
    dict *commands;             /* Command table */
    // 命令表(无 rename 配置选项的作用)
    dict *orig_commands;        /* Command table before command renaming. */
};

void populateCommandTable(void) {
    int j;

    // 命令的数量
    int numcommands = sizeof(redisCommandTable)/sizeof(struct redisCommand);

    for (j = 0; j < numcommands; j++) {
        
        // 指定命令
        struct redisCommand *c = redisCommandTable+j;
        int retval1, retval2;
		
        // 将命令关联到命令表
        retval1 = dictAdd(server.commands, sdsnew(c->name), c);
        //将命令也关联到原始命令表
        //原始命令表不会受 redis.conf 中命令改名的影响
        retval2 = dictAdd(server.orig_commands, sdsnew(c->name), c);
    }
}


4.命令行
redis用了一个自己写的命令行类库linenoise,只有1千行代码,但功能可谓强大,支持许多锦上添花的功能:
历史记录功能,按上下键可以查看自己输过的命令
自动补全功能,按tab键可以自动补全命令
多种颜色显示,比如输入help get帮助信息是彩色的
但是貌似没有复制粘贴功能?

其他类似的类库
名称代码行数使用它的软件
readline3万行bash,mysql,mutt
libedit2万行
linenoise1千行Redis,MongoDB,Android
jlinegroovy


分享到:
评论

相关推荐

    redis源码阅读笔记(6)——ziplist

    Redis是一款高性能的键值对数据库,其内部使用了许多优化的数据结构来存储数据,其中ziplist是Redis为了节省内存而设计...在阅读Redis源码时,深入分析ziplist的实现细节将有助于我们更好地理解和调试Redis的内存管理。

    redis源码阅读笔记(10)——事件

    在Redis源码阅读笔记(10)——事件中,我们将探讨Redis如何利用事件模型来实现非阻塞I/O,以及相关的编程模型如Reactor模式和NIO。 Redis使用了一个基于epoll的事件处理器,epoll是Linux系统提供的一种高效I/O多路...

    redis源码阅读笔记(7)——对象

    这篇源码阅读笔记主要关注Redis中的对象系统,它是Redis实现高效数据操作的关键。 在Redis中,每个数据都有一个特定的对象类型,比如`OBJ_STRING`、`OBJ_HASH`等,这些类型定义了数据的存储方式和操作行为。对象...

    redis源码阅读笔记(1)——sds

    本篇笔记将聚焦于Redis源码中的“sds”(Simple Dynamic Strings,简单动态字符串)部分,这是Redis中处理字符串的基础数据结构。 首先,我们要明白sds是什么。在C语言中,字符串是以字符数组的形式存在的,而sds是...

    redis源码阅读中文分析注释

    redis源码阅读中文分析注释

    狂神redis源码笔记.rar

    通过阅读“狂神redis源码笔记”和解压的“redis-study”文件,你将能够深入理解Redis的内部运作,掌握Java客户端的使用技巧,提升在实际项目中运用Redis的能力。这包括但不限于了解Redis的设计模式、源码实现细节、...

    Redis全套学习笔记 (带章节目录) 完整版pdf

    Redis,即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。...本文适合Redis初学者和进阶者阅读,是一份全面而实用的学习笔记。

    scala连接redis哨兵模式 demo 使用scala的redis库(csdn)————程序.pdf

    使用Scala的Redis库可以方便地与Redis服务器进行交互,实现数据的存取操作。从提供的文件内容来看,具体知识点包括: 1. Scala代码示例:文件中给出了一段Scala代码示例,该示例展示了如何使用Scala连接到配置了...

    安卓Andriod源码——简易微信客户端和服务器源码.zip

    这篇文档将深入解析安卓Andriod源码中的简易微信客户端和服务器源码,帮助开发者理解和学习如何构建类似的通信应用。Android平台是全球最受欢迎的移动操作系统之一,为开发者提供了丰富的API和工具来创建各种应用...

    redis/phpredis源码及文档

    Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 附件里面包括redis源码,phpredis源码,redis指令及文档

    Redis32,64客户端和服务器以及客户端图形化软件

    客户端用于与Redis服务器交互,执行读写操作或查看数据库状态。通过命令行,用户可以执行诸如`SET key value`(设置键值对)、`GET key`(获取键对应的值)、`LRANGE list 0 -1`(获取列表的全部元素)等操作。对于...

    Redis Windows源码

    对于Windows开发者,可以选择C#、Java、Python等语言的客户端库,如StackExchange.Redis(C#)或redis-py(Python),与Redis服务器进行交互。 9. 性能优化: 在Windows环境中,考虑性能优化时,需要关注内存管理...

    redis的可视化工具——redisdesktopmanager

    它提供了直观的界面,使得在本地或远程服务器上执行常见的Redis操作变得更加便捷。 该工具的主要特点包括: 1. **多平台支持**:Redis Desktop Manager可在Windows、Mac OS X和Linux等操作系统上运行,适应不同...

    Redis全套学习笔记-带章节目录-114页.pdf

    Redis全套学习笔记 Redis是一种基于内存的NoSQL数据库,具有高性能、可扩展性和灵活性等特点。以下是Redis的详细知识点: 安装和启动 * 安装Redis可以通过下载软件包或使用yum、apt-get等安装工具进行安装。 * ...

    Redis客户端及服务器

    1. 安装与启动:Redis服务器通常通过源码编译或二进制包安装。下载Redis后,解压并执行`make`进行编译,然后通过`redis-server`命令启动服务。默认监听6379端口。 2. 配置文件:`redis.conf`是Redis的主要配置文件,...

    redis 源码和windows桌面管理工具

    它支持连接到本地或远程的Redis服务器,使得非命令行用户也能轻松地与Redis交互,提升了工作效率。 在使用这些资源时,开发者需要了解Redis的基本概念和命令,例如`SET`、`GET`、`KEYS`、`EXPIRE`等,以及如何配置...

    基于muduo网络库的集群聊天服务器和客户端源码,使用nginx tcp负载均衡,mysql数据库,redis发布-订阅.zip

    基于muduo网络库的集群聊天服务器和客户端源码,使用nginx tcp负载均衡,mysql数据库,redis发布-订阅数据库,redis发布-订阅 基于muduo网络库的集群聊天服务器和客户端源码,使用nginx tcp负载均衡,mysql数据库,...

    redis源码安装以及配置

    以下是对Redis源码安装和配置的详细过程,以及与PHP集成的讲解。 **一、Redis源码安装** 1. **下载源码** 首先,我们需要从Redis官方网站或者GitHub仓库下载源码。在这个例子中,我们使用的是`redis-2.8.9.tar.gz...

Global site tag (gtag.js) - Google Analytics