Redis设计与实现-数据结构(建设进度15%)

Redis数据结构

    • 引言
    • 数据结构
      • string
        • SDS数据结构
        • 原生string的不足
      • hash

本博客基于《Redis设计与实现》进行整理和补充,该书依赖于Redis 3.0版本,但是Redis6.0版本在一些底层实现上仍然没有明显的变动,因此本文将在该书的基础上,对于后面进行变更的一些技术项进行额外说明,当然我相信大家学习Redis,可能更多的是进行面试,本博客的一个功利目的,也是希望读完本书之后对于市面上常见的redis面试题能做到心中有数,直接秒杀。

引言

Redis是什么,大家可能会不假思索的说出 是个缓存中间件,但是如果只是缓存的话,我们为什么不能直接使用本地缓存,或者mongo这样的nosql呢,那么这里呢,我们就要从一个更高更抽象的角度去理解Redis,Redis并不是在开发过程中必须存在的中间件,甚至在最开始单机开发的场景,我们可以完全不用Redis,我们从Redis这几个字母上来理解一下Redis的含义,Re- Remote Di- dictionary S-server 远程字典服务,也就是他其实就是一个远程的本地字典存储。
本地缓存的缺点是很明显的,如果我们不使用比如guava或者caffine这样的本地缓存管理包, 那么在本地仅仅是管理缓存就是一件很困难的事情,更何况 本地缓存也更加不适合分布式的开发环境,重启服务缓存消失这样的问题。而mongo将数据存储在磁盘上,从而导致,读写速度可能会成为mongo的瓶颈。正是因为有着这样的问题,因此我们才单独将一些需要进行告诉读取写入存储一些字典的功能交给了一个更合适的远程服务 即是 Redis

而在使用上,我们甚至可以直接理解为Redis就是一个远程的Hash,我们能像使用本地缓存那样使用Redis,而不需要单独考虑数据会不会丢失,数据一致性问题等等。

当然我们现在还是要看一个更加学术并且权威的介绍,这里我直接给到Redis最新的intro:

Redis is an open source (BSD licensed), in-memory data structure store used as a database, cache, message broker, and streaming engine. Redis provides data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes, and streams

Redis是一款拥有BSD授权的开源软件,可以存储一些内存数据结构数据,你可以把它用作数据库缓存,消息中间存储,流引擎。 Redis支持的数据结构有字符串,hash,列表,集合,带范围的有序列表,位图,hyperloglogs,gis存储和流。

好,那么经过上面的简单介绍,我们接下来将继续更加深入的学习Redis的数据结构。

数据结构

redis所有的存储类型都是一个的键值对类型,其中key的类型肯定是一个字符串,而value的存储对象则有 string,hash,set等类型,下面我们会对这些类型的底层实现进行更详细的探讨。

string

redis是使用c语言编写的,在c语言中,并没有string这个内置类型,而是使用char[]来代替string,但是很显然[]char类型有很多问题,所以redis采用SDS来实现字符串。

SDS数据结构

在开始之前我们有必要首先了解一下SDS的数据结构

struct sdshdr {int len; //记录使用长度int free; // 记录还没有使用的长度char buf[]	// 实际进行的数据存储
}

我们下面详细探讨一下char[]可能存在的问题,以及SDS是如何通过自身的数据结构解决的

原生string的不足
  1. 获取字符串长度原生char[]时间复杂度为O(N)

hash

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

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

相关文章

【Android11】在内置的Tvsettings的界面中显示以太网Mac地址

【Android11】在内置的Tvsettings的界面中显示以太网Mac地址 了解Preference必要信息步骤:1. 在设置页面的xml文件中增加一个Preference ,这是要显示出来的设置项2. 在strings.xml文件中增加我们在第一步新设置的值3. 为新加的设置项增加一个新的XXXPref…

CentOS7安装Docker遇到的问题笔记

笔记/朱季谦 以下是笔者本人学习搭建docker过程当中记录的一些实践笔记,过程当中也遇到了一些坑,但都解决了,就此记录,留作以后再次搭建时可以直接参考。 一、首先,先检查CentOS版本,保证在CentOS7版本以…

2023食药物质产业发展大会12月在浙江绍兴隆重召开

为更好地推动食药物质行业高质量发展,推进食药物质相关产品的创新应用,促进行业科技进步,提高行业技术水平,中国生物发酵产业协会定于12月15-17日在浙江省绍兴市召开“2023食药物质产业发展大会暨中国生物发酵产业协会食药物质专业…

C# 使用执行cmd命令遇到俄语乱码处理

设置执行cmd命令的ProcessStartInfo对象编码使用System.Text.Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);注册更多字符编码。 通过上面的方式,如果把语言项的Beta版:使用Unicode UTF-8 提供全球语言支持的选择去掉则正常。但是该功…

LeetCode669. Trim a Binary Search Tree

文章目录 一、题目二、题解 一、题目 Given the root of a binary search tree and the lowest and highest boundaries as low and high, trim the tree so that all its elements lies in [low, high]. Trimming the tree should not change the relative structure of the …

Linux八股文

Linux八股文 第一章 Linux简介 Linux是一种多用户、多任务,支持多线程和多CPU的操作系统,具有免费、稳定、高效的优点,一般运行在大型服务器上。 1.1 常用目录 目录说明/根目录,有且仅有一个,一般只存放目录/home家目…

栈和队列知识点+例题

1.栈 1.1栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素的操作。进行数据插入和删除操作的一端成为栈顶,另一端成为栈底。遵守后进先出的原则(类似于弹夹) 压栈:栈的插入操…

C# 依赖注入IServiceCollection

在 C# 中,IServiceCollection 是 ASP.NET Core 中用于依赖注入的接口。依赖注入是一种设计模式,它允许对象之间的依赖关系由外部组件管理,而不是在对象内部直接创建它们的依赖项。IServiceCollection 接口用于注册和配置应用程序中的服务。 …

一文讲明 网络调试助手的基本使用 NetAssist

我 | 在这里 🕵️ 读书 | 长沙 ⭐软件工程 ⭐ 本科 🏠 工作 | 广州 ⭐ Java 全栈开发(软件工程师) 🎃 爱好 | 研究技术、旅游、阅读、运动、喜欢流行歌曲 🏷️ 标签 | 男 自律狂人 目标明确 责任心强 ✈️公…

实战 - 在Linux上部署各类软件

前言 为什么学习各类软件在Linux上的部署 在前面,我们学习了许多的Linux命令和高级技巧,这些知识点比较零散,同学们跟随着课程的内容进行练习虽然可以基础掌握这些命令和技巧的使用,但是并没有一些具体的实操能够串联起来这些知…

Ubuntu18.04安装Moveit框架

简介 Moveit是一个由一系列移动操作的功能包组成的集成化开发平台,提供友好的GUI,是目前ROS社区中使用度排名前三的功能包,Moveit包含以下三大核心功能,并集成了大量的优秀算法接口: 运动学:KDL,Trac-IK,IKFast...路径规划:OMPL,CHMOP,SBPL..碰撞检测:FCL,PCD... 一、更新功…

全球地表水年度数据集JRC Yearly Water Classification History, v1.4数据集

简介: JRC Yearly Water Classification History, v1.4是一个对全球水资源进行分类的数据集,覆盖了1984年至2019年的时间范围。该数据集是由欧盟联合研究中心(JRC)开发的,使用的数据源是来自Landsat系列卫星的高分辨率…

十. Linux关机重启命令与Vim编辑的使用

关机重启命令 shutdown命令 其他关机命令 其他重启命令 系统运行级别 系统默认运行级别与查询 退出登录命令logout 文本编辑器Vim Vim简介 没有菜单,只有命令Vim工作模式 Vim常用命令 插入命令 定位命令 删除命令 复制和剪切命令 替换和取消命令 搜索和搜索替换命令 保存和退出…

毅速丨嫁接打印在模具制造中应用广泛

在模具行业中,3D打印随形水路已经被广泛认可,它可以提高冷却效率,从而提高产品良率。然而,全打印模具制造的成本相对较高,因为需要使用金属3D打印机和专用材料。为了节省打印成本,同时利用3D打印的优势&…

【Python】问题描述:输入A、B,输出A+B。样例输入12 45样例输出57

1、问题描述 输入A、B,输出AB。 样例输入 12 45 样例输出 57 nums list(map(int,input().split(" "))) print(sum(nums))

STM32 Flash

FLASH简介 Flash是常用的用于存储数据的半导体器件,它具有容量大,可重复擦写,按“扇区/块”擦除、掉电后数据可继续保存的特性。 常见的FLASH主要有NOR FLASH和NAND FLASH两种类型。NOR和NAND是两种数字门电路,可以简单地认为FL…

Haclon案例-找出图中面积最大的圆

任务描述: 下图为HALCON自带的“brake_disk_part_01.png”的图片,试着给它加上不同种类的噪声,然后找出其中面积最大的圆,并将圆的面积标注在其圆心位置。 案例剖析: 1. 该图片为一灰度图,对其进行二值化…

【ctfshow】web入门-信息搜集-web21~28

SSS web21_爆破什么的,都是基操web22_域名也可以爆破的,试试爆破这个ctf.show的子域名web23_还爆破?这么多代码,告辞!web24_爆个🔨web25_爆个🔨,不爆了web26_这个可以爆web27_CTFsho…

[格式化字符串漏洞+堆溢出] Suctf2019_sudrv

前言 悲悲悲, 晚上5点 os-lab 实验报告 ddl, 早上肝实验报告肝到一半, 然后抽风想去做一道 kernel pwn. 然后在一个地方卡了半个多小时, 结果就是写这个 post 的时候已经两点了, 悲. 漏洞分析 这题算是一个入门题, 哎, 就是我在泄漏 kernel offset 的时候想一步到位, 结果就…

存储配置和挂载方式

存储配置 Iscsi简介 iSCSI 启动器,从本质上说,iSCSI 启动器是一个客户端设备,用于将请求连接并启动到服务器(iSCSI 目标)。 iSCSI 启动器有三种实现方式:可以完全基于硬件实现,比如 iSCSI H…