Redis常见的数据结构
Redis底层的数据结构是Redis高效存储和操作数据的基础,Redis提供了五种基本的数据类型,每种类型在底层都有对应的数据结构来实现。这五种数据类型分别是:字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。
1. 字符串(String)
字符串是Redis中最基本的数据类型,底层实现使用的是简单动态字符串(SDS),SDS具有以下特点:
1.长度与空间: SDS 维护了一个 len 字段表示已使用长度,一个 free 字段表示未使用的剩余空间,避免了每次操作都重新计算字符串长度。
2.二进制安全: SDS 可以存储任意二进制数据,不像 C 语言的字符串只能存储文本数据。
3.空间预分配: 当 SDS 扩展时,除了为新内容分配必要的空间外,还会分配额外的空间以减少未来的扩展次数。
4.惰性空间释放: 当 SDS 缩小时,并不会立即回收多余空间,而是通过 free 字段记录剩余空间,以备后续使用。
应用场景
缓存对象: 字符串类型通常用来缓存简单的对象,比如缓存用户信息、网页内容、配置信息等。
计数器: 可以使用字符串类型来实现计数器,利用 INCR、DECR 操作对数值进行原子性的加减操作。适用于统计网站访问量、点赞数等。
分布式锁: 可以使用字符串类型加上 SETNX 命令实现分布式锁。通过给字符串设置一个过期时间来确保锁的自动释放。
Session 数据: 可以将用户的会话数据存储在 Redis 中,利用字符串类型快速读取和更新会话信息。
2. 列表(List)
Redis 的列表类型底层使用了两种数据结构:双向链表 和 压缩列表(ziplist)。
双向链表: 用于存储元素较多或者元素较大的列表。双向链表的特点是支持双向遍历,插入和删除操作非常高效。
压缩列表: 是一种内存紧凑型的连续内存块,用于存储较小数量的短字符串列表。当列表中的元素较少且元素值较小时,Redis 会选择使用压缩列表来节省内存。
应用场景
消息队列: 利用列表的 LPUSH 和 RPOP(或 BRPOP)操作,可以实现简单的消息队列,支持先进先出的队列模式。
任务队列: 将待处理的任务存入列表,工作线程可以从列表中取出任务进行处理,非常适合任务调度、工作队列的场景。
日志收集: 可以使用列表来收集和存储日志信息,日志信息可以通过 LPUSH 插入到列表中,再通过 LRANGE 或 LPOP 进行读取和处理。
分页数据: 在某些场景下,可以将数据存储在列表中,并使用 LRANGE 命令进行分页显示。
3.哈希(Hash)
哈希类型的底层也使用了 压缩列表(ziplist) 和 哈希表(hashtable) 两种结构。
压缩列表: 当哈希表中的键值对较少且每个键值对的数据量都比较小时,Redis 会使用压缩列表来存储,节省内存。
哈希表: 当哈希表的元素较多时,Redis 会自动转换为哈希表结构,哈希表实现了高效的查找、插入和删除操作。
应用场景
存储对象信息: 哈希类型特别适合存储对象,例如存储用户信息、产品信息等。每个对象的字段可以作为哈希表的键,字段值作为哈希表的值。
计数器: 在某些场景下,需要为多个字段进行独立的计数操作,哈希类型可以为每个字段单独计数,例如对用户行为进行分类统计。
元数据存储: 在一些需要存储大量小数据的场景下,哈希类型可以用来存储这些元数据,例如缓存数据库中的表行数据。
4. 集合(Set)
集合类型的底层数据结构是 哈希表(hashtable),因为集合的元素是无序且唯一的。Redis 使用哈希表来确保集合元素的唯一性并提供 O(1) 的查找、插入和删除操作。
应用场景
标签系统: 集合可以用于实现标签系统,例如存储用户的兴趣标签,利用集合的无序性和唯一性,确保每个用户兴趣只被存储一次。
去重: 在需要去重的场景下,可以利用集合来存储数据并确保数据唯一性。例如,在社交媒体应用中,跟踪用户点赞的帖子。
好友推荐: 可以使用集合操作来计算两个用户的共同好友,通过 SINTER 等操作获得交集,从而推荐共同好友。
实时排名: 集合可以用于一些简单的实时排名系统,通过 SADD 和 SMEMBERS 操作,可以实现实时更新和查询。
5.有序集合(Sorted Set)
有序集合的底层数据结构是跳表(skiplist)和压缩列表(ziplist)的结合。
跳表: 用于存储大量有序的元素,支持快速的范围查询操作。跳表是 Redis 实现有序集合的核心数据结构,通过多层链表来实现快速查找。
压缩列表: 当有序集合中的元素较少时,Redis 会使用压缩列表来存储,以节省内存。
应用场景
排行榜: 有序集合广泛用于实现排行榜系统,例如根据用户的得分排序排名,使用 ZADD 添加数据,ZRANGE 获取排名。
延迟队列: 可以使用有序集合实现延迟任务队列,通过分数表示任务的执行时间,到达指定时间时执行任务。
限时活动: 在限时促销或竞拍等场景中,可以使用有序集合存储用户出价和时间,根据分数(价格或时间)排序确定优先级。
优先级队列: 有序集合也可以用来实现优先级队列,根据任务的优先级不同给定不同的分数,任务可以按照优先级执行。
6.HyperLogLog
HyperLogLog 是一种概率性的数据结构,用于计算数据的基数(即去重后元素的数量)。它的主要优点是在处理大量元素时,使用非常少的内存就能给出一个误差范围可接受的基数估计。
应用场景
大数据去重统计: 适用于大规模数据的基数统计,例如统计一个网站的日活跃用户(UV),HyperLogLog 可以在使用极少内存的情况下给出一个大致的唯一用户数。
在线统计: 可以用于实时监测和统计,例如在广告系统中统计广告点击的独立用户数。
7. 位图(Bitmap)
位图不是 Redis 的基本数据类型,而是一种基于字符串类型的高级操作。位图将字符串的每个比特位视为一个二进制位,从而可以高效地进行大规模的布尔类型操作。
应用场景
用户签到系统: 可以使用位图记录用户的签到情况,每一位表示一天,1 表示签到,0 表示未签到,可以快速统计用户的连续签到天数、缺勤次数等。
权限控制: 位图可以用于实现简单的权限控制,使用一组比特位表示不同的权限,判断某用户是否拥有某项权限。
活跃用户统计: 可以使用位图记录某段时间内用户是否活跃,每位表示一天,通过 BITCOUNT 可以快速统计某段时间内的活跃天数。
8.Geospatial(地理空间索引)
Redis 提供了一套基于有序集合的地理空间数据类型,通过 GeoHash 和有序集合实现地理位置的存储和查询。
应用场景
附近的人/店铺搜索: 可以用于 LBS(Location-Based Service)应用,存储用户或店铺的地理位置,通过 GeoHash 和有序集合来快速计算某点附近的其他点。
物流跟踪: 可以存储快递或者车辆的地理位置,并在需要时查询某个位置周围的快递或车辆。
相关文章:
Redis常见的数据结构
Redis底层的数据结构是Redis高效存储和操作数据的基础,Redis提供了五种基本的数据类型,每种类型在底层都有对应的数据结构来实现。这五种数据类型分别是:字符串(String)、哈希(Hash)、列表(List…...
批量插入insert到SQLServer数据库,BigDecimal精度丢失解决办法,不动代码,从驱动层面解决
概述 相信很多人都遇到过,使用sql server数据库,批量插入数据时,BigDecimal类型出现丢失精度的问题,网上也有很多人给出过解决方案,但一般都要修改应用代码,不推荐。 丢失精度的本质是官方的驱动有BUG造成…...
随手记:uniapp小程序登录方式和小程序使用验证码登录
小程序登录方式: 方式一:小程序授权登录 通过uni.login获取 临时登录凭证code,向后端换取token。 <u-button type"primary" shape"circle" click"login">登 录</u-button>login() {uni.login({p…...
【Hadoop|HDFS篇】DataNode概述
1. DataNode的工作机制 1)一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。 2)DataNode启动后向NameNod…...
Vue2 VueRouter学习笔记
VueRouter 官方文档 版本对应 vue2:3.x.x vue3:4.x.x 路由:访问路径与vue组件(页面)之间的映射关系 VueRouter:Vue官方提供的插件,本质上是一个 JavaScript 库,用于在 Vue.js 应用…...
3D培训大师,化工企业安全教育与应急演练的新助力
化工企业的生产安全培训,作为保障员工生命安全与企业稳定运营的基石,其重要性不言而喻。传统的培训方式内容僵化、形式单一缺乏互动、效果难以评估,越来越不适应化工企业的实际需求。因此,探索和应用更为高效、创新的培训工具&…...
斯坦福大学论文润色chat-gpt指令
Quick Prompts快速提示 To enhance text clarity-为了增强文本清晰度 As a non-native English speaker, kindly help me revise the following text for improved understand clarity. Please check for spelling and sentence structure errors and suggest alternatives.为…...
简单硬件在环搭建(ROS+Prescan+Carsim+simulink)
本文通过ROSPrescanCarsimsimulink搭建简单的硬件在环仿真测试平台。 系统架构如下: 在Windows中运行prescan场景仿真软件,在jetson Nano中运行ROS,硬件上两台电脑通过一根网线相连传输信息; 1.prescan与carsim的集成 在C:\car…...
【Python 数据分析学习】Pandas基础与应用(1)
题目 1 Pandas 简介1.1 主要特征1.2 Pandas 安装 2 Pandas中的数据结构2.1 Series 数据结构和操作2.1.1 Series的数据结构2.1.2 Seres的操作 2.2 DataFrame 数据结构和操作2.2.1 DataFrame 数据结构2.2.2 Dataframe 操作2.2.3 DateFrame 的特殊操作 2.3 Series 和 DataFrame 的…...
pytorch入门(1)——pytorch加载数据初认识
环境配置及其安装: 2023最新pytorch安装(超详细版)-CSDN博客 pytorch加载数据初认识 Dataset:创建可被Pytorch使用的数据集 提供一种方式获取数据及其label Dataloader:向模型传递数据 为网络提供不同的数据形式 …...
Spring下载文件
1、controller /*** 下载文件通过ID** param auditInformationDTO 靓号稽核文件DTO* param servletResponse 响应体*/ GetMapping(value "/downloadAuditFileByAuditFileId") public void downloadAuditFileByAuditFileId(ModelAttribute final GoodNumberAuditInf…...
如何在数据库中备份表:操作指南与注意事项
在数据库管理中,备份表是一种常见的操作,它可以帮助我们保存数据的当前状态,以便在需要时进行恢复或分析。备份表可以通过创建一个新表并复制原表的所有数据到新表中来实现。 以下是具体的SQL语句: CREATE TABLE backup_table A…...
【数据结构】第八节:链式二叉树
个人主页: NiKo 数据结构专栏: 数据结构与算法 源码获取:Gitee——数据结构 一、二叉树的链式结构 typedef int BTDataType; typedef struct BinaryTreeNode {BTDataType data;struct BinaryTreeNode* left; // 左子树根节点struct BinaryT…...
Fair Graph RepresentationLearning via Diverse Mixture-of-Experts
发表于:WWW23 推荐指数: #paper/⭐⭐ 问题背景: 背景 现实世界的数据很多样,阻止GNN学习公平的表示。当去偏见化后,他们面临着可学知识不足且属性有限的重大问题 解决方法: 应对公平训练导致可学习知识…...
电机驱动开发之驱动板
目录 1.主要器件选型2.原理图设计3.PCB绘制电源调理驱动电路电流反馈位置反馈 4.PCB绘制5.打板验证6.总结 1.主要器件选型 器件参数封装理由LDOLM317DCYR (24V-12V 12V-5V)SOT-223小电流应用 LDO比DCDC噪声小响应快更为稳定预驱FD6288TTssop-20常见无刷…...
STM32F1 HAL库笔记2_HAL 系统驱动程序
1、HAL 固件驱动程序 API 1.1、如何使用此驱动程序 通用 HAL 驱动程序包含一组通用的 API,PPP 外设驱动程序可以使用这些 API 来开始使用 HAL。HAL 包含两个 API 类别: • 常见的 HAL API • 服务 HAL API 1.2、初始化和去初始化函数 本节提供的功能&a…...
el-table实现当内容过多时,el-table显示滚动条,页面不显示滚动条
估计有不少小伙伴在开发公司的ERP使用el-table都会遇到这么一个问题,就是产品经理提出,页面不出现滚动条,因为不美观。但是当el-table内容过多,超过页面的宽度时候,页面就会有滚动条。那应该如何解决呢?能不能让滚动条…...
Java面试篇基础部分-Java中的异常以及异常处理
导语 在实际的开发过程中,往往会遇到各种各样的编程异常,如何处理这些异常,直接会影响到整个程序和系统的稳定性,如果不能在合适的地方抛出合适的异常或者是对异常进行捕获。那么就会影响到整个程序的运行。所以如何处理异常,是作为每个开发者来说必不可少的开发技能。…...
win11 MySQL的坑
最近升级了系统,导致以前的安装的两个版本MySQL服务无法启动,只能在mysql的bin目录,执行mysqld --console才能启动,mysqld都无法启动, 所幸进行了数据库初始化,这次在MySQL的bin目录执行 mysqld或者mysqld …...
stm32单片机个人学习笔记1(简单介绍)
前言 本篇文章属于stm32单片机(以下简称单片机)的学习笔记,来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记,只能做参考,细节方面建议观看视频,肯定受益匪浅。 STM32入门教程-2023版 细…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...
CTF show 数学不及格
拿到题目先查一下壳,看一下信息 发现是一个ELF文件,64位的 用IDA Pro 64 打开这个文件 然后点击F5进行伪代码转换 可以看到有五个if判断,第一个argc ! 5这个判断并没有起太大作用,主要是下面四个if判断 根据题目…...
