前言

最近研究下redis源码,现在从最基本的命令行操作来分析,redis是如何处理命令操作的

1. redis的set命令操作

我们在redis-cli执行下面的命令

  1. set c c

debug 发现 t_string.c ,执行了 void setCommand(client *c) 

其中 client 的定义,client 有非常多的参数,现在我们比较关心的是 querybuf 参数

  1. typedef struct client {
    ....
  1. sds querybuf; /* 请求参数 */
  1. } redisClient;

2. 命令解析

redis-cli 客户端执行 set c  c  命令后,redis服务会保存到 client的querybuf 字段里面,数据封装成  "*3\r\n$3\r\nset\r\n$1\r\nc\r\n$1\r\nc\r\n"

其中 *3 表示 有3个数据, \r\n 作为分隔符

$3 代表 第一个参数有3个字节数目,就是 set

$1 代表 第二个参数c

3.解析好参数后,最后调用 setGenericCommand

继续debug ,发现 key 和value 都会保存成 robj对象,

robj 定义

  1. typedef struct redisObject {
  2.  
  3. // 类型 (包含 字符串,int 等等)
  4. unsigned type: 4;
  5.  
  6. // 编码
  7. unsigned encoding: 4;
  8. int refcount;
  9. void *ptr;//字符串地址(通过不同的类型,保存了不同的指针对象)
  10.  
  11. } robj;

验证下,是不是我们刚才提交的  set c  c ,其中 key 是 c  value  也是 c

打印一下,果然是我们输入的参数,

继续 debug,先  lookupKeyWrite 查找key是否存在,然后 setKey 写入redis的hashtable中,最后发送通知,写入回复 reply

总结

  1. set 命令是在 t_string.c 文件的 setCommand函数处理的
  2. key和value 会包装成 robj 对象
  3. 判断是否有过期时间,有的话,会处理 expire ,其中 setExpire 会处理过期时间
  4. setKey函数会写入redis的hashtable中
  5. 调用 notifyKeyspaceEvent 事件通知
  6. 调用 addReply方法,写入回复到客户端

redis分析系列之set命令的更多相关文章

  1. 【redis 学习系列07】Redis小功能大用处01 慢查询分析以及Redis Shell

    Redis提供了5种数据结构已经足够强大,但除此之外,Redis还提供了诸如慢查询分析.功能强大的Redis Shell.Pipeline.事务与Lua脚本.Bitmaps.HyperLogLog.发 ...

  2. 分布式缓存技术redis学习系列(二)——详细讲解redis数据结构(内存模型)以及常用命令

    Redis数据类型 与Memcached仅支持简单的key-value结构的数据记录不同,Redis支持的数据类型要丰富得多,常用的数据类型主要有五种:String.List.Hash.Set和Sor ...

  3. Redis系列之-—Redis-cli命令总结【转】

    Redis-cli命令最新总结 参考资料: http://redisdoc.com/ 或者 http://doc.redisfans.com http://redis.io/commands 一. 进 ...

  4. 分布式缓存技术redis学习系列(五)——redis实战(redis与spring整合,分布式锁实现)

    本文是redis学习系列的第五篇,点击下面链接可回看系列文章 <redis简介以及linux上的安装> <详细讲解redis数据结构(内存模型)以及常用命令> <redi ...

  5. 分布式缓存技术redis学习系列

    分布式缓存技术redis学习系列(一)--redis简介以及linux上的安装以及操作redis问题整理 分布式缓存技术redis学习系列(二)--详细讲解redis数据结构(内存模型)以及常用命令 ...

  6. MyCat源码分析系列之——BufferPool与缓存机制

    更多MyCat源码分析,请戳MyCat源码分析系列 BufferPool MyCat的缓冲区采用的是java.nio.ByteBuffer,由BufferPool类统一管理,相关的设置在SystemC ...

  7. MyCat源码分析系列之——前后端验证

    更多MyCat源码分析,请戳MyCat源码分析系列 MyCat前端验证 MyCat的前端验证指的是应用连接MyCat时进行的用户验证过程,如使用MySQL客户端时,$ mysql -uroot -pr ...

  8. MyCat源码分析系列之——配置信息和启动流程

    更多MyCat源码分析,请戳MyCat源码分析系列 MyCat配置信息 除了一些默认的配置参数,大多数的MyCat配置信息是通过读取若干.xml/.properties文件获取的,主要包括: 1)se ...

  9. 分布式缓存技术redis学习系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)

    本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...

随机推荐

  1. github项目托管方式(看项目自身是否自带有 .git)

    一.本地仓库和远程仓库建立联系 方式一:项目自身带有 .git文件的[自身就是一个本地仓库的](这里咱以vue-cli3项目为例) 1.创建自带.git本地仓库:创建一个叫 my-vue 的项目 2. ...

  2. 51Nod 1264:线段相交(计算几何)

    51Nod 1264:线段相交 Decision 给出平面上两条线段的两个端点,判断这两条线段是否相交(有一个公共点或有部分重合认为相交). 如果相交,输出"Yes",否则输出&q ...

  3. Pydantic使用

    Pydantic可以在代码运行时提供类型提示, 数据校验失败时提供友好的错误提示, 使用Python的类型注解来进行数据校验和settings管理 一般使用 from datetime import ...

  4. RabbitMQ学习笔记二:Java实现RabbitMQ

    本地安装好RabbitMQ Server后,就可以在Java语言中使用RabbitMQ了. RabbitMQ是一个消息代理,从"生产者"接收消息并传递消息至"消费者&qu ...

  5. vue源码中computed和watch的解读

    computed 会基于其内部的 响应式依赖 进行缓存. 只在相关 响应式依赖发生改变 时 它们才会重新求值. 可以在将模板中使用的常量放在计算属性中. watch 监听数据变化,并在监听回调函数中返 ...

  6. k8s loadbalancer与ingress实践

    k8s可以通过三种方式将集群内服务暴露到外网,分别是NodePort.LoadBalancer.Ingress,其中NodePort作为基础通信形式我们在<k8s网络模型与集群通信>中进行 ...

  7. Google面试评分卡

    Google对工程面试之前,会让面试人员填一张评分卡,以加强面试官对你的理解,大致内容如下: 0 - 对于相关技术领域还不熟悉. 1 - 可以读懂这个领域的基础知识. 2 - 可以实现一些小的改动,清 ...

  8. Git 远程分支常用操作

    # 查看远程仓库推拉地址,分支信息,分支跟踪情况等 git remote show origin # 拉取远程仓库的变更内容到本地 git fetch origin # 拉取并合并仓库的变更内容到本地 ...

  9. linux系统内置函数

    一.action函数 在/etc/init.d/functions中有一个系统自带的函数 source /etc/init.d/functions  #启用系统函数脚本 action "输出 ...

  10. 双buffer实现无锁切换

    大家好,我是雨乐! 在我们的工作中,多线程编程是一件太稀松平常的事.在多线程环境下操作一个变量或者一块缓存,如果不对其操作加以限制,轻则变量值或者缓存内容不符合预期,重则会产生异常,导致进程崩溃.为了 ...