redis分析系列之set命令

前言

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

  1. redis的set命令操作

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

java;gutter:true; set c c</p> <pre><code> debug 发现 t_string.c ,执行了 **void setCommand(client *c)** 其中 client 的定义,client 有非常多的参数,现在我们比较关心的是 querybuf 参数 </code></pre> <p>typedef struct client { ....</p> <pre><code> </code></pre> <p>sds querybuf; /<em> 请求参数 </em>/</p> <pre><code> </code></pre> <p>} redisClient;</p> <pre><code> ![redis分析系列之set命令](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230605/2716747-20220128100252591-1206924256.png) 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** ![redis分析系列之set命令](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230605/2716747-20220128101139809-1424652453.png) 继续debug ,发现 key 和value 都会保存成 robj对象, robj 定义 </code></pre> <p>typedef struct redisObject {</p> <pre><code>// 类型 (包含 字符串,int 等等) unsigned type: 4; // 编码 unsigned encoding: 4; int refcount; void *ptr;//字符串地址(通过不同的类型,保存了不同的指针对象) </code></pre> <p>} robj;

redis分析系列之set命令

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

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

redis分析系列之set命令

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

redis分析系列之set命令

总结

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

Original: https://www.cnblogs.com/tomj2ee/p/15852427.html
Author: tomj2ee
Title: redis分析系列之set命令

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/570900/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • mysql查询json数组中的某个值

    mysql5.7版本后支持json字段的检索查询。 使用 字段->’$.json属性’进行查询条件 使用 json_extract 函数查询 , js…

    Java 2023年6月8日
    072
  • nginx访问控制

    一、基于IP的访问控制 1、http_access_module a、配置语法 Syntax: allow address | CIDR | unix: | all; Defaul…

    Java 2023年5月30日
    086
  • 定位CPU占用高的线程并打印其堆栈信息

    1、首先使用top命令定位到CPU占用高的进程PID 执行top命令,列出所有进程的情况,然后按大写的’P’,按CPU占用大小降序显示进程信息 2、获取线程信息,并找到CPU占用高…

    Java 2023年5月30日
    092
  • 【Android】线程池原理及Java简单实现

    线程池简介 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。 假设一个服务器完成一项任务所需时间为: T1 创建线程…

    Java 2023年5月29日
    073
  • JAVA SE 基础总结

    一、程序组织与运行原理 一个 JAVA 程序文件中主要由如下几部分构成: package 声明 public 类:public 类与类文件名相同,因为其是作为该类文件唯一对外接口,…

    Java 2023年6月7日
    087
  • 设计模式 — Builder(构建器)

    构建器(Builder) 将一个复杂对象的构建与其表示相分离,使得同样的构建过程(稳定)可以创建不同的表示(变化) 在软件系统中,有时候面临着”一个复杂对象&#8221…

    Java 2023年6月16日
    064
  • NO3系统升级-资产棚卸

    Powered by 博客园 | | | | 发表于2016-03-02 09:03 大哉乾元万物资始 阅读(129 ) 评论() 编辑 Original: https://www…

    Java 2023年6月8日
    081
  • 使用idea+springboot+Mybatis搭建web项目

    使用idea+springboot+Mybatis搭建web项目 springboot的优势之一就是快速搭建项目,省去了自己导入jar包和配置xml的时间,使用非常方便。 1、创建…

    Java 2023年5月30日
    0133
  • LeetCode题解—-两数之和

    给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答…

    Java 2023年6月6日
    078
  • 如何解决高并发和大流量

    简介: 名词解释:并发 在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任意一个时刻上只有一个程序在处理机上运行。 …

    Java 2023年6月7日
    081
  • redis-SpringBoot(21)

    Redis是大规模互联网应用常用的内存高速缓存数据库,它的读写速度非常快,据官方 Bench-mark的数据,它读的速度能到11万次/秒,写的速度是8.1万次/秒。 认识Sprin…

    Java 2023年6月13日
    066
  • 1、TCP四元组UDP二元组

    UDP是面向无连接的,对于服务器和客户端来说只有一个socket,只需要确定目的IP和Port(dst ip 和dsp port),把数据都发送给这一个socket,所以采用二元组…

    Java 2023年6月8日
    0105
  • 不要使用Java Executors 提供的默认线程池

    参数定义 corePoolSize– 核心池大小。需要注意的是在初创建线程池时线程不会立即启动,直到有任务提交才开始启动线程并逐渐时线程数目达到corePoolSize…

    Java 2023年6月6日
    098
  • 每天代码量多少正常?

    关于程序员每天代码量的讨论,众说纷纭。我个人觉得需要根据具体情况而定。 如果你刚实习,或刚步入工作不久,上司一般都会交给你一些简单的功能实现,这时候一般都含有大量简单而重复或者说类…

    Java 2023年6月13日
    091
  • 深入理解java泛型

    什么是Java泛型 泛型的使用 泛型类 泛型接口 泛型方法 泛型的底层实现机制 ArrayList源码解析 什么是泛型擦除 泛型的边界 ?:无界通配符 extends 上边界通配符…

    Java 2023年6月15日
    083
  • web监听器解析

    监听器是web三大组件之一,事件监听机制如下: 事件:某个事件,如果初始化上下文 事件源:事件发生的地方 监听器:一个对象,拥有需要执行的逻辑 注册监听:将事件、事件源、监听器绑定…

    Java 2023年6月9日
    078
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球