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

Java面试八股之Redis有哪些数据类型?底层实现分别是什么

  1. Redis有哪些数据类型?底层实现分别是什么

Redis数据类型概述

Redis作为一款键值存储系统,提供了丰富多样的数据类型以满足不同场景的需求。以下是Redis支持的主要数据类型及其基本用途:

String(字符串)

存储单个键值对,支持增删改查、自增、截取等操作。

应用场景:计数器、缓存、分布式锁等。

底层实现:Redis字符串是动态字符串(SDS),其内部结构包含长度、已用长度和字节数组。

编码方式:Redis对字符串值的存储采用多种编码,如:

REDIS_ENCODING_INT:当值为整数且在一定范围内时,直接存储整数值,节省空间。

REDIS_ENCODING_EMBSTR:对于短字符串,使用embstr编码,将字符串与结构体紧凑存储在同一块连续内存中,减少内存分配次数。

REDIS_ENCODING_RAW:长字符串或非整数值使用raw编码,即传统的简单动态字符串。

List(列表)

有序的字符串列表,支持两端插入、弹出、范围查询等操作。

应用场景:消息队列、最新N个元素列表等。

底层实现:列表有两种编码方式,分别是:

ziplist(压缩列表):对于元素数量少且元素长度较短的列表,使用连续内存存储,节省空间。

linkedlist(双端链表):当列表元素数量或长度超过一定阈值时,转为双端链表实现,保证操作的高效性。

Set(集合)

无序的字符串集合,不允许重复成员,支持添加、删除、成员关系判断等操作。

应用场景:标签系统、唯一性检查、交并差集运算等。

底层实现:集合也有两种编码:

intset(整数集合):当集合中所有元素都是整数且范围适当时,使用整数集合存储,空间效率高。

hashtable(哈希表):当集合包含非整数元素或元素数量超过一定阈值时,转化为哈希表实现,提供快速的增删查操作。

Sorted Set(有序集合)

类似集合,但每个成员附带一个分数,依据分数进行排序。

支持添加、删除、按分数范围查询、排名、聚合操作等。

应用场景:排行榜、带权重的标签系统、Top N查询等。

底层实现:有序集合基于ziplist或skiplist(跳跃表)编码:

ziplist:小型有序集合,使用压缩列表存储,元素按分数排序。

skiplist:大型有序集合,使用跳跃表实现,提供O(log N)的插入、删除、查找等操作,同时保留了集合成员的顺序。

Hash(哈希)

键值对的集合,每个键值对由field-value组成。

支持增删改查单个field,批量操作整个哈希。

应用场景:对象属性存储、购物车等。

底层实现:哈希同样存在两种编码:

ziplist:对于小规模哈希(字段数量和值长度较小),使用压缩列表存储,紧凑且高效。

hashtable:当哈希的字段数量或值长度超过阈值时,转化为哈希表实现,提供快速的字段查找和更新。

Bitmaps(位图)

功能:Bitmaps允许以位(bit)为单位存储数据,非常适合用来表示稀疏的二进制状态,如用户签到、统计用户行为等。

应用案例:用户签到系统

假设有一个网站需要记录用户每天的签到情况。对于每个用户,我们可以使用一个唯一的用户ID作为键名,用Bitmaps来表示其连续365天的签到状态。每天签到时,使用SETBIT命令将对应日期的位设置为1。查询用户在过去一周是否有连续签到,则可通过BITCOUNT命令计算过去7天的位图中值为1的位数。

底层实现:在Redis中,位图实际上是基于字符串(String)类型实现的,每个字节(8位)对应字符串中的一个字符。通过对字符串执行位操作命令(如SETBIT, GETBIT, BITCOUNT, BITOP等),可以高效地进行位的增删查改。

HyperLogLog

功能:HyperLogLog是一种概率数据结构,用于估算集合中不重复元素(基数)的大致数量,而不需要存储所有元素。它以极小的空间开销(通常几百字节)提供接近精确的计数,适用于大规模唯一计数场景,如网站独立访客统计、唯一事件计数等。

应用案例:网站独立访客统计

在一个网站中,需要统计每天访问的独立访客数,但不想为每个访客保存完整的访问记录。可以为每天创建一个HyperLogLog键,每当有新的访客访问时,将其唯一标识符(如IP地址或用户代理字符串的哈希值)添加到当天的HyperLogLog中。使用PFADD命令添加元素,PFCOUNT命令获取估计的独立访客数。

底层实现:HyperLogLog使用特定的哈希函数和概率算法估计基数,不直接存储元素,而是维护一个内部状态来近似计数。

Geospatial Indexes(地理位置索引)

功能:Redis提供了对地理位置数据的支持,可以存储经纬度坐标,并进行距离查询、范围查询(如“附近的人”功能)、地理围栏(如“在某区域内的人”)等操作。

应用案例:“附近的人”功能

在社交应用中,用户可以查看当前位置附近的其他在线用户。为每个用户存储其经纬度坐标,使用GEOADD命令将用户位置添加到地理位置索引中。当查询时,使用GEORADIUS或GEORADIUSBYMEMBER命令查找指定半径内的其他用户。

底层实现:使用有序集合(Sorted Set)存储地理位置数据,成员为地理位置的标识符,分值为经过特定公式转换后的经纬度坐标,以此实现空间索引。

Streams(流)

功能:Redis Streams是一种用于存储和处理时间序列数据的数据结构,特别适用于构建消息队列、活动日志、审计跟踪等应用场景。它支持多消费者消费同一数据流的不同部分,并具备消息持久化、消息ID生成、消息分片(Consumer Group)等功能。

应用案例:订单事件日志

在电商系统中,使用Redis Stream记录订单相关的事件,如订单创建、支付成功、发货等。每个事件作为一个消息,包含事件类型、发生时间、订单ID等信息。消费者(如后台任务、实时分析服务)通过XREAD或XREADGROUP命令订阅并处理这些事件。

底层实现:Stream数据结构在内部以键值对的形式存储,键为Stream的名字,值为一个特殊的字典结构,包含多个消息列表(每个消息列表代表一个分片)以及相关元数据。

如果大家需要视频版本的讲解,欢迎关注我的B站:

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基于ssm的图书管理系统的设计与实现
  • jenkins打包java项目报错Error: Unable to access jarfile tlm-admin.jar
  • 部署大语言模型并对话
  • Docker 安装字体文件
  • 暑假第一次作业
  • wps 将列的内容转换为一个单元格内容,并以逗号分隔
  • python编程实例 计算字符串中空格、英文、数字、其它字符的数量 两种方式实现
  • 检索 Postgres 不同版本功能差异的神器
  • Docker Dockerfile:构建与优化
  • uniapp实现光标闪烁(配合自己的键盘)
  • 数据结构——考研笔记(一)绪论
  • 百日筑基第十八天-一头扎进消息队列1
  • Nature Communications|柔性高密度、高灵敏应变传感器阵列(柔性应变传感/界面调控/电子皮肤/柔性电子)
  • Backend - C# 基础知识
  • PyTorch 2-深度学习-模块
  • AngularJS指令开发(1)——参数详解
  • ES6语法详解(一)
  • Javascript弹出层-初探
  • leetcode386. Lexicographical Numbers
  • Mocha测试初探
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • vue-router 实现分析
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 类orAPI - 收藏集 - 掘金
  • 力扣(LeetCode)22
  • 算法-图和图算法
  • 线性表及其算法(java实现)
  • 【云吞铺子】性能抖动剖析(二)
  • 阿里云服务器如何修改远程端口?
  • 数据可视化之下发图实践
  • ​卜东波研究员:高观点下的少儿计算思维
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • # 安徽锐锋科技IDMS系统简介
  • #QT 笔记一
  • (1)Nginx简介和安装教程
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (k8s)Kubernetes本地存储接入
  • (python)数据结构---字典
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (算法)求1到1亿间的质数或素数
  • (小白学Java)Java简介和基本配置
  • (新)网络工程师考点串讲与真题详解
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • ./configure、make、make install 命令
  • .NET 8 跨平台高性能边缘采集网关
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .Net Winform开发笔记(一)
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .NET学习全景图