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高级应用( ...
随机推荐
- 【LeetCode】829. Consecutive Numbers Sum 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 数学方法 日期 题目地址:https://leetc ...
- 【LeetCode】823. Binary Trees With Factors 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划 相似题目 参考资料 日期 题目地址:htt ...
- 【LeetCode】796. Rotate String 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 【LeetCode】491. Increasing Subsequences 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 第十七个知识点:描述和比较DES和AES的轮结构
第十七个知识点:描述和比较DES和AES的轮结构 这是密码学52件事中的第17篇.本周我们描述和比较DES和AES的结构. DES和AES都是迭代分组密码的例子.分组密码通过重复使用一个简单的轮函数来 ...
- Chapter 5 Interaction
目录 5.1 Interaction requires a joint intervention 5.2 Identifying interaction 5.3 Counterfactual resp ...
- 实战!退出登录时如何借助外力使JWT令牌失效?
大家好,我是不才陈某~ 今天这篇文章介绍一下如何在修改密码.修改权限.注销等场景下使JWT失效. 文章的目录如下: 解决方案 JWT最大的一个优势在于它是无状态的,自身包含了认证鉴权所需要的所有信息, ...
- Android程序设计基础 • 【目录】
章节 内容 实践练习 Android程序设计基础作业目录 (作业笔记) 第1章 Android程序设计基础 • [第1章 Android程序入门] 第2章 Android程序设计基础 • [第2章 基 ...
- 【MySQL作业】MySQL函数——美和易思数学函数和控制流函数应用习题
点击打开所使用到的数据库>>> 1.添加一条商品记录. 商品编码 goodsCode 商品名 goodsName 种类 category 单价 unitPrice 02005 夏 ...
- Zookeeper基础教程(三):Zookeeper连接使用—zkCli
上一篇介绍Zookeeper的安装,并介绍了使用ZooInspector连接Zookeeper,这里主要介绍以命令行的形式介绍Zookeeper 假如我们已经安装了Zookeeper集群,集群中的安装 ...