当前位置: 首页 > news >正文

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)日志数据类型,支持高效的追加和消费操作实时日志、消息流处理、事件存储等

相关文章:

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为例&#xff0c;演示步骤和注意事项 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可以用来标注目标检测的数据集&#xff0c; 提供多种格式的输出&#xff0c; 如Pascal Voc, YOLO等。 1.1 安装 pip install labelimg1.2 使用 命令行直接输入labelimg即可打开软件主界面进行操作。 使用非常简单&#xff0c; 不做过细的介绍&#xff0…...

发明专利与实用新型专利申请过程及自助与代办方式对比

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

Datawhale AI冬令营(第二期)动手学AI Agent task2--学Prompt工程,优化Agent效果

目录 如何写好Prompt&#xff1f; 工具包神器1&#xff1a;Prompt框架——CO-STAR 框架 工具包神器2&#xff1a;Prompt结构优化 工具包神器3&#xff1a;引入案例 案例&#xff1a;构建虚拟女友小冰 1. 按照 CO-STAR框架 梳理目标 2. 撰写Prompt 3. 制作对话生成应用&…...

基于python对网页进行爬虫简单教程

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

【JavaEE进阶】@RequestMapping注解

目录 &#x1f4d5;前言 &#x1f334;项目准备 &#x1f332;建立连接 &#x1f6a9;RequestMapping注解 &#x1f6a9;RequestMapping 注解介绍 &#x1f384;RequestMapping是GET还是POST请求&#xff1f; &#x1f6a9;通过Fiddler查看 &#x1f6a9;Postman查看 …...

【WebAR-图像跟踪】在Unity中基于Imagine WebAR实现AR图像识别

写在前面的话 感慨一下&#xff0c; WebXR的发展是真的快&#xff0c;20年的时候&#xff0c;大多都在用AR.js做WebAR。随着WebXR标准发展&#xff0c;现在诸如Threejs、AFrame、Unity等多个平台都支持里WebXR。 本文将介绍在Unity中使用 Image Tracker实现Web端的AR图像识别功…...

向bash shell脚本传参

例子&#xff1a; ~ 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都可以用于将多行数据合并成一个字符串的两个函数&#xff0c;区别如下&#xff1a; 1、分隔符&#xff1a;listagg支持指定分隔符&#xff0c;wm_concat默认为"&#xff0c;"不支持指定&#xff1b; 2、排序&#xff1a;listagg支持排序后…...

热更新与资源管理

热更新、资源管理、打包发布是 Unity 游戏开发中关键的技术点。这些功能可以极大地提高项目的灵活性和资源利用效率&#xff0c;尤其是在多平台、长生命周期的游戏项目中。以下从技术概述、知识点分析、实现方法和代码举例逐一进行详细分析。 一、热更新 热更新指在不重新发布…...

Momentum Provably Improves Error Feedback!

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

Elasticsearch-脚本查询

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

《Opencv》基础操作详解(3)

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

meshy的文本到3d的使用

Meshy官方网站&#xff1a; 中文官网&#xff1a; Meshy官网中文站 ​编辑 Opens in a new window ​编辑www.meshycn.com Meshy AI 中文官网首页 英文官网&#xff1a; Meshy目前似乎还没有单独的英文官网&#xff0c;但您可以在中文官网上找到英文界面或相关英文资料。 链…...

C语言技巧之有条件的累加

什么叫有条件的累加&#xff1f; 主要是依靠循环&#xff0c;一般形式是一个在循环里面遍历&#xff0c;另一个只有达到一定的条件才会累加&#xff08;移动到下一个变量&#xff09;&#xff0c;从言语也能看出来&#xff0c;主要是用在字符串和数组里面的&#xff0c;毕竟链表…...

解释为什么fetch(JavaScript)无法将读取的数据存入外部变量

&#xff08;一&#xff09;问题描述 你可能会遇到这样的情况&#xff1a;在fetch之外创建变量&#xff0c;将fetch获取到的数据赋值给这个变量以便在fetch外使用&#xff0c;但在使用这个变量的时候发现值是空的&#xff0c;这是为什么呢&#xff1f; &#xff08;二&#xf…...

Windows Subsystem for Linux (WSL)

目录 定义与功能 版本与特点 应用场景 启用 WSL 功能 更新WSL及其内核 下载Linux发行版本 WSL&#xff08;Windows Subsystem for Linux&#xff09;是微软在Windows 10和Windows 11中引入的一项功能&#xff0c;使用户能够在Windows上原生运行Linux的命令行工具和应用程…...

Go的Slice如何扩容

在Go语言中&#xff0c;slice&#xff08;切片&#xff09;是一个动态数组&#xff0c;其底层实现是基于数组&#xff0c;但提供了更灵活的长度和容量管理。当向slice中添加元素并超出其当前容量时&#xff0c;Go会自动为其分配一个更大的底层数组&#xff0c;并复制现有元素到…...

成电计算机复试面试:如何用一份‘心机’简历引导老师提问,并提前准备好答案?

计算机复试策略&#xff1a;如何用结构化简历设计引导面试走向 站在电子科技大学计算机复试的考场外&#xff0c;大多数考生都在反复背诵技术概念和项目细节&#xff0c;却很少有人意识到——面试本质上是一场精心设计的对话博弈。那些最终获得高分的考生&#xff0c;往往不是知…...

Spring Security实战:Bcrypt加密算法在用户密码存储中的正确使用姿势(附完整代码)

Spring Security实战&#xff1a;Bcrypt加密算法在用户密码存储中的正确使用姿势&#xff08;附完整代码&#xff09; 在当今数字化时代&#xff0c;用户密码安全已成为系统开发中最基础也最关键的一环。作为开发者&#xff0c;我们经常面临一个核心问题&#xff1a;如何在数据…...

第3期 工程车辆目标检测数据集

第3期 目标检测——工程车辆数据集 一、研究背景与意义 工程车辆是建筑工程机械的核心组成部分,涵盖汽车吊、随车吊、挖掘机、推土机、压路机、工程抢险车等品类,承担着工程建设中的运载、挖掘、吊运、平整、抢修等关键工作,大幅提升了建筑工程施工效率,显著降低人力投入…...

构建专业级Java量化交易系统的5个实战步骤

构建专业级Java量化交易系统的5个实战步骤 【免费下载链接】ta4j A Java library for technical analysis. 项目地址: https://gitcode.com/gh_mirrors/ta/ta4j 你是否曾想用Java构建自己的量化交易系统&#xff0c;但被复杂的技术指标和回测框架吓退&#xff1f;今天&a…...

免费开源Sunshine游戏串流服务器终极指南:打造你的专属云游戏平台

免费开源Sunshine游戏串流服务器终极指南&#xff1a;打造你的专属云游戏平台 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 想要在任何设备上畅玩PC游戏&#xff0c;却受限于硬件…...

西门子S7-300 PLC实战:从零搭建药品装瓶机控制系统(附组态王6.55配置)

西门子S7-300 PLC实战&#xff1a;从零搭建药品装瓶机控制系统&#xff08;附组态王6.55配置&#xff09; 在制药生产线上&#xff0c;药品装瓶环节的效率直接影响整体产能。传统人工装瓶方式不仅速度慢&#xff0c;还容易产生计数误差。而采用PLC控制的自动化装瓶系统&#x…...

SiameseUIE部署指南:test.py中custom_entities字段详解

SiameseUIE部署指南&#xff1a;test.py中custom_entities字段详解 1. 概述 如果你正在使用SiameseUIE模型进行信息抽取&#xff0c;那么test.py脚本中的custom_entities字段就是你最需要关注的核心配置。这个看似简单的字段&#xff0c;实际上决定了模型如何精准地从文本中抽…...

seq2seq-couplet错误处理与敏感词过滤:保障服务稳定性的终极指南

seq2seq-couplet错误处理与敏感词过滤&#xff1a;保障服务稳定性的终极指南 【免费下载链接】seq2seq-couplet Play couplet with seq2seq model. 用深度学习对对联。 项目地址: https://gitcode.com/gh_mirrors/se/seq2seq-couplet seq2seq-couplet是一个基于深度学习…...

突破百度网盘限速难题:非会员高速下载的技术实现与实战指南

突破百度网盘限速难题&#xff1a;非会员高速下载的技术实现与实战指南 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 当你急需下载一份600MB的项目资料&#xff0c;却发现百…...

Fish Speech-1.5镜像资源管理:模型热更新与多版本共存部署方案

Fish Speech-1.5镜像资源管理&#xff1a;模型热更新与多版本共存部署方案 1. 引言&#xff1a;语音合成的新选择 想象一下&#xff0c;你需要为产品演示视频添加多语言配音&#xff0c;或者为在线课程制作不同语言的语音内容。传统方法要么成本高昂&#xff0c;要么效果生硬…...