Redis字符串底层结构对数值型的支持常用数据结构和使用场景

字符串底层结构

SDS (Simple Dynamic Strings) 是 Redis 中用于实现字符串类型的一种数据结构。SDS 的设计目标是提供高效、灵活的字符串操作,同时避免传统 C 字符串的一些缺点。 

struct sdshdr {int len;    // 已使用的长度int free;   // 未使用的长度char buf[]; // 字符数组
};

当 SDS(Simple Dynamic Strings)空间不足时,会进行内存扩展,以确保字符串操作可以顺利进行。SDS 采用了一些机制来高效地处理内存扩展,减少频繁的内存分配操作。

内存扩展机制

  1. 预分配策略

    • 当需要扩展 SDS 时,SDS 不仅仅分配所需的空间,还会额外分配一些空间,以减少未来的扩展次数。
    • 具体策略如下:
      • 如果 len 小于 1MB,则分配两倍于当前长度的空间。
      • 如果 len 大于等于 1MB,则分配当前长度加 1MB 的空间。
  2. 空间扩展过程

    • 当 SDS 检测到空间不足时,会根据预分配策略计算新的分配大小。
    • 分配新的内存,并将现有数据复制到新的内存区域中。
    • 更新 len 和 free 字段,并将新数据追加到 buf 中。

对数值类型的支持:

在 Redis 中,虽然没有专门的整数类型,但它通过 SDS(Simple Dynamic Strings)数据结构对整数存储进行了优化(整数编码)。这些优化主要体现在减少内存占用和提高操作效率上。

整数存储优化机制

整数内嵌编码:当一个字符串可以表示为整数时,Redis 会使用整数内嵌编码来存储。这样可以减少内存消耗,因为整数编码比字符串编码更紧凑。

整数操作优化

Redis 提供了一些针对整数操作的原子性命令,例如 INCR、DECR、INCRBY 和 DECRBY。这些命令在内部会直接操作整数值,而不是将其转换成字符串进行操作。

数值操作命令

  1. INCR:将键的值加1
  2. DECR:将键的值减1
  3. INCRBY:按给定的增量将键的值增加
  4. DECRBY:按给定的减量将键的值减少
  5. INCRBYFLOAT:按给定的浮点数增量将键的值增加

Redis常用数据结构和使用场景:

字符串 (String)最基本的数据类型,单个键最大可以存储 512MB 的数据缓存简单的键值对,如用户信息、计数器等
哈希 (Hash)键值对集合,适合存储对象存储用户配置、会话信息、商品信息等
列表 (List)有序的字符串列表,可以从两端插入和弹出元素消息队列、任务列表、时间线等
集合 (Set)无序的字符串集合,集合内元素唯一标签、共同好友、去重操作等
有序集合 (Sorted Set)类似于集合,但每个元素关联一个分数,按分数排序排行榜、带权重的队列、延时任务等
位图 (Bitmap)可以对字符串进行位操作,用于高效地存储和处理位信息用户签到、在线状态、布隆过滤器等
HyperLogLog基数估计算法,适合用于估算集合的基数(唯一元素的数量),但不存储具体元素统计 UV(独立访客数)、去重统计等
地理位置 (Geo)基于有序集合实现的地理位置数据结构,提供位置存储和查询功能地理位置服务、附近的人或地点搜索等
流 (Stream)日志数据类型,支持高效的追加和消费操作实时日志、消息流处理、事件存储等

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

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

相关文章

面试241228

面试可参考 1、cas的概念 2、AQS的概念 3、redis的数据结构 使用场景 不熟 4、redis list 扩容流程 5、dubbo 怎么进行服务注册和调用,6、dubbo 预热 7如何解决cos上传的安全问题kafka的高并发高吞吐的原因ES倒排索引的原理 spring的 bean的 二级缓存和三级缓存 spr…

小程序配置文件 —— 13 全局配置 - window配置

全局配置 - window配置 这里讲解根目录 app.json 中的 window 字段,window 字段用于设置小程序的状态栏、导航条、标题、窗口背景色; 状态栏:顶部位置,有网络信号、时间信息、电池信息等;导航条:有一个当…

STM32 与 AS608 指纹模块的调试与应用

前言 在嵌入式系统中,指纹识别作为一种生物识别技术,广泛应用于门禁系统、考勤机、智能锁等场景。本文将分享如何在 STM32F103C8T6 开发板上使用 AS608 指纹模块,实现指纹的录入和识别功能。 硬件准备 STM32F103C8T6 开发板AS608 指纹模块…

3GPP R18 MT-SDT

Rel-17 指定MO-SDT允许针对UL方向的数据包进行小数据包传输。对于DL,MT-SDT(即DL触发的小数据)可带来类似的好处,即 通过不转换到 RRC_CONNECTED来减少信令开销和UE功耗,并通过允许快速传输(小而少见的)数据包(例如用于定位)来减少延迟。 在R17中,NR_SmallData_INACTIVE的工…

小程序基础 —— 02 微信小程序账号注册

微信小程序账号注册 小程序开发与网页开发不一样,在开始微信小程序开发之前,需要访问微信公众平台,注册一个微信小程序账号。 有了小程序的账号以后,才可以开发和管理小程序,后续需要通过该账号进行开发信息的设置、…

两个链表的第一个公共结点

输入两个链表,找出它们的第一个公共结点。 当不存在公共节点时,返回空节点。 数据范围 链表长度 [1,2000] 保证两个链表不完全相同,即两链表的头结点不相同。 算法思想描述 如上图所示,两种链表的出现的情况只有图中2中&…

OpenAI 12天发布会:AI革命的里程碑@附35页PDF文件下载

在人工智能的浪潮中,OpenAI的12天发布会无疑是2024年科技界的一场盛宴。从12月5日开始,OpenAI连续12天每天发布一个新应用或功能,标志着AI技术的又一次飞跃。本文将梳理这些激动人心的发布,带你一探究竟。 OpenAI发布会概览 Ope…

理解数列和函数的极限

什么是数列 数列就是按照1定顺序排列的数字, 也可以理解为包含数字元素的队列 格式: a 1 , a 2 , a 3 , . . . , a n a_1, a_2, a_3, ..., a_n a1​,a2​,a3​,...,an​, n ∈ N n \in N n∈N 或者 { a n } \{ a_n \} {an​}, n ∈ N n \in N n∈N 其中 a n…

TOP K问题:利用堆排序找出数组中最小的k个数

设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。 找小的数需要建大堆来解决,首先将数组中前K个数建成一个大堆,将从k1个数直到数组结束的所有数与堆顶的数进行比较,如果比堆顶的数小,则替换堆顶的数…

6-Gin 路由详解 --[Gin 框架入门精讲与实战案例]

Gin 是一个用 Go 语言编写的 HTTP Web 框架,以其高性能和简洁的 API 而闻名。它提供了一套强大的路由功能,使得开发者可以轻松地定义 URL 路由规则,并将这些规则映射到具体的处理函数(handler)。以下是关于 Gin 路由的…

【数据库初阶】Linux中库的基础操作

🎉博主首页: 有趣的中国人 🎉专栏首页: 数据库初阶 🎉其它专栏: C初阶 | C进阶 | 初阶数据结构 亲爱的小伙伴们,大家好!在这篇文章中,我们将深入浅出地为大家讲解 Linux…

【机器学习(九)】分类和回归任务-多层感知机(Multilayer Perceptron,MLP)算法-Sentosa_DSML社区版 (1)11

文章目录 一、算法概念11二、算法原理(一)感知机(二)多层感知机1、隐藏层2、激活函数sigma函数tanh函数ReLU函数 3、反向传播算法 三、算法优缺点(一)优点(二)缺点 四、MLP分类任务实…

【LLM】OpenAI 的DAY12汇总和o3介绍

note o3 体现出的编程和数学能力,不仅达到了 AGI 的门槛,甚至摸到了 ASI(超级人工智能)的边。 Day 1:o1完全版,开场即巅峰 12天发布会的开场即是“炸场级”更新——o1完全版。相比此前的预览版本&#x…

MaixBit k210学习记录

开发背景:Window系统主机,在主机上安装了虚拟机(VirtualBoxUbuntu23.04) 目标实现:在虚拟机(Ubuntu)中,实现对Maix bit(k210)开发板的开发 虚拟机的安装参考…

ExpDemo-JavaFX打造属于你自己的图形化漏洞利用工具

声明!本文章所有的工具分享仅仅只是供大家学习交流为主,切勿用于非法用途,如有任何触犯法律的行为,均与本人及团队无关!!! 目录标题 前言编写属于你的图像化漏洞利用工具项目结构编写EXP部署 部…

串口通信标准RS232、RS422、RS485有什么区别和不同

目录 第一个区别:硬件管脚接口定义不同: 第二个区别、工作方式不同 第三个区别、通信方式不同 第四个区别,逻辑特性不同 第五个区别、抗干扰性、传输距离和传输速率也不同 RS-232与RS-485对比 RS-422与RS-485对比 今天给大家分享的是&…

银河麒麟操作系统安装达梦数据库(超详细)

目录 引言1. 前期准备1.1 安装麒麟系统1.2 下载达梦数据库安装包(DM8)1.3 上传安装包到麒麟系统1.4 挂载安装包(iso)文件1.5 配置安装用户和组1.6 创建安装路径及修改权限1.7 设置临时安装目录 2. 安装达梦数据库(DM8&…

Linux-frp_0.61.1内网穿透的配置和使用

下载frp frp官网 https://gofrp.org/zh-cn/docs/setup/ frp安装包下载地址 https://github.com/fatedier/frp/releases?page1 下载之后在服务器上 解压 tar -zxvf frp_0.61.1_linux_amd64.tar.gztar:一个用于压缩和解压缩的工具。-z:表示使用 gzi…

04.HTTPS的实现原理-HTTPS的混合加密流程

04.HTTPS的实现原理-HTTPS的混合加密流程 简介1. 非对称加密与对称加密2. 非对称加密的工作流程3. 对称加密的工作流程4. HTTPS的加密流程总结 简介 主要讲述了HTTPS的加密流程,包括非对称加密和对称加密两个阶段。首先,客户端向服务器发送请求&#xf…

【从零开始入门unity游戏开发之——C#篇34】C#匿名函数(delegate )和Lambda表达式

文章目录 一、匿名函数(delegate )1、什么是匿名函数?2、匿名函数的基本语法2.1 语法2.2 **没有参数的匿名函数:**2.3 **有参数的匿名函数:**2.4 **有返回值的匿名函数:** 3、匿名函数的使用示例3.1 作为参…