Redis 总结【6.0版本的】

news2024/9/23 17:11:26

如果源码不编译,是无法实现自动跳转的,

Redis在win上编译有点麻烦,我是使用的CentOS环境,Clion编译

编译完就可以直接通过shell连接Redis server了

server.c 中放的是就是主类  :6000多行左右是入口main()函数位置

Redis的使用:

通过redis.conf 文件的如下位置 配置 Redis有多少个数据库:

 select 0 select 1对应就是数据库的序号,16个数据库对应0-15下标

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

 下图就是数据库的结构:

其中最重要的一项就是存放该数据库key-value对的:715行 dict 类型的 *dict指针

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

dict 数据类型如下定义:

 83行有两个dictht 类型的数组:就是对应存放 老HashTable 和 新扩容的HashTable

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

62:hashFunction() 给出 key 求对应的哈希值

65:keyCompare() 比较两个Key是否一致,是否出现冲突,一致的话执行后续逻辑操作

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

HashTable的数据结构


 

Redis 底层设计方式,Redis底层 如何 管理数据:

Redis通过 HashTable 来 存放数据:

我们知道 Redis 维护的是一个个 key-value 的项entry,而组织存放这些entry的数据结构是 HashTable,HashTable是一个数组:

通过对 entry 中 key 的 hash() 处理,并且按照HashTable大小取模,这样,把key对应到为一个int 值。该 int 值作为下标,HashTable[i] 中就存放 该entry 的 value 内容的地址,即,存放的是指向value值存放空间的指针(注意,HashTable中存的是地址,不是把entry直接存进去了)

由于hash函数会导致哈希冲突,即,不同的key可能会哈希到同一个值:Redis 通过拉链法,即,在HashTable的值指向一个个 结构体:结构体内容包括:key值,value的地址,和 next指针(用于指向下一个哈希到相同位置的entry条目),同时每次出现哈希冲突,新的entry对应的结构体以头插法的方式插入到链表头部,新头插的entry可能会在最近被访问的概率大

而哈希冲突越来越频繁的时候,拉链越来越长,找到一个对应的entry时间也越来越长,此时,HashTable就会考虑扩容:HashTable扩容的条件是:若出现一条拉链链表的长度>HashTable的长度,那么,HashTable扩容。

HashTable扩容的方式:成倍扩容:原来HashTable长度是 8 ,扩容后会开辟一个新的大小为8*2=16的空间,放置扩容的HashTable。

而后将旧的HashTable中的拉链上的各个entry结构体重新执行哈希函数,插入到扩容后的HashTable中。这个操作就被称为 rehash

主动渐进式将entry移动到新的HashTable中,操作是:不管get set 等任何访问HashTable的操作,只要访问了HashTable,就按顺序移动一个hash槽(一个哈希槽对应所有被哈希函数处理后对应到该位置的entry)内的所有内容。这么做是由于,我们使用Redis就是为了加速,而大批量新旧HashTable的数据转移会影响Redis正常功能,因此要渐进式移动数据。

在渐进式移动HashTable时,调用get()要求获得某个数据的value:执行顺序 :先去旧HashTable寻找,找不到再去新的HashTable寻找

调用set()时,直接向新的HashTable中插入(这就是为啥访问get时,会出现key找不到,是因为get的value是新set的数据,已经被插入到新的HashTable中了)


Redis 的 key 数据类型:

Redis 在使用时,key可以是 整形、浮点、字符串 、音频视频等,但实际上,Redis服务器端会将无论是什么数据类型的key都转换成 String对象

SDS数据类型:

【SDS相较于char[] 做了哪些优化】

(一)减少len这个属性占的空间:

3.2和3.2版本之前SDS 数据结构用 int 来描述SDS的buf[]长度:

int占4个字节,但是buf[]长度可能只有10个,造成SDS实例空间浪费

结局方案是:Redis6版本提出了SDS 新的数据类型实现:sdshdr5

结构中包括:char类型的 flag,和 存放内容的buf[]

char占8字节,前3位用于表明这是个SDS的数据类型,后5位用来指示buf[]的长度

 啥叫SDS数据类型:因为SDS为了不同长度的buf定义了多种不同的 sdshdrX 数据类型,有sdshdr5 , sdshdr8 等等:

 (二)预分配、懒回收:

定义字符串 ss = "lalala"时,系统会自动 malloc出6个char大小存放

此时我们想在后面加一个字符,就得重新malloc(),malloc()函数调用要很长的时间,因此,每次出现扩容需求的时候,若扩容内容<1M : 倍增原来的buf数组长度,若>1M,则满足新的buf数组的长度后在追加1M的大小

SDS的free变量(在6版本的Redis中改了个名字 叫 alloc,还是一个意思一个用法)就是记录这个每次与分配后,还剩余的空间(free也因为buf的长度不同 优化为了 uint8_t  或者 uint16_t)

(三)Redis 赋值buf[]时,也会 以 `\0`结尾,为了兼容C语言,其实就是为了少写点函数,用用C语言的函数

(四)二进制安全,即使buf[]中出现 `\0`也没关系,不会被处理为内容结束

 

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

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

相关文章

RabbitMQ 教程 | 第10章 网络分区

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的编码爱好者 大家好&#xff0c;我是 DevO…

分布式电网动态电压恢复器模拟装置电子设计大赛

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;85电网 获取完整论文报告结构框图工程源文件 摘要&#xff1a;本装置采用DC-AC及AC-DC-AC双重结构&#xff0c;前级采用功率因数校正&#xff08;PFC&#xff09;电路完成AC-DC变换&#xff0c;改善输入端电网电能质量。后…

01背包笔记

01背包题目链接 题意&#xff1a;有一个容量为m的背包以及n个可以拿的物品&#xff0c;给出n个物品的体积和价值&#xff0c;要求输出可以拿的最大价值 思路&#xff1a;代表在前i件物品中拿取总体积不超过j的最大价值 由此可以分情况讨论状态转移 当j<v[i]时&#xff0c;说…

【总结】p50蓝图概念、面向对象思想、函数事件宏的区别

p50蓝图概念、面向对象思想、函数事件宏的区别 函数的概念&#xff08;纯虚函数和函数&#xff09;宏的概念函数、事件、宏的区别变量的概念面向对象思想&#xff08;封装、继承、多态&#xff09;类和对象的关系Object、actor、pawn、Character、component之间的区别控制权、玩…

RTT(RT-Thread)时钟管理

目录 时钟管理 时钟节拍 RTT工程目录结构介绍 配置文件&#xff1a;rtconfig.h 获取系统节拍 获取系统节拍数函数 实例 定时器 RT_Thread定时器介绍 定时器源码分析&#xff08;了解即可&#xff09; rt_system_timer_init (硬件定时器初始化) rt_system_timer_thr…

python文件与目录操作

目录 文件编码 文件的读取 打开文件 mode常用的三种基础访问模式 读取文件 关闭文件 with open语法 文件的写入操作 文件综合案例 a.txt内容 代码实现 b.txt文件 目录操作 前言 os模块 具体方法 os.path模块 具体方法 文件编码 前言&#xff1a;由于计算机…

【在英伟达nvidia的jetson-orin-nx上使用调试can基础收发-硬件连接-开机自启动can-初步调试】

【在英伟达nvidia的jetson-orin-nx上使用调试can基础收发-硬件连接-开机自启动can-初步调试】 1、概述2、实验环境3、自我学习4-1、实验过程1、硬件原理图焊接连接模块2、输入命令3、测试过程 4-2、目前遗留问题# 1-1、发送可以发送&#xff0c;但是PC发送数据收不到。# 1-2、接…

任务 13、MidJourney种子激发极致创作,绘制震撼连贯画作

13.1 任务概述 通过本次实验任务&#xff0c;学员将深入了解Midjourney种子的概念和重要性&#xff0c;以及种子对生成图像的影响。他们将学会在Midjourney平台中设置种子值并调整其参数&#xff0c;以达到所需的效果。此外&#xff0c;任务还详细介绍了Midjourney V4.0版本中…

周末作业 c高级

1.判断家目录下&#xff0c;普通文件的个数和目录文件的个数&#xff1a; #!/bin/bash arr1(ls -la ~/|cut -d r -f 1|grep -wi d) arr2(ls -la ~/|cut -d r -f 1|grep -wi -)echo "普通文件个数为&#xff1a;${#arr2[*]}" echo "目录文件个数为&#xff1a;$…

【TypeScript】TS接口interface类型(三)

【TypeScript】TS接口interface类型&#xff08;三&#xff09; 【TypeScript】TS接口interface类型&#xff08;三&#xff09;一、接口类型二、实践使用2.1 常规类型2.2 设置属性只读 readonly2.3 设置索引签名2.4 设置可选属性2.5 函数类型接口 一、接口类型 TypeScript中的…

没有配置redis但是报错连接redis失败

问题 没有配置redis但是报错连接redis失败 检查maven配置是否引入了redis依赖&#xff08;可能是传递依赖&#xff0c;最好检查引进来的公共工程 解决办法 只需要在该工程application.yml文件中配置一下 redis就好&#xff0c;或者移除redis依赖

高效处理矢量大数据的高可用解决方案

高效处理矢量大数据的高可用解决方案 解决方案目标 存储海量矢量数据实时分析海量矢量数据实现海量矢量数据的可视化提供高可用、高性能和高可拓展性解决方案概述 海量数据查询与可视化 系统技术流程 方案一 数据存储: PostgreSQL+PostGIS(矢量数据存储和空间分析)数据服务…

企业场景--技术场景

目录 单点登录如何实现 使用jwt解决单点登录 总结 ​编辑 权限认证如何实现 五张表实现权限认证 框架 具体案例 上传数据的安全性如何控制 对称加密 非对称加密 你的项目遇到了哪些棘手的问题&#xff1f; 项目中日志怎么采集的 ELK进行日志采集 logstash kibana操…

P25LED透明屏:在商业广告中,透明显示效果怎么样?

P25LED透明屏是一种新型的显示屏技术&#xff0c;它具有高透明度和高亮度的特点&#xff0c;可以实现透明显示效果。 P25LED透明屏广泛应用于商业广告、展览展示、户外广告等领域&#xff0c;具有很大的市场潜力。 P25LED透明屏采用了先进的LED显示技术&#xff0c;具有高亮度…

浅析RabbitMQ死信队列

原文首发于公众号【CSJerry】 在现代分布式系统中&#xff0c;消息队列扮演着至关重要的角色。它们可以实现应用程序之间的异步通信&#xff0c;并确保数据的可靠传输和处理。而在这个领域中&#xff0c;RabbitMQ作为一种强大而受欢迎的消息队列解决方案&#xff0c;具备了高…

c语言——求n之内的素数和

//求n之内的素数和 //列如&#xff1a;2、3、5等 #include<stdio.h> #include<math.h> int main() {int i,j,k,n0;scanf("%d",&n);for(i2;i<n;i){k(int)sqrt(i);for(j2;j<k;j)if(i%j0)break;if(j>k){printf("%d,",i);n;if(n%50)p…

23.8.5总结(Web博客项目)

用户搜索&#xff0c;标签搜索。 主页面加上了标签和用户推荐 管理员页面还需要修改 还有这些功能点没有实现&#xff1a; 右键删除评论 点赞次数已达上限 删除博客 消息页面&#xff0c;收消息&#xff08;点赞和收藏要给被点赞这个博主发消息&#xff09; 管理员页面&#…

day52-Redis

Redis 1.Redis 1.1 RESP连接Redis 1.2 定义&#xff1a;是一个高性能的key-value数据库&#xff08;非关系型数据库&#xff09; 1.3 数据类型&#xff1a; key键的类型是字符串类型&#xff1b; 值的类型有五种&#xff1a;字符串String&#xff0c;哈希hash&#xff0…

layui之layer弹出层的icon数字及效果展示

layer的icon样式 icon如果在信息提示弹出层值(type为0)可以传入0-6&#xff0c;icon与图标对应关系如下&#xff1a; 如果是加载层&#xff08;type为3&#xff09;可以传入0-2&#xff0c;icon与图标对应关系如下&#xff1a;

javaAPI(五):System、Math、BigInteger、BigDecimal

System类 System类代表系统&#xff0c;系统级的很多属性和控制方法都放置在该类的内部。该类位于java.lang包。 由于该类的构造器是private的&#xff0c;所以无法创建该类的对象&#xff0c;也就是无法实例化该类。其内部的成员&#xff0c;所以也可以很方便的进行调用。变量…