首页 > 数据库 >redis 5.0命令处理流程

redis 5.0命令处理流程

时间:2024-03-31 22:56:42浏览次数:23  
标签:5.0 调用 流程 redis server 命令 client lookupCommandByCString 客户端

redis 5.0 命令处理流程

初始化事件驱动数据结构:

initServer 中调用 aeCreateEventLoop 方法初始化 server.el 属性,然后调用 listenToPort 方法设置 listen 的 fd,并为这些 fd 绑定读事件 anetTcpHandler。

anetTcpHandler 循环 1000 次 accept,然后对于连接调用 acceptCommonHandler 方法。


acceptCommandHandler方法:

根据客户端fd创建client结构。

  • 分配内存给client。
  • 设置fd的非阻塞、不延迟、和tcpkeepalive、并为客户端fd绑定读事件readQueryFromClient。
  • 默认为客户端绑定db 0,设置c->db = &server.db[0]
  • 自增server.next_client_id。
  • 把client添加server.clients链表,并设置c->client_list_node = listLast(server.clients)保证能快速找到客户端在server中的所处的位置。
  • 把客户端根据其id插入server.client_index的基数数。

如果当前客户端数量大于最大客户端数量就返回-ERR max number of clients reached,并释放客户端。

如果开启了保护模式,则对非本地请求都直接返回并释放客户端。


readQueryFromClient方法:

如果不是master模式,则调用processInputBuffer方法进行处理。

processInputBuffer

  • 设置当前客户端:server.current_client = c
  • 根据第一个字节是否为*确定是否为multibulk模式,是则设置为PROTO_REQ_MULTIBULK,否则设置为PROTO_REQ_INLINE
  • 解析参数
    • 如果为PROTO_REQ_INLINE模式,则调用processInlineBuffer方法。
    • 如果为PROTO_REQ_MULTIBULK模式,则调用processMultibulkBuffer方法。
  • 如果第一个参数等于quit,则回复+OK\r\n,添加标志CLIENT_CLOSE_AFTER_REPLY。
  • 查询并调用命令:processCommand
    • 查询命令:lookupCommand,从server.commands字典中查询。
    • 查询成功则调用call方法来调用命令,调用c->cmd->proc函数指针来调用命令。

server.commands命令表初始化

initServerConfig方法中,创建2个字典,分别是server.command、server.orig_command,然后调用populateCommandTable方法把redisCommandTable数组中的命令都加到server.command和server.orig_command中。然后再单独设置以下命令:

server.delCommand = lookupCommandByCString("del");
server.multiCommand = lookupCommandByCString("multi");
server.lpushCommand = lookupCommandByCString("lpush");
server.lpopCommand = lookupCommandByCString("lpop");
server.rpopCommand = lookupCommandByCString("rpop");
server.zpopminCommand = lookupCommandByCString("zpopmin");
server.zpopmaxCommand = lookupCommandByCString("zpopmax");
server.sremCommand = lookupCommandByCString("srem");
server.execCommand = lookupCommandByCString("exec");
server.expireCommand = lookupCommandByCString("expire");
server.pexpireCommand = lookupCommandByCString("pexpire");
server.xclaimCommand = lookupCommandByCString("xclaim");
server.xgroupCommand = lookupCommandByCString("xgroup");

标签:5.0,调用,流程,redis,server,命令,client,lookupCommandByCString,客户端
From: https://www.cnblogs.com/Lht1/p/18107431

相关文章

  • Springboot + redis分布式锁
    1.引入redis和redisson<!--redis--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!......
  • 七、使用jsPlumb实现流程图功能--Connection事件和拦截器
    在一个交互式的流程图配置中,连线可能是最高频的操作。jsPlumb也提供了相对应的事件和拦截器可以让开发人员做一些符合需求的功能。一、Connection事件Connection事件是在行为发生之后的一个通知,Connection常用的一些事件有:EVENT_CONNECTION:连线创建之后触发的事件。EVENT_CON......
  • redis集群
    redis主从复制主要解决单机机器故障,容量瓶颈等问题主从复制作用:1可以为redis提供多个副本,一个master可以有多个slave,一个slave只能由一个master实现方法:1通过slaveof命令  异步执行复制过程在从节点执行> slav......
  • Redis基础命令集详解
    1.启动Redis服务•Windows:你可以双击redis-server.exe启动服务。•Linux/Mac:在终端运行redis-server即可开启服务。2.连接Redis客户端•使用命令行工具进入Redis世界:redis-cli或redis-cli-h主机地址-p端口号-a密码(如果需要远程连接或设置密码的话)。......
  • Redis 全景图(1)--- 关于 Redis 的6大模块
    这是我第一次尝试以长文的形式写一篇Redis的总结文章。这篇文章我想写很久了,只是一直碍于我对Redis的掌握没有那么的好,因此迟迟未动笔。这几天,我一直在看各种不同类型的Redis文章,通过阅读这些文章,引发了我对于Redis这个大知识点的很多思考。我看过的一篇又一篇的文章都帮助着将......
  • 【Redis】Redis 生产问题。如何确保缓存和数据库数据的一致性? 常见的缓存更新策略?
    目录缓存穿透缓存穿透解决办法缓存击穿击穿解决办法?缓存穿透和缓存击穿的区别?缓存雪崩雪崩解决办法?如何确保缓存和数据库数据的一致性?常见的缓存更新策略?缓存穿透定义:缓存穿透说简单点就是大量请求的key是不合理的,根本不存在于缓存中,也不存在于数据库中。这......
  • 游戏开发:生产可用的登录验证流程(C/S模式)
    如何设计一个生产可用的登录验证流程(C/S模式)平台SDK(SoftwareDevelopmentKit)软件中央数据后台(CenterServer)软件服务端(Server)软件客户端(Client)渠道平台登录验证(channelloginverify)软件开发期需要依据平台SDK规范接入平台的账号登录验证流程(比如AppleStore),发起登录时首......
  • Redis
    Redis1、Nosql概述大数据时代大数据一般的数据库无法进行分析处理1.1、为什么要用Nosql1、单机MySQL的年代!2、Memcached(缓存)+MySQL+垂直拆分(读写分离)网站80%的情况都在读,每次去查询数据库就十分麻烦!所以为了减轻数据的压力,我们可以使用缓存来保证效率!发展过程:优......
  • vue3+threejs新手从零开发卡牌游戏(二十二):添加己方游戏流程(先后手、抽牌、主要阶段、战
    首先在utils/common.ts里定义一些流程相关的变量:constflow=ref([//游戏流程{name:"抽卡阶段"},{name:"主要阶段"},{name:"战斗阶段"},{name:"结束阶段"}])constflowIndex=ref(......
  • 干货分享│金属板材成形极限FLC测量流程介绍(XTDIC-FLC;三维全场应变测量)
    板料成形是一种材料加工技术,在航空、航天、船舶、汽车等行业领域被广泛应用。板料的成形极限,是衡量板料塑性成形性能的重要指标。以极限应变构成的成形极限图(FLD),常被用于板料受到拉伸、胀形或拉伸胀形结合时能够达到的变形程度,为评价板料成形性能以及改进成形工艺提供技术基础......