《Redis设计与实现》

【Redis】Redis的内部设计与实现 Redis 为各种文件事件需求编写了多个处理器,若客户端连接Redis,对连接服务器的各个客户端进行应答,就需要将socket映射到连接应答处理器写数据到Redis,接收客户端传来的命令请求,就需要映射到命令请求处理器从Redis读数据,向客户端返回命令的执行结果,就需要映射到命令回复处理器当主服务器和从服务器进行复制操作时, 主从服务器都需要映射到特别为复制功能编写的复制处理器。假如你的过期 key,靠定期删除没有被删除掉,还停留在内存里,除非你的系统去查一下那个 key,才会被redis给删除掉。 阅读详情

《Redis设计与实现》
    第二章 简单动态字符串
        2.1 SDS的定义
            SDS(Simple Dynamic String)
            len 、 free 、 buf 
            len = 5 , free = 5 , buf = Redis\0_____ , buf.length = len + free + 1
        2.2 SDS与C字符串的区别
            2.2.1 常数复杂度获取字符串长度
            2.2.2 杜绝缓冲区溢出
            2.2.3 减少修改字符串时带来的内存重分配次数
                1. 空间预分配
                2. 惰性空间释放
            2.2.4 二进制安全
            2.2.5 兼容部分C字符串函数

    第三章 链表
        3.1 链表和链表节点的实现
            ListNode
                prev
                next
                value
            List
                head
                tail
                len
                dup
                free
                match
        3.2 链表和链表节点的API

    第四章 字典
        4.1 字典的实现
            4.1.1 哈希表
                dictht
                    table
                    size
                    sizemask
                    used
            4.1.2 哈希表节点
                dictEntry
                    key
                    v
                    next
            4.1.3 字典
                dict
                    type // 类型特定函数
                    privdata // 类型特定函数的可选参数
                    ht[2]
                    rehashidx // 记录rehash目前的进度

                dictType
                    hashFunction
                    keyDup
                    valDup
                    keyCompare
                    keyDestructor
                    valDestructor
        4.2 哈希算法
                1. 
                    hash = dict -> type -> hashFunction(key);
                    index = hash & dict -> ht[x].sizemask;
                2. 
                    MurmurHash2

        4.3 解决键冲突
            链地址法 next
            头插法

        4.4 rehash
            扩展
                ht[0].used * 2 <= pow(2, n)
            收缩
                ht[0].used     <= pow(2, n)
            哈希表的扩展与收缩
                扩展
                    未执行 BGSAVE 或 BGREWRITEAOF load_factor = ht[0].used / ht[0].size >= 1
                    执行中 BGSAVE 或 BGREWRITEAOF load_factor = ht[0].used / ht[0].size >= 5
                收缩
                    load_factor < 0.1

        4.5 渐进式rehash
            rehashidx
                每次 CRUD 时,移动 rehashidx 索引的 dictEntry 
            渐进式 rehash 执行期间的哈希表操作
                查找
                删除
                更新
                    ht[0] 如果没有找到 去 ht[1] 中 找
                添加
                    ht[0] 不做添加操作, 仅对 ht[1] 做添加操作

        4.6 字典API

    第五章 跳跃表
        skiplist 
            有序数据结构
            通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。
            平均 O(logN) 、 最坏 O(N)

        5.1 跳跃表的实现

            zskiplist
                header
                tail 
                level
                length

            zskiplistNode
                level
                    前进指针
                    跨度
                backward
                score
                obj

            5.1.1 跳跃表节点
                zskiplistNode
                    level[] zskiplistLevel 
                        forward // 前进指针
                        span // 跨度 节点的排位 将沿途访问过的所有层的跨度累计起来,得到的结果就是目标节点在跳跃表中的排位
                    backward
                    score
                    obj
            5.1.2 跳跃表
                zskiplist
                    header
                    tail
                    length
                    level

        5.2 跳跃表API

    第六章 整数集合
        intset 
            只包含整数值元素,并且元素数量不多时
            集合键的底层实现

        6.1 整数集合的实现
            int16_t 、 int32_t 、 int64_t
            intset
                encoding uint32_t
                length uint32_t
                contents[] int8_t

            INTSET_ENC_INT16
            INTSET_ENC_INT32
            INTSET_ENC_INT64
        6.2 升级

        6.3 升级的好处
            6.3.1 提升灵活性
            6.3.2 节约内存

        6.4 降级

        6.5 整数集合API


    第七章 压缩列表
        列表键 : 当一个列表键只包含少量列表项,并且每个列表项要么就是小整数值,要么就是长度比较短的字符串,那么Redis就会使用压缩列表来做列表键的底层实现
        哈希键 : 当一个哈希键只包含少量键值对,并且每个键值对的键和值要么就是小整数值,要么就是长度比较短的字符串,那么Redis就会使用压缩列表来做哈希键的底层实现。

        字节数组 或 整数值

        7.1 压缩列表的构成
            zlbytes : 记录整个 压缩列表 占用的内存字节数
            zltail : 记录压缩列表 表尾节点 距离 压缩列表 的 起始地址 有多少字节
            zllen : 记录了 压缩列表 包含的 节点数量 <= UNIT16_MAC(65535)可信
            entryX
            zlend : 特殊值0xFF

        7.2 压缩列表节点的构成
            字节数组
                len <= pow(2,6) - 1
                len <= pow(2,14) - 1
                len <= pow(2,32) - 1
            整数值
                4位 无符号
                1字节 有符号
                3字节 有符号
                int16_t
                int32_t
                int64_t

            extryX
                previous_entry_length
                encoding
                content

            7.2.1 previous_entry_length
                1 字节 ; 5 字节

            7.2.2 encoding
                字节数组
                    一字节 00
                    两字节 01
                    五字节 10
                整数编码
                    一字节 11
                        11 000000
                        11 010000
                        11 100000
                        11 110000
                        11 111110
                        11 11xxxx
            7.2.3 content
        
        7.3 连锁更新
            O(N) * O(N) = O(N * N)
        7.4 压缩列表API


    第八章 对象
        8.1 对象的类型与编码
            redisObject
                type
                encoding
                ptr

            8.1.1 类型
                REDIS_STRING
                REDIS_LIST
                REDIS_HASH
                REDIS_SET
                REDIS_ZSET

                TYPE

            8.1.2 编码和底层实现
                编码常量
                    REDIS_ENCODING_INT
                    REDIS_ENCODING_EMBSTR
                    REDIS_ENCODING_RAW
                    REDIS_ENCODING_HT
                    REDIS_ENCODING_LINKEDLIST
                    REDIS_ENCODING_ZIPLIST
                    REDIS_ENCODING_INTSET
                    REDIS_ENCODING_SKIPLIST
                
                类型 编码 对象 
                    REDIS_STRING
                        REDIS_ENCODING_INT
                        REDIS_ENCODING_EMBSTR
                        REDIS_ENCODING_RAW

                    REDIS_LIST
                        REDIS_ENCODING_ZIPLIST
                        REDIS_ENCODING_LINKEDLIST

                    REDIS_HASH
                        REDIS_ENCODING_ZIPLIST
                        REDIS_ENCODING_HT

                    REDIS_SET
                        REDIS_ENCODING_INTSET
                        REDIS_ENCODING_HT

                    REDIS_ZSET
                        REDIS_ENCODING_ZIPLIST
                        REDIS_ENCODING_SKIPLIST

        8.2 字符串对象
            int raw embstr
            int long 
            raw > 32Byte
            embstr <= 32Byte

            8.2.1 编码的转换
                int -> raw
                embstr -> raw

            8.2.2 字符串命令的实现

        8.3 列表对象
            quicklist ziplist linkedlist

            8.3.1 编码转换
                < 64 Byte
                < 512 个

            8.3.2 列表命令的实现

        8.4 哈希对象
            ziplist hashtable
            ziplist : key1 value1 key2 value2

            8.4.1 编码转换
                键值对的键和值的字符串长度 都 < 64 Byte
                键值对数量 < 512 个

            8.4.2 哈希命令的实现


        8.5 集合对象
            intset hashtable

            8.5.1 编码的转换
                int
                数量 < 512 个

            8.5.2 集合命令的实现

        8.6 有序集合对象
            ziplist skiplist dict

            8.6.1 编码的转换
                数量 < 128 个
                成员的长度 都 < 64 Byte

            8.6.2 有序集合命令的实现

        8.7 类型检查与命令多态
            任何类型的键执行
                del expire rename type object

            特定类型的键执行
                set get append strlen
                hdel hset hget hlen
                rpush lpop linsert llen
                sadd spop sinter scard
                zadd zcard zrank zscore

            8.7.1 类型检查的实现

            8.7.2 多态命令的实现

        8.8 内存回收
            引用计数
                redisObject
                    refcount

        8.9 对象共享

        8.10 对象的空转时长

            redisObject
                lru:22 // 记录对象最后一次被命令程序访问的时间

            OBJECT IDLETIME


        
 A  B  C  D  E  F
10 11 12 13 14 15

EVAL
quicklist
HashMap::indexOf(key)

Redis设计与实现_redis设计与实现_ redis设计与实现 Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。 立即下载

相关推荐

SUMO仿真教程(5) —— 使用“XML“语言自定义构建路网

文章目录一.简要介绍1.node file2.edge file3.lane definitions(1)路段细分(2)邻近的对向车道(3)删除边或车道4.type file(1)简要概述(2)edge定义中引用type文件的示例(3)指定车辆种类的速度限制5.connections file(1)简要概述:(2)connection的属性参数(3)删除连接(4)设置连接的优先级(5)同一边的多个连接二.演示示例:1.自定义编写node file2.自定义编写edge file3.自定义编写type fil

weixin_50632459的博客 5014

《Redis 设计与实现》阅读

1、资料 如何阅读 Redis 源码? Redis 设计与实现 redis3.0源码 2、读后感 // 待续

weixin_42282999的博客 246

MCGS触摸屏Modbus TCP通讯实战:从寄存器写入到字符串处理的完整代码解析

本文详细解析了MCGS触摸屏通过Modbus TCP协议实现寄存器写入和字符串处理的完整代码,涵盖单寄存器写入、多寄存器写入及字符串传输等核心技术。文章还提供了MCGS组态环境中的实战配置步骤和常见问题排查方法,帮助开发者快速掌握工业自动化通讯的关键技术。

study的专栏 753

Redis的设计与实现(进阶篇)

如果开启多线程,至少要4核的机器,且Redis实例已经占用相当大的CPU耗时的时候才建议采用,否则使用多线程没有意义。Redis不能这样,因为每一次获取系统时间戳都是一次系统调用,系统调用相对来说是比较费时间的,作为单线程的Redis承受不起,所以它需要对时间进行缓存,由一个定时任务,每毫秒更新一次时间缓存,获取时间都是从缓存中直接拿。Redis在处理客户端的请求时,包括获取 (socket 读)、解析、执行、内容返回 (socket 写) 等都由一个顺序串行的主线程处理,这就是所谓的“单线程”。

爱晴禹 1081

【scratch音乐课】天空之城:音符与节拍、消息与链表

scratch是一个非常小巧的青少年编程工具,自带程序编写语句,积木式语句非常直观、易用,可创作数学、科学、音乐、绘画等方面作品。本文用scratch“演奏”一首大家非常熟悉的《天空之城》,并向大家介绍一些基本乐理知识,以及scratch中消息、链表的使用。

★·°立芯;︶︵︶ 1万+

人工智能训练师三级·模型生命周期真题40题|训练→评估→调优全链路通关

本文为人工智能训练师三级考试真题解析系列第2篇,聚焦模型生命周期全链路(训练→评估→调优)。内容包含40道精选真题,覆盖数据划分、模型训练、评估指标、超参数调优4个核心阶段。重点考察:1)数据集的合理划分方法(留出法、交叉验证);2)模型训练的基本原理;3)关键评估指标(准确率、召回率、F1等)的应用场景;4)超参数调优技术(网格搜索、随机搜索等)。通过真题解析帮助考生系统掌握模型生命周期的闭环迭代方法论,提升从数据准备到模型优化的全流程实践能力。适合备考人工智能训练师三级认证的考生学习参考。

白话机器学习 87

《redis设计与实现:第三部分》

《十五章:复制》 用户可以通过执行slaveof命名或者设置slaveof选项,让一个服务器去复制replicate另一个服务器,被复制的服务器为主服务器master。对主服务器进行复制的服务器叫从服务器。 旧版复制功能对实现: redis的复制功能分为同步sync,和命令传播command propagate两个操作: 1.同步操作用于将从服务器的数据库状态更新至主服务器当前所处的数据库状态。 2.命令传播则用于在主服务器的数据库状态被修改,导致主从服务器的数据库状态不一致时,让主从服务器的数

welcome to 一点点 home 867

LLC 谐振转换器中为什么需要 ( L_m )(励磁电感)

在每个模态中,励磁电感 ( L_m )、谐振电感 ( L_r ) 和谐振电容 ( C_r ) 分别承担着储存和释放能量、维持谐振电流和电压波形的任务。Q1和Q2的交替导通确保了这些元件能够在不同的模态下实现能量的有效传输和谐振状态的维持。励磁电感 ( L_m ) 在这一过程中起着不可或缺的作用,确保了电路的高效运行和稳定性。

weixin_43199439的博客 3652

Davids阅读笔记:《Redis设计与实现》

《Redis设计与实现》阅读笔记 第一部分:数据结构与对象 第一章:(简单动态字符串) 1、Redis只会使用C字符串作为字面量,在大多数情况下,Redis使用SDS(Simple Dynamic String,简单动态字符串)作为字符串表示。 2、比起C字符串,SDS具有以下优点: 2.1:常数复杂度获取字符串长度 2.2:杜绝缓冲区溢出 2.3:减少修改字符串长度时所需的内存重分配次数 ...

Davids_的博客 4912

基于STM32L4XX、HAL库的IP101GRI以太网收发器(PHY)驱动程序设计

define IP101GRI_PHY_ADDRESS 0x01 // 根据硬件设计设置PHY地址。#define IP101GRI_PHYSTS 0x10 // PHY状态寄存器。#define IP101GRI_PHYINIR 0x12 // PHY中断寄存器。#define IP101GRI_PHYCR 0x14 // PHY控制寄存器。#define IP101GRI_PHYID2 0x03 // PHY标识符2。

zhusl6688的博客 716

SAP 集成泛微 OA Open API 新建流程申请接口

《SAP ERP 与泛微 OA 的系统集成》系列文章。泛微 Open API 是基于 HTTPS 的 Restful 接口,上篇文章,我已经完成了调用业务接口之前的准备工作,这篇文章我以新建流程申请这个系统集成最重要的接口为例,讲解接口设计、泛微 API 调用的过程、遇到的问题、解决的办法。

SAP李斌,本人承诺所有原创文章均不使用任何AI生成技术,请大家放心阅读。 3545

Redis设计与实现

title: Redis设计与实现(note) date: 2020-09-30 14:27:00 categories: Redis tags: Redis 数据库 chapter2 简单动态字符串 2.1 SDS的定义 struct sdshdr{ // 记录buf数组中已使用字节的数量 // 等于SDS所保存字符串的长度(不含'\0') int len; // 记录buf数组中未使用字节的数量 int free; // 字节数.

qq_43342872的博客 767

计算机视觉(角点检测)- 1 - Harris角点检测

计算机视觉(角点检测)-1.1 Harris角点检测学习前言 学习前言   今天更新一下计算机视觉的东西吧,哈哈哈o( ̄︶ ̄)o   关于角点检测呢,就是检测图像中角点的算法,常见的有四种常见的算法:Moravec角点检测算法、 Harris角点检测算法、Shi-Tomasi 算法、FAST角点检测算法,不过常用的就两种吧——Harris角点检测算法、Shi-Tomasi 算法(反正我基本上就只用到这两种,先着重介绍前面两种,后面再花世界介绍吧)(~ ̄▽ ̄)~ ...

qq_40374812的博客 1万+

Redis 设计与实现 — Redis 设计与实现

Redis 设计与实现 — Redis 设计与实现Redis 设计与实现

weixin_33809981的博客 251

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Redis设计与实现-集群

如有侵权,请联系~如有错误,也欢迎批评指正~本篇文章大部分是来自学习《Redis设计与实现》的笔记。

m0_50149847的博客 1217

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Redis设计与实现之事务

一:Redis设计与实现之事务

li-zhang-yu的博客 169

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Redis设计与实现 - 书签补全版

Redis设计与实现 - 书签补全版 【下载地址】Redis设计与实现-书签补全版 - **文件名**: 《Redis设计与实现》.(黄健宏).[大部分标记书签].pdf- **文件类型**: PDF- **文件大小**: [文件大小]- **文件描述**: 该PDF文件在原书的基础上,补全了大部分重要章节的详细书签,方...

gitblog_06609的博客 502

Redis设计与实现之复制

一:Redis设计与实现之复制

li-zhang-yu的博客 149

Redis设计与实现思维导图

读完Redis设计与实现,把知识点大概整理了下,但是哨兵、集群、Lua脚本理解不够。

ABOOMMMMM的博客 239

Redis设计与实现-数据结构

redis中的字符串都是简单动态字符串(SDS)的形式存在的。不止是set key value的键和字符串值value,连其他数据结构中存储的字符串也是以SDS形式存储,如rpush fruits "apple " “banana”,队列保存的中的"apple " "banana"两个字符串元素也是SDS存储。SDS除了保存字符串以外,还用在缓冲区:AOF缓冲区、客户端输入输出缓冲区。int len;// 字符串的长度(已使用的字节数)int free;// 未使用的字节数(空闲空间)

m0_50149847的博客 1285

Redis设计与实现之客户端

一:Redis设计与实现之客户端

li-zhang-yu的博客 173

《Redis设计与实现》全面知识整理

最近在看Redis的实现原理,看到《Redis设计与实现》这本书,发现这本书对Redis的讲解可以说是很透彻了,不仅从Redis的设计方案以及其各种功能是如何实现的,均有很清晰的讲解 通过看这本书,能够很清晰的对Redis的整体结构有很清晰的了解。最近我花费了三四天将这本书的知识点整理出来了,希望能让大家对Redis的整体认识有一定提升。 整理的是一个xmind文件格式,知识点很多,很多都合起来了,大家可以下载下来看看。示例图: Redis知识整合梳理: ...

落尘 309

Redis设计与实现之发布与订阅

一:Redis设计与实现之发布与订阅

li-zhang-yu的博客 174

Redis设计与实现之数据库

一:Redis设计与实现之数据库

li-zhang-yu的博客 149
上一篇: 日志打印 - 命令模式、模版方法模式
下一篇: MySQL 执行计划
limeOracle
博客等级 码龄10年 11粉丝 566原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值