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

Redis 数据结构详解:底层实现与高效使用场景

String(字符串)

底层实现细节:
  1. 动态字符串(SDS): SDS相比于C语言的原生字符串,提供了自动内存管理和预分配机制。当字符串长度增加时,SDS会预先分配额外的空间,以减少内存重新分配的次数。
  2. EMBSTR编码: 在Redis 3.2之后,对于小字符串(长度小于44字节),引入了EMBSTR编码。这种编码将字符串和长度信息一起存储在一个连续的内存块中,以减少内存碎片和分配次数。
使用场景细节:
  • 存储简单的文本数据。
  • 存储JSON格式的数据。
  • 存储序列化后的对象。

List(列表)

底层实现细节:
  1. ziplist(压缩列表): 当列表元素较少且元素本身较小时,Redis使用ziplist。ziplist是一种紧凑的、连续的内存布局,可以存储多个元素。每个元素由前一个元素的大小、元素内容和元素类型组成。
  2. linkedlist(双向链表): 当列表元素较多或元素本身较大时,Redis使用linkedlist。双向链表提供了快速的插入和删除操作。
使用场景细节:
  • 作为消息队列,按插入顺序处理消息。
  • 存储文章或新闻列表,按发布时间排序。
  • 存储用户关注列表或好友列表。

Hash(哈希)

底层实现细节:
  • 哈希表(hashtable): Redis的哈希表使用开放寻址法解决哈希冲突。每个桶包含一个链表,用于存储具有相同哈希值的键值对。当哈希表需要扩展时(负载因子超过一定阈值),Redis会创建一个更大的哈希表,并将原哈希表中的数据重新哈希到新的哈希表中。
使用场景细节:
  • 存储对象的属性,如用户信息、商品详情等。
  • 实现缓存系统,将键映射到值。

Set(集合)

底层实现细节:
  1. intset(整数集合): 当集合只包含整数且元素个数较少时,Redis使用intset。intset是一种紧凑的存储方式,直接存储整数值,而不需要额外的键。
  2. hashtable(哈希表): 当集合包含非整数元素或元素个数较多时,Redis使用hashtable。
使用场景细节:
  • 实现去重功能。
  • 执行集合运算,如交集、并集和差集。
  • 存储标签或兴趣列表。

Zset(有序集合)

底层实现细节:
  1. skiplist(跳跃表): 跳跃表是一种可以进行二分查找的有序链表。它通过在链表中添加多级索引来提高查找效率。在Zset中,跳跃表用于按分数对元素进行排序。
  2. hashtable(哈希表): 哈希表用于存储元素到分数的映射关系,以便在O(1)时间复杂度内获取元素的分数。
使用场景细节:
  • 实现排行榜,按分数从高到低排序。
  • 存储按权重排序的列表,如搜索引擎中的关键词权重。
  • 实现范围查询,如查找分数在某个范围内的元素。

通过这些详细的底层实现和使用场景,我们可以看到Redis是如何在满足性能需求的同时,尽可能地节省内存空间的。不同的数据结构和底层实现在不同的使用场景下都有其优势和适用性。

相关文章:

Redis 数据结构详解:底层实现与高效使用场景

String(字符串) 底层实现细节: 动态字符串(SDS): SDS相比于C语言的原生字符串,提供了自动内存管理和预分配机制。当字符串长度增加时,SDS会预先分配额外的空间,以减少内存重新分配…...

Vue2:router-link的replace属性

一、情景说明 我们在用浏览器访问网站的时候 知道浏览器会记录访问的历史路径,从而,可以退回到之前的页面 那么,Vue项目中的路由组件,通过router-link跳转,也是可以退回的 这里,我们用replace来屏蔽退回的…...

普中51单片机(DS18B20温度传感器)

DS18B20温度传感器原理 内部结构 64位(激)光刻只读存储器 光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列号。64位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身…...

2.23C语言学习

P1480 A/B Problem 高精度数除以非高精度数 #include<bits/stdc.h> long long b[66660],c[66660],sum0; char a[66660]; int n; int main(){scanf("%s",a);scanf("%d",&n);int lenstrlen(a);for(int i1;i<len;i){b[i]a[i-1]-0;}for(int i1;…...

origin/master master

这里实际上有三件事&#xff1a;origin master是两件事&#xff0c;origin/master一件事。共计三件事。 两个分支&#xff1a; master 是一个本地分支 origin/master是远程分支&#xff08;它是名为“origin” 的远程分支的本地副本&#xff0c;名为“master”&#xff09; 一个…...

【数据结构】时间复杂度与空间复杂度

目录 时间复杂度 空间复杂度 时间复杂度 算法的时间复杂度并不是指一个代码运行时间的快慢&#xff0c;因为在不同机器上运行的时间肯定不同&#xff0c;因此算法的时间复杂度指的是基本操作的执行次数&#xff0c;他是一个数学意义上的函数。这个函数并不是C语言中那种函数&…...

分别使用js与jquery写 单击按钮时出现内容 点击删除按钮不会再向下出现

HTML部分 <body><button id"btn">单击我</button><button id"delAll">删除所有事件</button><div id"test"></div> </bady>jQuery代码 <script type"text/JavaScript" src"…...

【Git】Git命令的学习与总结

本文实践于 Learn Git Branching 这个有趣的 Git 学习网站。在该网站&#xff0c;可以使用 show command 命令展示所有可用命令。你也可以直接访问网站的sandbox&#xff0c;自由发挥。 一、本地篇 基础篇 git commit git commit将暂存区&#xff08;staging area&#xff…...

前端工程化面试题 | 18.精选前端工程化高频面试题

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

大公司的工程师是怎么废掉的...

大家好&#xff0c;我是砖一。 此文作者以嵌入式工程师为基本视角&#xff0c;细说了从初阶到高阶工程师的资质需求&#xff0c;并提示工程师职业道路上的陷阱。可供参考。 一&#xff0c;基础知识 一个嵌入式工程师&#xff0c;很多都是从51单片机或者STM32单片机开始&…...

将yolov8权重文件转为onnx格式并在c#中使用

yolo模型转ONNX 在yolov8中&#xff0c;我们将训练结果的.pt权重文件转换为onnx格式只需要使用ultralytics库中的YOLO类&#xff0c;使用pip安装ultralytics库&#xff0c;然后执行下面python代码 from ultralytics import YOLO# 加载YOLOv8模型 model YOLO("best.pt&q…...

在Spring Boot启动时禁止自动配置数据源相关的组件、@SpringBootApplication

一、SpringBootApplication(exclude {DataSourceAutoConfiguration.class})注解 在Spring Boot启动时禁止自动配置数据源相关的组件。 SpringBootApplication(exclude {DataSourceAutoConfiguration.class})注解的使用案例 这个注解通常应该写在微服务项目的主启动类上&…...

程序人生:不积跬步无以致千里

程序人生 癸卯年冬月&#xff0c;往渭南韩城&#xff0c;拜访司马迁祠。入门攀爬而上&#xff0c;至人有困乏之时&#xff0c;抬头现&#xff1a;高山仰止。归路下山&#xff0c;始现三官洞&#xff0c;遥想西汉时三官洞&#xff0c;出口处刻意再拜别&#xff1a;高山仰止。泪…...

通过二叉树例题深入理解递归问题

目录 引入&#xff1a; 例1&#xff1a;二叉树的前序遍历&#xff1a; 例2&#xff1a; N叉树的前序遍历&#xff1a; 例3&#xff1a;二叉树的最大深度&#xff1a; 例4&#xff1a;二叉树的最小深度 例5&#xff1a;N叉树的最大深度&#xff1a; 例6&#xff1a;左叶子…...

【Android 协程常见用法】

我们这里只讲解一下&#xff0c;协程在Android项目中常见用法&#xff0c;原理知识不在进行说明了。 依赖 lifecycleScope只能在Activity、Fragment中使用&#xff0c;会绑定Activity和Fragment的生命周期。依赖库&#xff1a; implementation androidx.lifecycle:lifecycle…...

python 进程笔记一 (概念+示例代码)

1. 进程的概念 进程是资源分配的最小单位&#xff0c;也是线程的容器&#xff0c;线程&#xff08;python 线程 &#xff08;概念示例代码&#xff09;&#xff09;是CPU调度的基本单位&#xff0c;一个进程包括多个线程。 程序&#xff1a;例如xxx.py是一个程序 进程&#xf…...

各中间件数据库默认访问端口总结

说明 在生态丰富的开发环境下&#xff0c;我们常常需要接触很多中间件产品&#xff0c;中间件默认的连接端口以及可视化ui访问端口也时不时的需要用到&#xff0c;这里循序渐进做好登记&#xff0c;以备查阅&#xff01; 中间件/数据库名称默认端口管理台端口默认账号密码rabbi…...

鲲鹏arm64架构下安装KubeSphere

鲲鹏arm64架构下安装KubeSphere 官方参考文档: https://kubesphere.io/zh/docs/quick-start/minimal-kubesphere-on-k8s/ 在Kubernetes基础上最小化安装 KubeSphere 前提条件 官方参考文档: https://kubesphere.io/zh/docs/installing-on-kubernetes/introduction/prerequi…...

python 函数-02-返回值注释格式

01 函数返回值 1&#xff09;python中函数可以没有返回值&#xff0c;也可以有通过return的方式 – 【特殊性&#xff0c;区别于java c#等】 2&#xff09;返回值可以是一个或者多个&#xff0c;多个时通过逗号隔开 – 【特殊性&#xff0c;区别于java c#等】 3&#xff09;多…...

【前端素材】推荐优质后台管理系统Upcube平台模板(附源码)

一、需求分析 后台管理系统在多个层次上提供了丰富的功能和细致的管理手段&#xff0c;帮助管理员轻松管理和控制系统的各个方面。其灵活性和可扩展性使得后台管理系统成为各种网站、应用程序和系统不可或缺的管理工具。 当我们从多个层次来详细分析后台管理系统时&#xff0…...

可视化 RAG 数据 — 用于检索增强生成的 EDA

原文地址&#xff1a;Visualize your RAG Data — EDA for Retrieval-Augmented Generation 2024 年 2 月 8 日 Github&#xff1a;https://github.com/Renumics/rag-demo/blob/main/notebooks/visualize_rag_tutorial.ipynb 为探索Spotlight中的数据&#xff0c;我们使用Pa…...

数学建模论文、代码百度网盘链接

1.[2018中国大数据年终总决赛冠军] 金融市场板块划分与轮动规律挖掘与可视化问题 2.[2019第九届MathorCup数模二等奖] 数据驱动的城市轨道交通网络优化策略 3.[2019电工杯一等奖] 露天停车场停车位的优化设计 4.[2019数学中国网络数模一等奖] 基于机器学习的保险业数字化变革…...

mysql 迁移-data目录拷贝方式

背景&#xff1a;从服务器进水坏掉&#xff0c;50多G的数据库要重新做主从&#xff0c;但以导入导出的方式太慢&#xff0c;简直是灾难性的&#xff0c;一夜都没好&#xff0c;只好想到了拷贝mysql数据文件的方式 拷贝的数据文件的前提 1.数据库版本必需一致&#xff08;可以…...

学习 LangChain 的 Passing data through

学习 LangChain 的 Passing data through 1. Passing data through2. 示例 1. Passing data through RunnablePassthrough 允许不改变或添加额外的键来传递输入。这通常与 RunnableParallel 结合使用&#xff0c;将数据分配给映射中的新键。 RunnablePassthrough() 单独调用&…...

C# OpenVINO PaddleSeg实时人像抠图PP-MattingV2

目录 效果 项目 代码 下载 C# OpenVINO 百度PaddleSeg实时人像抠图PP-MattingV2 效果 项目 代码 using OpenCvSharp; using Sdcb.OpenVINO; using System; using System.Diagnostics; using System.Drawing; using System.Security.Cryptography; using System.Text; us…...

【Android 11】AOSP Settings WIFI随机MAC地址功能

AOSP Settings WIFI随机MAC地址功能 背景 最近客户提出了想要实现随机WIFIMAC地址的功能&#xff08;我们默认WIFI的MAC地址是固定的&#xff09;。网上搜到了一篇不错的文章&#xff0c;本次改动也是基于这个来写的。 由于客户指定使用的settings是AOSP的&#xff0c;所以在…...

dmrman备份还原

脱机还原工具-dmrman 前言 根据达梦官网文档整理 一、概述 DMRMAN 命令行设置参数执行又可分为命令行指定脚本、命令行指定语句两种执行方式。 指定语句 $ DMRMAN RMAN>BACKUP DATABASE/dmdata/data/DAMENG/dm.ini;指定脚本 创建一个名为 cmd_file.txt 的文件&#x…...

网页403错误(Spring Security报异常 Encoded password does not look like BCrypt)

这个错误通常表现为"403 Forbidden"或"HTTP Status 403"&#xff0c;它指的是访问资源被服务器理解但拒绝授权。换句话说&#xff0c;服务器可以理解你请求看到的页面&#xff0c;但它拒绝给你权限。 也就是说很可能测试给定的参数有问题&#xff0c;后端…...

单细胞多组学整合与对齐的计算方法

Computational Methods for Single-cell Multi-omics Integration and Alignment Bioinformatics-2022-密西根大学 关键词&#xff1a;单细胞;多组学;机器学习;无监督学习;集成 摘要 最近发展起来的生成单细胞基因组数据的技术在生物学领域产生了革命性的影响。多组学测定提…...

33.openeuler OECA认证模拟题16

一 、选择题 1.如何查看系统支持的 shell? A、cat /etc/passwd B、cat /etc/shells C、echo SSHELL D、echo $0 答案 :B 2.下列哪项不是 shell的功能? A 、 用户界面,提供用户与内核交互接口 B 、 命令解释器 C 、提供编译环境 D 、 提供各种管理工具,…...

衡水安徽网站建设/如何分析百度指数

站在风口上&#xff0c;猪都能飞起来。人工智能风口&#xff0c;让Pyhon这门胶水语言转变成非常火的网红语言。编程功力深厚的程序员花一两个星期就能上手Python&#xff0c;而一些新手程序员花几个月就可以上手。学编程&#xff0c;用Python确实是一个相当不错的选择。不过&am…...

做网站维护前景/宁波专业seo服务

上午主要是开会部门岗位调整&#xff0c;下午开会明确基线工作&#xff0c;计划讨论BS采用统一用户权限方式实现&#xff0c;单独做一个独立的平台&#xff0c;感觉这种松耦合的实现方式很好&#xff0c;原来老的平台就是因为耦合太严重才出现现在这样各种问题。 终于要从delph…...

淄博网站制作设计定制/企业推广公司

JavaFX教程 - JavaFX按钮当用户单击按钮时&#xff0c;JavaFX Button类可以触发事件。Button类扩展标记的类&#xff0c;它可以显示文本&#xff0c;图像&#xff0c;或两者兼而有之。以下代码显示了如何向Button添加单击操作侦听器。import javafx.application.Application;im…...

中搜网站提交/策划网络营销活动

QList是一种表示链表的模板类。QList是Qt的一种泛型容器类。它以链表方式存储一组值&#xff0c;并能对这组数据进行快速索引&#xff0c;还提供了快速插入和删除等操作。QList、QLinkedList和QVector提供的操作极其相似&#xff1a;*对大多数操作来说&#xff0c;我们用QList就…...

做程序题的国外网站/营销型网站建设实训总结

1、django是怎么用的&#xff1f;具体的呢&#xff1f; 2、能自己写前端代码吗&#xff1f;前端的框架呢&#xff1f; 3、支付宝/微信支付实现&#xff0c;是自己看的接口文档吗&#xff1f;能看懂开发文档吗&#xff1f; 4、你之前做的项目中&#xff0c;最复杂的查询是&#…...

google网站收录入口/今日小说百度搜索风云榜

Python的功能十分强大&#xff0c;有很多令人意想不到的功能&#xff0c;学会python可以大大提高你的工作效率&#xff0c;帮助你解决人工重劳动。本期将继续向大家介绍python中的实用技能&#xff0c;本期的主题是&#xff1a;用Python批量发送带有正文和附件的邮件。让我们一…...