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站:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/44796.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows系统上python3安装open3d第三方库

打开命令提示符,输入, pip install open3d -i https://pypi.tuna.tsinghua.edu.cn/simple成功页面,

CSDN回顾与前行:我的创作纪念日——2048天的技术成长与感悟

CSDN回顾与前行:我的创作纪念日——2048天的技术成长与感悟 💖The Begin💖点点关注,收藏不迷路💖 前言 时光荏苒,岁月如梭。转眼间,从我在CSDN上写下第一篇技术博客《2-6 带头结点的链式表操作…

MVC 控制器 中Action 不能同名,参数不一样,路由器寻找不到对应的,要加特性

//1 方法不可能完全相同,参数不同//2 那还需要特性吗?需要的,因为MVC选择方法时,不是按参数选择:http请求发送很多数据,其实没法识别,//因为mvc找方法是通过反射来的,GetMethods(nam…

vue 自定义(hook)--(模块化)

文章目录 定义示例代码 定义 什么是hook?—— 本质是一个函数,把setup函数中使用的Composition API进行了封装,类似于vue2.x中的mixin。 自定义hook的优势:复用代码, 让setup中的逻辑更清楚易懂。 示例代码 useSum.ts中内容如下…

mavlink协议解析

1. mavlink数据包格式 字节索引C 版本内容值说明0uint8_t magic数据包启动标记0xFE特定于协议的文本启动 (stx) 标记, 用于指示新数据包的开始。 任何不识别协议版本的系统都将跳过数据包。1uint8_t len载荷长度0 - 255指示以下 payload 部分的长度 (为特定消息固定)。2uint8_t…

java并发编程概述

java并发编程概述 一. 进程和线程的概念 进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配的基本单位。进程是程序运行的实例,每当操作系统在运行一个程序时,会为其创建一个进程。每个进程都拥有自己的一整套变量。…

python:openpyxl DataBarRule 制作数据条

技术文档: 条件格式 — openpyxl 3.0.7 文档 openpyxl.formatting.rule module — openpyxl 3.1.3 documentation 但是,想让单元格数值按比例显示(右边正确)只能按data_bar_rule_2编写: from openpyxl import Workb…

技校专业群的生成机制研究

一、引言 随着我国经济的快速发展和产业结构的不断优化,技术型人才的需求日益旺盛。技工学校(简称技校)作为培养技术型人才的摇篮,其专业群的构建与发展显得尤为重要。专业群作为技校战略发展的核心,不仅能够优化教学…

大模型之战进入新赛季,开始卷应用

最近一段时间,国产大模型Kimi彻底火了,而这波爆火,某种意义上也展示了一个问题,即大模型的落地场景可能比技术比拼,更重要。 国产大模型Kimi突然爆火,与Kimi相关的产业链甚至被冠上“Kimi概念股”之名&…

【初阶数据结构】树与二叉树:从零开始的奇幻之旅

初阶数据结构相关知识点可以通过点击以下链接进行学习一起加油!时间与空间复杂度的深度剖析深入解析顺序表:探索底层逻辑深入解析单链表:探索底层逻辑深入解析带头双向循环链表:探索底层逻辑深入解析栈:探索底层逻辑深入解析队列:探索底层逻辑深入解析循环队列:探索…

51单片机:如何使用串口波特率计算器及其详解

目录 一、如何使用串口波特率计算器 1.以此为例: 2.生成代码如下: 3.需要手动配置中断系统 1.原理图 2.配置代码 二、如何理解软件生成的波特率 1.以该代码为例子进行分析 2.串口模式图 三、如何计算波特率 参考STC89C52手册P235 四、如何调用串口中断函数 一、如何…

HBase 在统一内容平台业务的优化实践

作者:来自 vivo 互联网服务器团队-Leng Jianyu、Huang Haitao HBase是一款开源高可靠性、扩展性、高性能和灵活性的分布式非关系型数据库,本文围绕数据库选型以及使用HBase的痛点展开,从四个方面对HBase的使用进行优化,取得了一些…

基于jeecgboot-vue3的Flowable流程-集成仿钉钉流程(五)仿钉钉流程的json数据保存与显示

因为这个项目license问题无法开源,更多技术支持与服务请加入我的知识星球。 1、需要做一个界面保存与显示仿钉钉的流程,先建一个表,用online建 2、通过上面生成代码,放入到相应的前后端工程里 3、修改前端仿钉钉流程的设计功能&a…

spark基于Spark的对招聘信息的分析与设计-计算机毕业设计源码50716

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2 系统分析 2.1 可行性分析 2.2.1 数据新增流程 2.2.2 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结 3 系统总体设计 3.1 系统架构设…

Vue2/Vue3实现全局/局部添加防篡改水印的效果。删除元素无效!更改元素属性无效!支持图片、元素、视频等等。

水印目的 版权保护:水印可以在图片、文档或视频中嵌入作者、品牌或版权所有者的信息,以防止未经授权的复制、传播或使用。当其他人使用带有水印的内容时,可以追溯到原始作者或版权所有者,从而加强版权保护。 身份识别:水印可以用作作者或品牌的标识符,使观众能够轻松识…

springboot对ZonedDateTime返回结果json是string-源码分析

springboot对ZonedDateTime返回结果json是string-源码分析 application/json格式默认使用ObjectMapper实例进行序列化ObjectMapper自动注入分析springboot关于jackson配置 java.time.ZonedDateTime application/json格式默认使用ObjectMapper实例进行序列化 controller返回后&…

人形机器人的理想与现实

李开复曾提到过一个AI界流传的“骗子又来了曲线”。 人会不断给机器进行“是否具有人类智能”的鉴定,而这个过程,总是从被人工智能在某些领域的惊艳表现震撼,到逐渐认识到当时的人工智能还有各种局限,以至于产生巨大心理落差。 近…

html js 3d z轴移动 实现星空

用chatgpt还有kimi 让实现动画效果的星空,都太垃圾了 不是y轴移动,就是x轴移动, 我要z轴移动,他们就是搞不出来, ai写代码还有很长的路。 <!DOCTYPE html> <meta charset="utf-8" /> <head> <title>ai相关博客</title> </h…

【操作系统】手把手带你搭建DNS服务器!

DNS服务器 DNS服务器指域名系统或者域名服务。域名系统为Internet上的主机分配域名地址和IP地址&#xff0c;用户使用域名地址&#xff0c;该系统就会自动把域名地址转为IP地址。域名服务是运行域名系统的Internet工具。执行域名服务的服务器称之为DNS服务器&#xff0c;通过DN…

51单片机嵌入式开发:8、 STC89C52RC 操作LCD1602原理

STC89C52RC 操作LCD1602原理 1 LCD1602概述1.1 LCD1602介绍1.2 LCD1602引脚说明1.3 LCD1602指令介绍 2 LCD1602外围电路2.1 LCD1602接线方法2.2 LCD1602电路原理 3 LCD1602软件操作3.1 LCD1602显示3.2 LCD1602 protues仿真 4 总结 1 LCD1602概述 1.1 LCD1602介绍 LCD1602是一种…