redis分析系列之set命令
前言
最近研究下redis源码,现在从最基本的命令行操作来分析,redis是如何处理命令操作的
1. redis的set命令操作
我们在redis-cli执行下面的命令
set c c
debug 发现 t_string.c ,执行了 void setCommand(client *c)
其中 client 的定义,client 有非常多的参数,现在我们比较关心的是 querybuf 参数
typedef struct client {   
   ....
sds querybuf; /* 请求参数 */
} 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 定义
typedef struct redisObject { 
    // 类型 (包含 字符串,int 等等)
    unsigned type: 4;
    // 编码
    unsigned encoding: 4;
    int refcount;
    void *ptr;//字符串地址(通过不同的类型,保存了不同的指针对象)
} robj;

验证下,是不是我们刚才提交的 set c c ,其中 key 是 c value 也是 c
打印一下,果然是我们输入的参数,

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

总结
- set 命令是在 t_string.c 文件的 setCommand函数处理的
- key和value 会包装成 robj 对象
- 判断是否有过期时间,有的话,会处理 expire ,其中 setExpire 会处理过期时间
- setKey函数会写入redis的hashtable中
- 调用 notifyKeyspaceEvent 事件通知
- 调用 addReply方法,写入回复到客户端
redis分析系列之set命令的更多相关文章
- 【redis 学习系列07】Redis小功能大用处01 慢查询分析以及Redis Shell
		Redis提供了5种数据结构已经足够强大,但除此之外,Redis还提供了诸如慢查询分析.功能强大的Redis Shell.Pipeline.事务与Lua脚本.Bitmaps.HyperLogLog.发 ... 
- 分布式缓存技术redis学习系列(二)——详细讲解redis数据结构(内存模型)以及常用命令
		Redis数据类型 与Memcached仅支持简单的key-value结构的数据记录不同,Redis支持的数据类型要丰富得多,常用的数据类型主要有五种:String.List.Hash.Set和Sor ... 
- Redis系列之-—Redis-cli命令总结【转】
		Redis-cli命令最新总结 参考资料: http://redisdoc.com/ 或者 http://doc.redisfans.com http://redis.io/commands 一. 进 ... 
- 分布式缓存技术redis学习系列(五)——redis实战(redis与spring整合,分布式锁实现)
		本文是redis学习系列的第五篇,点击下面链接可回看系列文章 <redis简介以及linux上的安装> <详细讲解redis数据结构(内存模型)以及常用命令> <redi ... 
- 分布式缓存技术redis学习系列
		分布式缓存技术redis学习系列(一)--redis简介以及linux上的安装以及操作redis问题整理 分布式缓存技术redis学习系列(二)--详细讲解redis数据结构(内存模型)以及常用命令 ... 
- MyCat源码分析系列之——BufferPool与缓存机制
		更多MyCat源码分析,请戳MyCat源码分析系列 BufferPool MyCat的缓冲区采用的是java.nio.ByteBuffer,由BufferPool类统一管理,相关的设置在SystemC ... 
- MyCat源码分析系列之——前后端验证
		更多MyCat源码分析,请戳MyCat源码分析系列 MyCat前端验证 MyCat的前端验证指的是应用连接MyCat时进行的用户验证过程,如使用MySQL客户端时,$ mysql -uroot -pr ... 
- MyCat源码分析系列之——配置信息和启动流程
		更多MyCat源码分析,请戳MyCat源码分析系列 MyCat配置信息 除了一些默认的配置参数,大多数的MyCat配置信息是通过读取若干.xml/.properties文件获取的,主要包括: 1)se ... 
- 分布式缓存技术redis学习系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)
		本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ... 
随机推荐
- 1226 - One Unit Machine
			1226 - One Unit Machine PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB ... 
- C++单元测试框架gtest使用
			作用 作为代码编码人员,写完代码,不仅要保证编译通过和运行,还要保证逻辑尽量正确.单元测试是对软件可测试最小单元的检查和校验.单元测试与其他测试不同,单元测试可看作是编码工作的一部分,应该由程序员完成 ... 
- rsync 守护进程及实时同步
			目录 rsync 守护进程及实时同步 rsync简介 rsync特性 rsync应用场景 cp命令 scp命令 rsync的传输方式 rsync的传输模式 rsync实际使用 rsync命令 案例 r ... 
- 【入门到精通】❤️「Java工程师全栈知识路线」
			持续更新中- Vue前端开发 章节 内容 实践练习 Vue.js高效前端开发 • (实践练习) 第1章 Vue.js高效前端开发 • [ 一.初识Vue.js ] 第2章 Vue.js高效前端开发 • ... 
- 2 - 基于ELK的ElasticSearch 7.8.x技术整理 - java操作篇 - 更新完毕
			3.java操作ES篇 3.1.摸索java链接ES的流程 自行创建一个maven项目 3.1.1.依赖管理 点击查看代码 <properties> <ES-version>7 ... 
- MongoDB高级应用之数据转存与恢复(5)
			1.MongoDB索引 1.1.创建索引 db.books.ensureIndex{{number:1}} 创建索引同时指定索引的名字 db.books.ensureIndex({number:1}, ... 
- python + requests发起请求,接口返回400,报错“Unexpected character encountered while parsing value: G. Path”
			完整报错信息如下: {'errors': {'': ["Unexpected character encountered while parsing value: G. Path '', l ... 
- python3 f-string格式化字符串的高级用法
			从Python 3.6开始,f-string是格式化字符串的一种很好的新方法.与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快! 在Python 3.6之前,有两种将Python表 ... 
- axios导出 excel
			this.axios({ methods: 'get', url: url, responseType: 'blob' }).then(res => { const blob = new Blo ... 
- JPA与hibernate-------JPA01
			ORM概述 ORM(Object-Relational Mapping) 表示对象关系映射.在面向对象的软件开发中,通过ORM,就可以把对象映射到关系型数据库中.只要有一套程序能够做到建立对象与数据库 ... 
