Redis7.0代码分析总结之:底层数据结构listpack实现原理
一、前言 listpack压缩列表。作为ziplist的替代品,从2017年引入Redis后,到redis7.0已经完全取代ziplist作为redis底层存储数据结构之一。 相对于ziplist,listpack内存更紧凑,实现更简洁。下面详细分析这一底层数据结构的实现原理。
二、实现原理2.1 、内存结构 listpack 作为 ziplist 的替代者,它的内存布局、实现原理和listpack非常相似。比如:都是连续的一块内存,前端都有表示内存大小、元素个数;尾部都有终结标志等元数据。但是他们彼此之间又有差异。下面分别通过对比的方式,对listpack内存布局进行重点说明.
2.1.1、ziplist内存布局:ziplist内存布局
2.2.2、listpack内存布局:listpack内存布局
通过以上两个内存结构图,可以直观看出ziplist 内存结构比 listpack 稍微复杂。彼此之间的 ...
跟着Redis学编程系列:把一个字符串转换为有符号长整型
前言作为C语言基础,在面试的时候,经常会被要求实现数值到字符串、或者字符串到数值的转换函数。虽然难度不大,但是很容易在一些细节上出现纰漏。刚好最近在深度分析Redis7.0源代码。闲暇之余,顺带把这部分代码摘录出来,进行分析、注解。作为一个学习记录的同时也方便后来者快速了解Redis内部是如何实现的。日后面试也许能用的上。
Redis实现方式代码片段注释12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970int string2ll(const char *s, size_t slen, long long *value) { const char *p = s; //指向s开始位置 size_t plen = 0; // int negative = 0; //负数 unsigned long long v; /* 如果传递表示字符串 ...
Redis7.0学习总结之:事件模型
前言Redis自己封装了一个事件驱动模型,实现代码在src/ae.h和src/ae.c。Redis内部存在两类事件:文件事件和时间事件。其中文件事件包括网络事件、文件读写事件等;而时间事件主要是一些后台定时任务事件。
本文主要围绕这两个代码文件,对Redis的事件模型进行分析学习。
【不对Reactor模型,具体的事件处理流程等进行分析说明。这部分说明后续通过单独文章进行描述分析】
首先我们先看两个图片:
图片二</i>图片1是基于ac.h代码抽象出来的Redis事件实现模型逻辑架构图。图片二是struct aeEventLoop结构图。
下面我们基于这两个图片进行分析说明:
事件模型实现逻辑 Redis是单线程的,其事件模型是属于高性能事件模型中的Reactor模式,本文不对这个模式进行说明分析,具体需要了解这个模式的可以参考网上其他的文章。 &nbps;通过图片的逻辑架构我们得知,Redis对于事件模型的封装是分层的。通过图片我们可以简单拆分为 ...
Redis7.0代码分析(1)-客户端连接是如何维护
导读:Redis作为一个CS结构的服务器,它是怎样维护客户端连接的?本文尝试通过代码的方式,对这些内容进行梳理。
依赖:
本文所有分析基于Redis7.0RC代码;
只针对普通TCP连接方式通讯的客户端;
系统平台centos,因此事件模型默认是epoll。
代码整理文件事件列表Redis服务器启动后会对相关网络端口进行监听;如果使用epoll这种IO多路复用的模型,还需要针对相关兴趣事件进行注册事件回调操作。以下是Redis服务器执行初始化函数initServer()后注册到事件循环的相关事件列表:
事件类别
事件读写标志
事件回调方法
事件触发条件
代码文件所在位置
备注
监听TCP端口
读事件
acceptTcpHandler
客户端通过TCP端口连接到来,触发可读事件
server.c
TLS安全协议下监听TCP端口
读事件
acceptTLSHandler
开启tls通讯,客户端连接到来,触发可读事件
server.c
监听UNIX socket
读事件
acceptUnixHandler
客户端通过unix domain socket协议连接到服 ...
hiredis代码分析一:同步
1、概述一、概述: hiredis是 Redis官方用C语言实现的一套编程API。Redis相关组件redis-server、redis-cli、redis-benchmark都分别使用到了该API。 hiredis同时支持同步和异步的方式和Redis进行交互。同步的API定义和实现在hiredis.h和hiredis.c文件中;而异步则在async.h和async.c中。 本系列作为分析hiredis代码的总结笔记,包括三篇文章:
1、概要描述hiredis,相关信息以便从整体上了解该API库的全貌和特性;
2、对同步API相关信息进行剖析总结;
3、对异步API相关信息进行婆媳总结。
本文为这系列的第一篇文章,重点在于从全局上了解hiredis的相关信息。
二、hiredis下载、编译、安装1、下载:
12```bashgit clone https://github.com/redis/hiredis.git
三、hiredis应用样例;四 ...
Redis6.0.16 配置详解(翻译自源代码的redis.conf)
1、前言:本文档是对 Redis 6.0.16版的 redis.conf的注释说明。Redis: 6.0.16 注意:为了读取配置文件,Redis必须以配置文件路径作为第一个参数进行启动:1./redis-server /path/to/redis.conf
关于配置文件中单位的注意事项:当需要设置内存大小的时候,可按照惯例指定形式,如:1K、5GB、4M以此类推:123456# 1k => 1000 bytes# 1kb => 1024 bytes# 1m => 1000000 bytes# 1mb => 1024*1024 bytes# 1g => 1000000000 bytes# 1gb => 1024*1024*1024 bytes单位不区分大小写,因此 1G 1GB 1Gb 1gB都是一样的。
2、引用外部配置Redis 可以引用一个或者多个外部配置文件。当搭建多个Redis 实例的时候,如果所有的Redis都有一部分通用的配置,且每个实例又有个性化的配置时,将该通用部分定义为一个外部配置文件,然后使用include选项来引入会非常方便。 ...
Nginx 模块与其初始化代码流程分析
一、前置: Nginx是模块化的体系结构体,大部分功能都是封装在模块当中,并且每个模块内部都静态的定义了一个 ngx_modulet_t 结构体的变量,其内部分别定义了模块名称、模块上下文结构体、支持的配置指令,相关回调函数等。这些模块在执行完 configure 脚本后,自动在objs/ngx_modules.c源文件生成一个全局的ngx_modulet_t 指针数组,该数组保存了当前配置生效的所有模块列表。
二、模块初始化分析 下面根据代码逻辑分析模块及其相关配置上下文的初始化流程进行梳理分析。
nginx.c:main()函数299行,对模块进行预初始化:123if (ngx_preinit_modules() != NGX_OK) { //初始化模块索引以及模块名字 return 1;}
12345678910111213141516//初始化模块索引和名字ngx_int_tngx_preinit_modules(void){ ngx_uint_t i; for (i = ...
Centos7通过yum方式安装mysql
前言 本篇属于操作的基本篇,仅仅是作为Centos7系统安装Mysql数据库的一个笔记,难度较低。
下载: 由于使用yum方式进行安装,故此无需直接下载安装包,只需要增加yum安装源即可。
增加Mysql Yum安装源 到mysql官网(https://dev.mysql.com/downloads/repo/yum/)选择对应系统平台的rpm包,直接下载,或者通过wget命令下载到本机。1wget https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm
增加软件源1sudo rpm -Uvh package-name.rpm比如本文使用的包:mysql80-community-release-el7-3.noarch.rpm1sudo rpm -Uvh mysql80-community-release-el7-3.noarch.rpm
选择安装版本   ...
Java集合框架(一):概述
一、集合论: 集合论源自现代数学,属于现代数据的基础理论。其奠基人康托尔在创建集合理论给出了许多公理和性质。它的概念和方法渗透到代数、拓扑和分析等许多数学分支以及物理学质点力学等一些自然科学,为这些科学提供了奠基的方法,改变了这些科学的面貌。计算机学科学作为一门现代科学因为和数学的渊源,很多概念也来自于自然数学,集合就是其中之一。
1.1 集合: 集合很难下一个精确的定义,通常情况下,把具有相同性质的一类东西,汇聚成一个整体,可以称为集合。换句说,就是一组具备相同特殊性的东西集合在一起,称之为集合。用生活中的一些列子来说,全体中国人可以称之为集合,诸如此类,生活中很多东西就是可以称之为集合了。 通常情况下,数学上用于表示集合的方式有两种:列举法和性质描述法。所谓列举法是,就是把集合中所有的个体描述列举出来,比如集合A={1,2,3}。而性质描述法,就是通过一种规则或者是数学符号描述元素集,比如集合B={X|0<X<100且X属于整数}。& ...
Java集合框架(三):ArrayList
概要: ArrayList继承自AbstractList,并且实现了接口List,RandomAccess,Cloneable, java.io.Serializable。其内部通过一个对象数组Object[] elementData保存数据,该对象通过transient关键字修饰,访问权限是default。故此ArrayList内部数据无法序列化,并且其内容同个包内部都可以直接访问。通过私有变量size保存当前元素个数,即ArrayList大小。 此外还提供几个私有静态常量。如下: 12345678//初始化的ArrayList容量大小private static final int DEFAULT_CAPACITY = 10;//创建ArrayList是,默认是一个空ArrayList而不是null,这个变量是为了优化ArrayList空实例时,避免产生过多的不必要的空数组。private static final Object[] EMPTY_ELEMENTDATA = { ...