Redis字符串底层结构对数值型的支持常用数据结构和使用场景
字符串底层结构
SDS (Simple Dynamic Strings) 是 Redis 中用于实现字符串类型的一种数据结构。SDS 的设计目标是提供高效、灵活的字符串操作,同时避免传统 C 字符串的一些缺点。
struct sdshdr {int len; // 已使用的长度int free; // 未使用的长度char buf[]; // 字符数组
};
当 SDS(Simple Dynamic Strings)空间不足时,会进行内存扩展,以确保字符串操作可以顺利进行。SDS 采用了一些机制来高效地处理内存扩展,减少频繁的内存分配操作。
内存扩展机制
-
预分配策略:
- 当需要扩展 SDS 时,SDS 不仅仅分配所需的空间,还会额外分配一些空间,以减少未来的扩展次数。
- 具体策略如下:
- 如果
len
小于 1MB,则分配两倍于当前长度的空间。 - 如果
len
大于等于 1MB,则分配当前长度加 1MB 的空间。
- 如果
-
空间扩展过程:
- 当 SDS 检测到空间不足时,会根据预分配策略计算新的分配大小。
- 分配新的内存,并将现有数据复制到新的内存区域中。
- 更新
len
和free
字段,并将新数据追加到buf
中。
对数值类型的支持:
在 Redis 中,虽然没有专门的整数类型,但它通过 SDS(Simple Dynamic Strings)数据结构对整数存储进行了优化(整数编码)。这些优化主要体现在减少内存占用和提高操作效率上。
整数存储优化机制
整数内嵌编码:当一个字符串可以表示为整数时,Redis 会使用整数内嵌编码来存储。这样可以减少内存消耗,因为整数编码比字符串编码更紧凑。
整数操作优化:
Redis 提供了一些针对整数操作的原子性命令,例如 INCR、DECR、INCRBY 和 DECRBY。这些命令在内部会直接操作整数值,而不是将其转换成字符串进行操作。
数值操作命令
- INCR:将键的值加1
- DECR:将键的值减1
- INCRBY:按给定的增量将键的值增加
- DECRBY:按给定的减量将键的值减少
- INCRBYFLOAT:按给定的浮点数增量将键的值增加
Redis常用数据结构和使用场景:
字符串 (String) | 最基本的数据类型,单个键最大可以存储 512MB 的数据 | 缓存简单的键值对,如用户信息、计数器等 |
哈希 (Hash) | 键值对集合,适合存储对象 | 存储用户配置、会话信息、商品信息等 |
列表 (List) | 有序的字符串列表,可以从两端插入和弹出元素 | 消息队列、任务列表、时间线等 |
集合 (Set) | 无序的字符串集合,集合内元素唯一 | 标签、共同好友、去重操作等 |
有序集合 (Sorted Set) | 类似于集合,但每个元素关联一个分数,按分数排序 | 排行榜、带权重的队列、延时任务等 |
位图 (Bitmap) | 可以对字符串进行位操作,用于高效地存储和处理位信息 | 用户签到、在线状态、布隆过滤器等 |
HyperLogLog | 基数估计算法,适合用于估算集合的基数(唯一元素的数量),但不存储具体元素 | 统计 UV(独立访客数)、去重统计等 |
地理位置 (Geo) | 基于有序集合实现的地理位置数据结构,提供位置存储和查询功能 | 地理位置服务、附近的人或地点搜索等 |
流 (Stream) | 日志数据类型,支持高效的追加和消费操作 | 实时日志、消息流处理、事件存储等 |
相关文章:
Redis字符串底层结构对数值型的支持常用数据结构和使用场景
字符串底层结构 SDS (Simple Dynamic Strings) 是 Redis 中用于实现字符串类型的一种数据结构。SDS 的设计目标是提供高效、灵活的字符串操作,同时避免传统 C 字符串的一些缺点。 struct sdshdr {int len; // 已使用的长度int free; // 未使用的长度char bu…...

uniapp 微信小程序 数据空白展示组件
效果图 html <template><view class"nodata"><view class""><image class"nodataimg":src"$publicfun.locaAndHttp()?localUrl:$publicfun.httpUrlImg(httUrl)"mode"aspectFit"></image>&l…...

在vscode的ESP-IDF中使用自定义组件
以hello-world为例,演示步骤和注意事项 1、新建ESP-IDF项目 选择模板 从hello-world模板创建 2、打开项目 3、编译结果没错 正在执行任务: /home/azhu/.espressif/python_env/idf5.1_py3.10_env/bin/python /home/azhu/esp/v5.1/esp-idf/tools/idf_size.py /home…...

目标检测,语义分割标注工具--labelimg labelme
1 labelimg labelimg可以用来标注目标检测的数据集, 提供多种格式的输出, 如Pascal Voc, YOLO等。 1.1 安装 pip install labelimg1.2 使用 命令行直接输入labelimg即可打开软件主界面进行操作。 使用非常简单, 不做过细的介绍࿰…...

发明专利与实用新型专利申请过程及自助与代办方式对比
申请专利(发明专利、实用新型专利、外观设计专利)有两种方式:1、自己直接向国家知识产权局申请。2、通过专利代办处申请。以下是对这两种专利类型(发明专利、实用新型专利)申请过程及两种申请方式的详细介绍和对比,参考…...

Datawhale AI冬令营(第二期)动手学AI Agent task2--学Prompt工程,优化Agent效果
目录 如何写好Prompt? 工具包神器1:Prompt框架——CO-STAR 框架 工具包神器2:Prompt结构优化 工具包神器3:引入案例 案例:构建虚拟女友小冰 1. 按照 CO-STAR框架 梳理目标 2. 撰写Prompt 3. 制作对话生成应用&…...

基于python对网页进行爬虫简单教程
python对网页进行爬虫 基于BeautifulSoup的爬虫—源码 """ 基于BeautifulSoup的爬虫###?一、BeautifulSoup简介1.?Beautiful?Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供…...

【JavaEE进阶】@RequestMapping注解
目录 📕前言 🌴项目准备 🌲建立连接 🚩RequestMapping注解 🚩RequestMapping 注解介绍 🎄RequestMapping是GET还是POST请求? 🚩通过Fiddler查看 🚩Postman查看 …...

【WebAR-图像跟踪】在Unity中基于Imagine WebAR实现AR图像识别
写在前面的话 感慨一下, WebXR的发展是真的快,20年的时候,大多都在用AR.js做WebAR。随着WebXR标准发展,现在诸如Threejs、AFrame、Unity等多个平台都支持里WebXR。 本文将介绍在Unity中使用 Image Tracker实现Web端的AR图像识别功…...
向bash shell脚本传参
例子: ~ script % touch parameter.sh ~ script % chmod 755 parameter.sh ~ % vim parameter.shparameter.sh: #!/usr/bin/env bashecho the name of current script is $0echo the first parameter is $1echo the second parameter is $2echo all parameters: $…...
Oracle中listagg与wm_concat函数的区别
Oracle中listagg与wm_concat都可以用于将多行数据合并成一个字符串的两个函数,区别如下: 1、分隔符:listagg支持指定分隔符,wm_concat默认为","不支持指定; 2、排序:listagg支持排序后…...
热更新与资源管理
热更新、资源管理、打包发布是 Unity 游戏开发中关键的技术点。这些功能可以极大地提高项目的灵活性和资源利用效率,尤其是在多平台、长生命周期的游戏项目中。以下从技术概述、知识点分析、实现方法和代码举例逐一进行详细分析。 一、热更新 热更新指在不重新发布…...

Momentum Provably Improves Error Feedback!
以下是您提供的论文摘要的翻译: **摘要** 由于在分布式环境中训练机器学习模型时通信开销较高,现代算法不可避免地依赖于有损通信压缩。然而,如果不加以处理,压缩造成的错误会传播,并可能导致严重的不稳定行为&#…...

Elasticsearch-脚本查询
脚本查询 概念 Scripting是Elasticsearch支持的一种专门用于复杂场景下支持自定义编程的强大的脚本功能,ES支持多种脚本语言,如painless,其语法类似于Java,也有注释、关键字、类型、变量、函数等,其就要相对于其他脚本高出几倍的性…...

《Opencv》基础操作详解(3)
接上篇:《Opencv》基础操作详解(2)-CSDN博客 Opencv基础操作 目录 Opencv基础操作 18、图像边界填充 19、阈值处理(图像的二值化) 20、图像平滑处理 (1)、均值滤波(Mean Filte…...

meshy的文本到3d的使用
Meshy官方网站: 中文官网: Meshy官网中文站 编辑 Opens in a new window 编辑www.meshycn.com Meshy AI 中文官网首页 英文官网: Meshy目前似乎还没有单独的英文官网,但您可以在中文官网上找到英文界面或相关英文资料。 链…...

C语言技巧之有条件的累加
什么叫有条件的累加? 主要是依靠循环,一般形式是一个在循环里面遍历,另一个只有达到一定的条件才会累加(移动到下一个变量),从言语也能看出来,主要是用在字符串和数组里面的,毕竟链表…...

解释为什么fetch(JavaScript)无法将读取的数据存入外部变量
(一)问题描述 你可能会遇到这样的情况:在fetch之外创建变量,将fetch获取到的数据赋值给这个变量以便在fetch外使用,但在使用这个变量的时候发现值是空的,这是为什么呢? (二…...

Windows Subsystem for Linux (WSL)
目录 定义与功能 版本与特点 应用场景 启用 WSL 功能 更新WSL及其内核 下载Linux发行版本 WSL(Windows Subsystem for Linux)是微软在Windows 10和Windows 11中引入的一项功能,使用户能够在Windows上原生运行Linux的命令行工具和应用程…...
Go的Slice如何扩容
在Go语言中,slice(切片)是一个动态数组,其底层实现是基于数组,但提供了更灵活的长度和容量管理。当向slice中添加元素并超出其当前容量时,Go会自动为其分配一个更大的底层数组,并复制现有元素到…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...