reids设计与实现(一)——数据对象

文章目录

    • 1. 前言
    • 2. redis 动态字符串
      • 2.1. 字符串的数据结构:
      • 2.2. 剖析,length;
      • 2.3. 剖析,free;
      • 2.3. 使用c字符串函数;
    • 3. redis 链表
    • 4. 字典
    • 5. 跳跃表

1. 前言

reids作为最常用的缓存数据库,深入了解,对于业务开发大有裨益,那么从这里开始,我们从《redis设计与实现》这本书,我们同最常用的字符串入手,了解redis的设计与思路。

2. redis 动态字符串

字符串作为redis最为核心,最为常用的数据类型,后面我们称sds,我们深入了解一下。

2.1. 字符串的数据结构:

在这里插入图片描述我们从数据结构入手,猜测字符串实现的功能和特性,我们可以发现,这里相比于c字符串多了两个属性。freelen

2.2. 剖析,length;

  1. 快速获取length :首先,leng最简单的效果便是可以直接获取redis字符串的长短,由于是直接获取属性,时间复杂度为O(1)。

  2. 二进制安全: 除了获取长度外,为了实现redis的sds可以存储任意数据的功能,sds通过length判断字符串是否到结尾,这和c字符串不同(‘/0’),因此可以存储任意二进制数据。

2.3. 剖析,free;

其实简单length之后发现基本功能都差不多了,那么这个free有什么作用呢?

  1. 预留free空间: 减少重新分配,在sds除了记录length之外,还会分配一倍length(1mb大小以内)的未使用空间,如果length在再次增加的情况下,不过增加的长度小于free,则不需要重新分配内存。

2.3. 使用c字符串函数;

redis虽然自行实现了字符串数据机构,但是还是在字符串末尾增加一个’/0’空字符,目的是为了使用c字符串的函数。

3. redis 链表

redis链表并没有非常奇特的地方,在redis链表中主要有两个数据结构。

  1. list 统计
    在这里插入图片描述
    这里包括list的一些概要信息和一些函数,目的是为了后面使用链表节点方便一点。
  2. listnode 节点。
    在这里插入图片描述

一般来说这个在学习数据结构中用的很多,一般情况下,只需要记录一个pre node便可以遍历整个链表。

redis链表为双向链表。并没有过于多的特殊。

4. 字典

字典又称为符号表,map,key-value。

  1. dictht(hash)表,属性包括,hash表数组,表大小,hash表大小掩码,已有节点数量。
    在这里插入图片描述

  2. dictEntry表数据,是key-value结构
    在这里插入图片描述

redis对于hash冲突的解决方案是链地址法,即如果冲突,在原来dictEntrt下面通过next链接冲突节点。

  1. 字典,hash的上层结构,和java中的hashMap功能类似。
    在这里插入图片描述
    dictType 可以指定不同低操作函数。
    ht 为两个hash表,另外一个用于备份。(在再hash时使用)

  2. hash算法: hash算法和普通的hash表别无二致,通话hash算法,hash(key)& mask把数组放到表里。

  3. hash冲突
    redis使用链地址发把键值对存储在链表之前解决冲突,这样的时间复杂度为O(1)。

  4. rehash
    当hash表空间不够的时候,一般需要再次hash,
    渐进式再hash,在渐进式 rehash 过程中,Redis 会同时保持旧的哈希表和新的哈希表。然后,在每次执行命令时,Redis 会从旧哈希表中移动一小批键值对到新哈希表,这个过程分散在多个操作中逐步完成。

具体条件为

  1. 当负载因子大于1且没在持久化(BGSAVE,BGREWRITEAOF)会进行再hash。
  2. 当负载因子大于3,目前在执行BGSAVE,BGREWRITEAOF)时,会进行再hash。
  3. 在负载因子小于0.1时,会进行收缩。
  1. BGSAVE 命令用于在后台创建 Redis 数据库的快照。当执行此命令时,Redis 会 fork 出一个子进程,子进程则将内存中的数据写入到磁盘上的一个 RDB 文件中。这个过程不会阻塞主 Redis 进程,所以 Redis 可以继续处理客户端请求。RDB(Redis DataBase)文件是一个压缩的二进制文件,表示某一时刻 Redis 数据库的完整快照
  2. BGREWRITEAOF 命令用于优化 AOF(Append Only File)文件的大小。Redis 的 AOF 持久化通过记录数据库的所有写操作到一个文件中来工作,这个文件随着操作的积累会不断增长。BGREWRITEAOF 命令会在后台创建一个当前数据的最小操作集,以此来重写 AOF 文件,这个过程同样不会阻塞主 Redis 进程。

5. 跳跃表

跳跃表几乎只用于有序集合。
在这里插入图片描述

  1. zskiplistNode: 这是跳跃表的节点结构定义。每个节点代表有序集合中的一个元素。
  2. zskiplistLevel: 这个结构体定义了跳跃表节点在不同层级的信息,每个节点可以有一个或多个层级(level)。
  • forward: 是一个指向同一层级的下一个节点的指针。在查找操作中,这个指针允许我们“跳过”一些节点,从而更快地在跳跃表中进行搜索。

  • span: 这是一个无符号整数,它记录了当前节点与通过 forward 指针所指向的下一个节点之间的跨度。在进行范围查询或者计算排名时,这个值非常有用,因为它可以快速计算出两个节点之间的间隔。
    backward: 这是一个指向当前节点前一个节点的指针,在双向遍历时使用。

  1. score: 这是一个双精度浮点数,用来保存节点的分数值。在有序集合中,元素是根据这个分数进行排序的,分数相同时则按照存储的对象(obj)来进行字典序比较。

  2. obj: 这是一个指向实际存储数据的指针,通常是一个字符串类型。在 Redis 中,这是指向 robj(Redis 对象)的指针,它可以存储字符串、列表、哈希表等不同类型的数据结构。

  3. level[]: 这是一个大小可变的数组,它的具体长度取决于节点所在的层数。这个数组存储每一层的 zskiplistLevel 结构体,允许节点在跳跃表的多个层级上存在。

可以通过zskiplist持有这些节点。
在这里插入图片描述
为什么要用跳跃表?

简单性:跳表的算法和代码实现相比平衡树要简单得多。对于平衡树,如 AVL
树或红黑树,它们的旋转操作逻辑复杂,难以编写且容易出错。跳表提供了一种容易理解和实现的高效有序数据结构。

效率:跳表的查找、插入和删除操作的平均时间复杂度都是 O(log n),与平衡树相当。

灵活性:跳表支持快速的顺序访问和有效的范围查询,这对于数据库索引来说是非常重要的。

并发性:跳表的数据结构更容易实现锁定机制,这使得在并发环境下的性能表现更好。由于节点的层次结构,跳表可以更容易地实现细粒度锁或无锁并发算法。

动态:跳表无需预先知道数据规模,它可以根据实际需要动态地进行扩展,这在不可预知数据量的实时系统中非常有用。

空间效率:虽然跳表的多层结构需要额外的空间来存储指针,但它的空间复杂度仍然是线性的(O(n)),而且在实践中这个额外空间的使用通常是可控的。

实践:在实际应用中,跳表往往能够提供与平衡树相似或有时候更优的性能表现,特别是在插入和删除操作频繁的场景中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/735469.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MATLAB】MATLAB学习笔记

MATLAB入门 基础操作变量命名数据类型逻辑和流程控制循环结构分支结构 绘图基本操作二维平面绘图绘图参数三位立体绘图图像窗口的分割 本文参考B站视频:BV13D4y1Q7RS 由于我对于C语言很熟悉,很多语法是会参考C来学 基础操作 清屏%% 清空环境变量及命令 …

图腾柱PFC工作原理:一张图

视屏链接: PFC工作原理

docker学习笔记——Dockerfile

Dockerfile是一个镜像描述文件,通过Dockerfile文件可以构建一个属于自己的镜像。 如何通过Dockerfile构建自己的镜像: 在指定位置创建一个Dockerfile文件,在文件中编写Dockerfile相关语法。 构建镜像,docker build -t aa:1.0 .(指…

【每日一题】2834. 找出美丽数组的最小和-2024.3.8

题目: 2834. 找出美丽数组的最小和 给你两个正整数:n 和 target 。 如果数组 nums 满足下述条件,则称其为 美丽数组 。 nums.length n.nums 由两两互不相同的正整数组成。在范围 [0, n-1] 内,不存在 两个 不同 下标 i 和 j &…

阿里云实现两个VPC网络资源互通

背景 由于实际项目预算有限,两套环境虽然分别属于不同的专有网络即不同的VPC,但是希望借助一台运维机器实现对两个环境的监控和日常的运维操作 网络架构 如下是需要实现的外网架构图,其中希望实现UAT环境的一台windows的堡垒机可以访问生产…

第G3周:CGAN入门|生成手势图像

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 一、前置知识 CGAN(条件生成对抗网络)的原理是在原始GAN的基础上,为生成器和判别器提供 额外的条件信息…

【linux】04 :linix实用操作

1.常用快捷键 ctrlc表示强制停止。linux某些程序的运行,如果想强制停止,可以使用;命令输入错误,也可以通过ctrlc,退出当前输入,重新输入。 ctrld表示退出登录,比如退出root以回到普通用户,或者…

Stable Diffusion 模型下载:ZavyChromaXL(现实、魔幻)

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 作者述:该模型系列应该是用于 SDXL 的 ZavyMix SD1.5 模型的延续。主要重点是获…

背包问题算法

背包问题算法 0-1背包问题二维数组一维数组 完全背包问题二维数组一维数组 多重背包问题一维数组 0-1背包问题 问题:背包的容量为9,有重量分别为[2, 4, 6, 9]的四个物品,价值分别为[3, 4, 5, 6],求背包能装的物品的最大价值是多少…

Orange3数据预处理(预处理器组件)

1.组件介绍 Orange3 提供了一系列的数据预处理工具,这些工具可以帮助用户在数据分析之前准备好数据。以下是您请求的预处理组件的详细解释: Discretize Continuous Variables(离散化连续变量): 这个组件将连续变量转…

个人网站展示(静态)

大学期间做了一个个人博客网站,纯H5编码的网站,利用php搭建了一个留言模块。 有需要源码的同学,可以联系我~ 首页: IT杂记模块 文人墨客模块 劳有所获模块 生活日志模块 关于我 一个推崇全栈开发的前端开发人员 微信: itrzzh …

elasticsearch篇

1.初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容 例如: 在电商网站搜索商品 在百度搜索答案 在打车软件搜索附近…

代码随想录算法训练营Day39 || leetCode 762.不同路径 || 63. 不同路径 II

62.不同路径 每一位的结果等于上方与左侧结果和 class Solution { public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m,vector(n,0));for (int i 0; i < m; i) dp[i][0] 1;for (int j 0; j < n; j) dp[0][j] 1;for (int i 1; i < m; …

使用docker部署redis集群

编写脚本 批量创建目录文件&#xff0c;编写配置文件 [rootlocalhost ~]# cat redis.sh #/bin/bash for port in $(seq 1 6); do mkdir -p /mydata/redis/node-${port}/conf touch /mydata/redis/node-${port}/conf/redis.conf cat << EOF >>/mydata/redis/node-…

记录西门子:IO隔离SCL编程

在PLC变量中创建IO输入输出 在PLC类型中创建输入和输出&#xff0c;并将PLC变量的输入输出名称复制过来 创建一个FC块或者FB块 创建一个DB块 MAIN主程序中&#xff1a;

【UVM_phase objection_2024.03.08

phase 棕色&#xff1a;function phase 不消耗仿真时间 绿色&#xff1a;task phase 消耗仿真时间 run_phase与右边的phase并行执行&#xff0c;右边的phase&#xff08;run_time phase&#xff09;依次执行&#xff1a; List itemreset_phase对DUT进行复位&#xff0c;初始…

24 深度卷积神经网络 AlexNet【李沐动手学深度学习v2课程笔记】(备注:含AlexNet和LeNet对比)

目录 1. 深度学习机器学习的发展 1.1 核方法 1.2 几何学 1.3 特征工程 opencv 1.4 Hardware 2. AlexNet 3. 代码 1. 深度学习机器学习的发展 1.1 核方法 2001 Learning with Kernels 核方法 &#xff08;机器学习&#xff09; 特征提取、选择核函数来计算相似性、凸优…

总结:Spring创建Bean循环依赖问题与@Lazy注解使用详解

总结&#xff1a;Spring创建Bean循环依赖问题与Lazy注解使用详解 一前提知识储备&#xff1a;1.Spring Bean生命周期机制&#xff08;IOC&#xff09;2.Spring依赖注入机制&#xff08;DI&#xff09;&#xff08;1&#xff09;Autowired注解标注属性set方法注入&#xff08;2&…

步进电机的神秘世界:斩波与细分算法的探索之旅

欢迎来到步进电机的奇妙领域&#xff01;今天&#xff0c;我们将一同揭开斩波和细分算法的神秘面纱&#xff0c;并探讨它们的编程实现。准备好踏上这趟充满惊喜的探索之旅了吗&#xff1f;让我们一起出发吧&#xff01; 首先&#xff0c;让我们了解一下步进电机斩波的原理。为了…

爬虫与DataFrame对象小小结合

import pandas as pd import requests from lxml import etree #数据请求 url"https://www.maigoo.com/brand/list_1715.html" headers{User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.289 Safari…