• [Redis源码阅读]实现一个redis命令--nonzerodecr

    上篇文章介绍了命令的执行流程,对redis如何执行命令也有了初步的了解,通过实现一个redis命令来再次加深印象。

    笔者平时主要语言是PHP,有些功能PHP无法满足就会用到PHP的扩展,比如swoole。因此,就想到redis可不可以以做扩展?为了满足一些特殊的需求,可不可以为redis开发一个命令?

    前期准备

    因为redis是用C开发的,为了能开发redis命令,首先也是必须的是,你要懂一点C语言基础,另一个就是,需要了解一下redis命令是如何执行的,知道redis执行命令大概的流程,最简单的一个流程描述就是:

    读取命令->解析命令->调用命令函数->返回执行结果
    

    或者再读一次上篇文章

    我们要做的就是,确保redis能解析到新增的命令,能根据输入的命令找到对应的方法并执行。

    Read more...
  • [Redis源码阅读]当你输入get/set命令的时候,redis做了什么

    上一篇文章介绍了redis-server的启动过程,服务端启动之后,就启动事件循环机制监听新事件的到来,此时不同的客户端就可以通过发送指令的方式请求server并得到处理结果的回复。在开发过程中,用到最多的就是get和set命令,那么,当我们输入get/set命令时,redis做了什么呢?

    redis-cli启动

    了解命令是如何使用之前,先了解下redis-client启动时做了什么。redis客户端有多种实现,不同的语言也有自己的实现,在这里可以看到各种版本:redis版本,平常调试过程中比较常用的是redis-client,即命令行的形式,redis-client的主要实现代码在redis-cli.hredis-cli.c。redis-client的启动入口是在main函数,阅读代码可以看到是先给config设置属性,然后判断客户端使用哪种模式启动,启动模式有:Latency、Latency分布式、从库、获取RDB、查找大key、管道、Stat、Scan、LRU、Intrinsic Latency、交互模式。我们用的命令行就是交互模式。

    Read more...
  • [Redis源码阅读]当你启动Redis的时候,Redis做了什么

    直奔主题,当启动Redis的时候,Redis执行了哪些操作?

    假设Redis安装在了/usr/local/目录下,那么启动Redis是通过执行/usr/local/bin/redis-server -c xxx.conf的方式执行。 redis-server是一个通过编译server.c文件生成的程序,因此想了解redis是怎么启动的,应该从server.c/main函数入手。

    具体代码可见:server.c

    Read more...
  • [Redis源码阅读]redis持久化

    作为web开发的一员,相信大家的面试经历里少不了会遇到这个问题:redis是怎么做持久化的?

    不急着给出答案,先停下来思考一下,然后再看看下面的介绍。希望看了这边文章后,你能够回答这个问题。

    为什么需要持久化?

    由于Redis是一种内存型数据库,即服务器在运行时,系统为其分配了一部分内存存储数据,一旦服务器挂了,或者突然宕机了,那么数据库里面的数据将会丢失,为了使服务器即使突然关机也能保存数据,必须通过持久化的方式将数据从内存保存到磁盘中。

    对于进行持久化的程序来说,数据从程序写到计算机的磁盘的流程如下:

    1、客户端发送一个写指令给数据库(此时数据在客户端的内存)

    Read more...
  • [Redis源码阅读]redis对象

    结构定义

    在redis中,对象的数据结构定义如下:

    ​typedef struct redisObject {
        ​unsigned type:4;
        ​unsgined encoding:4;
        ​unsigned lru:LRU_BITS;
        ​int refcount;
        ​void *ptr;
    ​}
    

    结构定义中的type:4encoding:4这种定义方式称为位段类型

    使用位段类型的好处就是避免浪费内存,如果使用unsigned int type定义type字段,需要4个字节,而使用unsigned type:4,只需要4个位段就足够了。

    Read more...
  • [Redis源码阅读]dict字典的实现

    dict的用途

    dict是一种用于保存键值对的抽象数据结构,在redis中使用非常广泛,比如数据库、哈希结构的底层。

    当执行下面这个命令:

    > set msg "hello"
    

    以及使用哈希结构,如:

    > hset people name "hoohack"
    

    都会使用到dict作为底层数据结构的实现。

    Read more...
  • [Redis源码阅读]sds字符串实现

    初衷

    从开始工作就开始使用Redis,也有一段时间了,但都只是停留在使用阶段,没有往更深的角度探索,每次想读源码都止步在阅读书籍上,因为看完书很快又忘了,这次逼自己先读代码。因为个人觉得写作需要阅读文字来增强灵感,那么写代码的,就阅读更多代码来增强灵感吧。

    redis的实现原理,在《Redis设计与实现》一书中讲得很详细了,但是想通过结合代码的形式再深入探索,加深自己的理解,现在将自己探索的心得写在这儿。

    Read more...
  • [PHP源码阅读]number_format函数

    上次讲到PHP是如何解析大整数的,一笔带过了number_format的处理,再详细阅读该函数的源码,以下是小分析。

    函数原型

    string number_format ( float $number [, int $decimals = 0 ] )
    
    string number_format ( float $number , int $decimals = 0 , string $dec_point = "." , string $thousands_sep = "," )
    

    函数可以接受1、2、4个参数(具体可以看代码的实现)。

    Read more...
  • 自上而下,逐步揭开PHP解析大整数的面纱

    遇到的问题

    最近遇到一个PHP大整数的问题,问题代码是这样的

    $shopId = 17978812896666957068;
    var_dump($shopId);
    

    上面的代码输出,会把$shopId转换成float类型,且使用了科学计数法来表示,输出如下:

    float(1.7978812896667E+19)

    但在程序里需要的是完整的数字作为查找数据的参数,所以需要用的是完整的数字,当时以为只是因为数据被转换成科学计数法了,于是想到的解决方案是强制让它不使用科学计数法表示:

    Read more...
  • MySQL主从复制原理探索

    上一篇文章里面,讲到了遇到mysql主从延迟的坑,对于这次的坑多说两句,以前也看过这样的例子,也知道不能够写完之后马上更新,但是真正开发的时候还是没有注意到这一点,道理大家都懂,但是还是会犯错,只有等到自己亲生体验到该错误之后,才真正的掌握到该道理。

    经历过一次mysql主从延迟之后,就开始思考,主从复制是什么东西?它是怎么实现的呢?它的原理是什么?于是乎就开始查阅资料、文章,现将自己理解到的内容总结在此,加深印象。

    为什么要做主从复制?

    1、在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。

    Read more...