Redis入门到实战-数据结构 (四、原理篇)

news2024/11/28 10:51:33

一、动态字符串SDS

我们都知道Redis中保存的Key是字符串,value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。

不过Redis没有直接使用C语言中的字符串,因为C语言字符串存在很多问题:

  • 获取字符串长度的需要通过运算
  • 非二进制安全(不能包含特殊字符)
  • 不可修改

Redis构建了一种新的字符串结构,称为简单动态字符串(Simple Dynamic String),简称SDS。
Redis是C语言实现的,SDS是一个结构体,源码如下:
在这里插入图片描述
例如,一个包含字符串“name”的sds结构如下:
在这里插入图片描述
SDS之所以叫做动态字符串,是因为它具备动态扩容的能力,例如一个内容为“hi”的SDS:
在这里插入图片描述
假如我们要给SDS追加一段字符串“,Amy”,这里首先会申请新内存空间:
如果新字符串小于1M,则新空间为扩展后字符串长度的两倍+1;
如果新字符串大于1M,则新空间为扩展后字符串长度+1M+1。称为内存预分配。
在这里插入图片描述
在这里插入图片描述

二、Redis数据结构-intset

IntSet是Redis中set集合的一种实现方式,基于整数数组来实现,并且具备长度可变、有序等特征。结构如下:
在这里插入图片描述其中的encoding包含三种模式,表示存储的整数大小不同:
在这里插入图片描述
为了方便查找,Redis会将intset中所有的整数按照升序依次保存在contents数组中,结构如图:
在这里插入图片描述
现在,数组中每个数字都在int16_t的范围内,因此采用的编码方式是INTSET_ENC_INT16,每部分占用的字节大小为:encoding:4字节 、length:4字节、contents:2字节 * 3 = 6字节 一共14个字节

我们向该其中添加一个数字:50000,这个数字超出了int16_t的范围,intset会自动升级编码方式到合适的大小。
以当前案例来说流程如下:

  • 升级编码为INTSET_ENC_INT32, 每个整数占4字节,并按照新的编码方式及元素个数扩容数组
  • 倒序依次将数组中的元素拷贝到扩容后的正确位置
  • 将待添加的元素放入数组末尾
  • 最后,将inset的encoding属性改为INTSET_ENC_INT32,将length属性改为4

三、Redis数据结构-Dist

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

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

相关文章

计算机网络之http07 http2,http3

HTTP1.2 http1.2都做了哪些优化 (1)头部压缩 使用HPACK压缩头部 头部冗长,大量重复字段 (2)二进制帧 将报文头部和内容字符编码改为二进制格式 字符编码未压缩 (3)并发传输 解决h1.1 队头阻塞问题,多车道 …

opencv通道的分离与合并

大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页: lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

腾讯云 cos 字体在CDN上跨域处理

问题描述:项目中用到了字体的静态资源,把静态资源放到了腾讯云对象存储提供的 COS 上,同时启用它的CDN来加速。但是,调试的过程中发现报错:CSS加载字体跨域了,字体图标无法正常显示。 原因:字体…

torch.grid_sample

参考: 双线性插值的理论Pytorch grid_sample解析PyTorch中grid_sample的使用方法pytorch中的grid_sample()使用 查阅官方文档,TORCH.NN.FUNCTIONAL.GRID_SAMPLE grid_sample的函数签名如下所示,torch.nn.functional.grid_sample(input, gr…

Java设计模式总叙

文章目录基本概念设计模式的七大原则设计模式有哪些高频使用&经典的设计模式创建型-工厂方法模式创建型-建造者模式结构型-代理模式结构型-外观模式行为型-策略模式行为型-模板方法补充UML类图关系参考基本概念 使得代码编写真正工程化,它是软件工程的基石。 …

【cuda入门系列】通过代码真实打印线程ID

【cuda入门系列】通过代码真实打印线程ID1.gridDim(6,1),blockDim(4,1)2.gridDim(3,2),blockDim(2,2)【cuda入门系列之参加CUDA线上训练营】在Jetson nano本地跑 hello cuda! 【cuda入门系列之参加CUDA线上训练营】一文认识cuda基本概念 【cuda入门系列之参加CUDA线…

ubuntu 20使用kubeadm安装k8s 1.26

步骤 机器:4核8G,root账号,可访问互联网 1、更新apt apt-get update 2、安装一些基本工具 apt-get install ca-certificates curl gnupg lsb-release net-tools apt-transport-https 3、ifconfig 获取ip,hostname获取主机名&…

【洛谷】P1195 口袋的天空

明显看出为最小生成树,那么:难点在哪里呢?if(cntn-k)//******{flag1;break;}为什么是cntn-k呢而不是k呢?!!!解释:(如果每个已经连在一起了就不能分开,不管多少…

【Kafka】【二十二】Kafka中Controller,Rebalance,HW,LEO的概念

Kafka中Controller,Rebalance,HW,LEO的概念 Controller 集群中谁来充当controller 每个broker启动时会向zk创建⼀个临时序号节点,获得的序号最⼩的那个broker将会作为集群中的controller,负责这么⼏件事:…

基于距离模型SE

知识表示 one-hot representation: 将研究对象表示为向量,该向量只有某一维度非零,其他维度上的值均为零。独热表示是信息检索和搜索引擎中广泛使用的词袋模型的基础,优点是无需学习过程。简单高效,在信息检索和自然语言处理中得…

亚马逊云科技助力滴普科技,加速企业数据价值洞察

随着企业数字化转型的不断深入,数据对于业务的价值和重要性也逐渐凸显。越来越多企业意识到,只有不断提升底层数据基础平台的性能和能力,才能构建数据驱动的业务,增强企业核心竞争力。作为湖仓一体数据智能基础软件独角兽企业&…

开学必备数码清单,大学生开学必备数码好物分享

还有很多小伙伴不知道开学应该准备什么,在学校当中需要用到的数码产品,在宿舍娱乐使用的音箱、学习当中使用到的笔记本,这些都是我们可以准备的,还有一个小众的好物,能够让我们在学校当中提升生活的幸福感,…

MinIO-rpm离线安装

近日,由于客户的系统运行环境在一个封闭的网络内,不能与互联网联通,也不能提供yum库,所以运行环境只能采用rpm离线安装的方式,我总结了一下本次的安装经过,希望对需要的人有所帮助。一、单机安装1.下载http…

postgres 源码解析49 Btree节点分裂点确认流程--2

上篇讲解了分裂的规则和填充策略等内容,而本文着重讲解postgres Btree分裂点确认流程,接口函数为 _bt_findsplitloc。相关知识点见回顾:postgres源码解析48 Btree节点分裂点确认流程–1 执行流程 _bt_findsplitloc 该函数的功能是确定该分裂…

金三银四一线大厂常见Java面试题面试题总结 1000+ 面试题

Java 面试八股文有必要背吗? 我的回答是:很有必要。你可以讨厌这种模式,但你一定要去背,因为不背你就进不了大厂。现如今,Java 面试的本质就是八股文,把八股文面试题背好,面试才有可能表现好。…

2020年欧空局10米土地覆盖数据

土地覆盖数据是我们平时最常用的地理数据之一,土地覆盖数据的来源也有很多种,之前我们介绍共过两个的30米精度的土地覆盖数据,分别为GlobeLand30土地覆盖数据和CLCD土地覆盖数据,(可查看之前推送的文章)&am…

Linux:用户空间非法指针coredump简析

1. 前言 限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。 2. 背景 本文分析基于 ARM32 架构,Linux-4.14 内核代码。 3. 问题分析 3.1 测试范例 void main(void) {*(int *)0 8; }运行程序会 …

Seata-Server分布式事务原理加源码 (七) - TCC事务模式

TCC事务模式 首先我们先来了解常规的TCC模式。 什么是TCC TCC 是分布式事务中的二阶段提交协议,它的全称为 Try-Confirm-Cancel,即资源预留(Try)、确认操作(Confirm)、取消操作(Cancel&#…

CV——day77 简读论文:视频中交通标志的跟踪检测

视频中交通标志的跟踪检测Detection-by-tracking of traffic signs in videos1 Introduction3 Methods3.1 Faster R-CNN3.2 Proposed shortest-path approach3.3 Tractor-based method3.4 IoU-based method6 ConclusionsDetection-by-tracking of traffic signs in videos 视频…

除了ChatGPT,还能用什么计划管理软件提高效率?

最近一段时间,人工智能工具ChatGPT成为互联网科技圈的热门话题。正如当年的阿尔法狗给世界带来的震动一样,人们讨论的最多的就是:ai智能会不会取代人工,因为ai的效率太高了,但再智能,也有ai永远也取代不了的…