Java面试八股之Redis有哪些数据类型?底层实现分别是什么
- 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站:
相关文章:

Java面试八股之Redis有哪些数据类型?底层实现分别是什么
Redis有哪些数据类型?底层实现分别是什么 Redis数据类型概述 Redis作为一款键值存储系统,提供了丰富多样的数据类型以满足不同场景的需求。以下是Redis支持的主要数据类型及其基本用途: String(字符串) 存储单个键…...

分布式应用系统设计:即时消息系统
即时消息(IM)系统,涉及:站内消息系统 组件如下; 客户端: WEB页面,IM桌面客户端。通过WebSocket 跟ChatService后端服务连接 Chat Service: 提供WebSocket接口,并保持跟“客户端”状态的维护。…...
【YashanDB知识库】调整NUMBER精度,再执行统计信息收集高级包偶现数据库异常退出
【问题分类】功能使用 【关键字】NUMBER类型精度修改,统计信息收集 【问题描述】存量的表将NUMBER类型的字段精度从小精度调整为大精度时,数据库收集这张业务表的统计信息时,会导致数据库异常退出。 【问题原因分析】YashanDB NUMBER字段精…...

ComfyUI+MuseV+MuseTalk图片数字人
电脑配置 GPU12G,如果自己电脑配置不够,选择云gpu,我就是用的这个,自己电脑太老配置跟不上 环境: Python 3.11.8 torch 2.2.1 cuda_12.1 资源提供: 链接:https://pan.baidu.com/s/1_idZbF…...

【Python】从基础到进阶(三):深入了解Python中的运算符与表达式
🔥 个人主页:空白诗 文章目录 一、引言二、运算符1. 算术运算符2. 比较运算符3. 逻辑运算符4. 位运算符5. 赋值运算符6. 其他运算符 三、表达式1. 表达式的定义2. 运算符的优先级3. 使用括号提升可读性4. 组合运算符与复合表达式 四、案例:计…...
C#的DllImport使用方法
1. 托管代码与非托管代码 托管代码:我们编写的C#代码(也包括.net平台上的其他语言,如VB,J#等),首先经过编译器把代码编译成中间语言(IL),当方法被调用时,公共…...

人工智能算法工程师(中级)课程11-PyTorch神经网络之循环神经网络RNN与代码详解
大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(中级)课程11-PyTorch神经网络之循环神经网络RNN与代码详解。循环神经网络(Recurrent Neural Network,RNN)是一种处理序列数据的神经网络。本文将详细介绍RNN网…...
服务端生成RSA密钥实例
RSA非对称加密算法的一种,这里分享一下服务端生成公钥和私钥的实例,并打印出来。 一:实例代码 package mainimport ("bufio""crypto/rand""crypto/rsa""crypto/x509""encoding/pem"&quo…...

Maven Nexus3 私服搭建、配置、项目发布指南
maven nexus私服搭建 访问nexus3官方镜像库,选择需要的版本下载:Docker Nexus docker pull sonatype/nexus3:3.49.0 创建数据目录并赋权 sudo mkdir /nexus-data && sudo chown -R 200 /nexus-data 运行(数据目录选择硬盘大的卷进行挂载) …...
东方博宜1627 - 暑期的旅游计划(2)
问题描述 期末考试结束了,小华语文、数学、英语三门功课分别考了 x、y、z 分,小华的家长说,如果小华三门功课中有一门考到 90 分或者 90 分以上,那么就去北京旅游,如果都没考到,那么就去南京玩。 请从键盘…...

FastAPI 学习之路(三十五)项目结构优化
之前我们创建的文件都是在一个目录中,但是在我们的实际开发中,肯定不能这样设计,那么我们去创建一个目录,叫models,大致如下。 主要目录是: __init__.py 是一个空文件,说明models是一个package…...

linux源码安装mysql8.0的小白教程
1.下载8.x版本的mysql MySQL :: Download MySQL Community Server (Archived Versions) 2.安装linux 我安装的是Rocky Linux8.6 3.设置ip地址,方便远程连接 使用nmcli或者nmtui设置或修改ip地址 4.使用远程连接工具MobaXterm操作: (1)将mysql8版本的压缩包上传到mybaxterm…...

如何评估独立站的外链质量?
要评估独立站的外链质量时,首先要看的不是别的,而是内容,跟你网站相关的文章内容才是最重要的,其他的一切其实都不重要。什么网站的DA,评级,网站的主要内容跟你的文章内容是否相关其实都不重要,…...
AI在编程领域的作用
AI(人工智能)在软件开发和许多其他领域都发挥着重要作用,但这并不意味着它在取代开发者。相反,AI更多地是在帮助开发者提高工作效率,解决复杂问题,并创造新的可能性。 探讨AI工具对开发者日常工作的影响 …...

医疗器械网络安全 | 漏洞扫描、渗透测试没有发现问题,是否说明我的设备是安全的?
尽管漏洞扫描、模糊测试和渗透测试在评估系统安全性方面是非常重要和有效的工具,但即使这些测试没有发现任何问题,也不能完全保证您的医疗器械是绝对安全的。这是因为安全性的评估是一个多维度、复杂且持续的过程,涉及多个方面和因素。以下是…...
【GameFramework扩展应用】6-4、GameFramework框架增加AB包加解密功能
推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群:398291828大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录: https://blog.csdn.net/q764424567/article/details/1…...

通用图形处理器设计GPGPU基础与架构(二)
一、前言 本系列旨在介绍通用图形处理器设计GPGPU的基础与架构,因此在介绍GPGPU具体架构之前,需要了解GPGPU的编程模型,了解软件层面是怎么做到并行的,硬件层面又要怎么配合软件,乃至定出合适的架构来实现软硬件协同。…...
在一个使用了 Sass 的 React Webpack 项目中安装和使用 Tailwind CSS
要在一个使用了 Sass 的 React Webpack 项目中安装和使用 Tailwind CSS,可以按照以下步骤操作: 1. 安装 Tailwind CSS 及其依赖 首先,确保你的项目根目录下有 package.json 文件,然后运行以下命令来安装 Tailwind CSS 及其所需的…...

HDMI简介
本篇主要介绍HDMI常见接口以及TMDS传输技术。 文章目录 一、HDMI简介二、TMDS传输技术1.编码(encoder)2.并转串(serializer)——OSERDESE2原语3.单端转差分——OBUFDS源语 三、常见的几种信号传输方式 一、HDMI简介 HDMI(High-Definition Multimedia I…...

原作者带队,LSTM卷土重来之Vision-LSTM出世
与 DeiT 等使用 ViT 和 Vision-Mamba (Vim) 方法的模型相比,ViL 的性能更胜一筹。 AI 领域的研究者应该还记得,在 Transformer 诞生后的三年,谷歌将这一自然语言处理届的重要研究扩展到了视觉领域,也就是 Vision Transformer。后来…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...

医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor
1 医疗树模型与可解释人工智能基础 医疗领域的人工智能应用正迅速从理论研究转向临床实践,在这一过程中,模型可解释性已成为确保AI系统被医疗专业人员接受和信任的关键因素。基于树模型的集成算法(如RandomForest、XGBoost、LightGBM)因其卓越的预测性能和相对良好的解释性…...

MLP实战二:MLP 实现图像数字多分类
任务 实战(二):MLP 实现图像多分类 基于 mnist 数据集,建立 mlp 模型,实现 0-9 数字的十分类 task: 1、实现 mnist 数据载入,可视化图形数字; 2、完成数据预处理:图像数据维度转换与…...