好的,我们来详细讲解 Redis 的数据结构及其应用场景。Redis 的强大之处不仅仅在于它支持简单的键值对,更在于它提供了丰富的数据结构,每种结构都针对特定类型的应用场景进行了优化。

核心数据结构与应用场景

Redis 主要支持以下五种核心数据结构:String(字符串)Hash(哈希)List(列表)Set(集合)Sorted Set(有序集合)。此外,还有 Bitmaps、HyperLogLogs、Streams 等更高级的结构。


1. String(字符串)

这是最简单也是最基础的数据类型。一个 Key 对应一个 Value。Value 不仅是字符串,也可以是数字(整数或浮点数),并且可以对数字进行自增/自减操作。

  • 内部实现:基于简单动态字符串(SDS)实现,可以修改的字符串,预分配内存,减少内存频繁分配。
  • 常用命令SET, GET, MSET, MGET, INCR, DECR, INCRBY

应用场景

  • 缓存:最经典的场景。将数据库查询结果、热点数据、会话信息(Session)等序列化后存入 String,加快访问速度。
    • SET user:1001 "{name: 'Alice', email: 'alice@example.com'}"
  • 计数器:利用 INCRDECR 命令实现点赞数、浏览数、库存计数等。这些操作是原子性的,非常适合高并发场景。
    • INCR article:1001:views
  • 分布式锁:利用 SET key value NX EX seconds 命令(当 key 不存在时设置,并设置过期时间)可以实现简单的分布式锁。
  • Session 共享:在集群服务中,将用户的登录会话信息集中存储在 Redis 中,实现多台服务器共享 Session。

2. Hash(哈希)

类似于 Java 中的 Map<String, Object>,是一组键值对的集合。非常适合存储对象。

  • 内部实现:底层有两种编码方式:ziplist(压缩列表,在元素少、体积小时使用)和 hashtable(哈希表)。
  • 常用命令HSET, HGET, HMSET, HMGET, HGETALL, HINCRBY

应用场景

  • 存储对象:存储用户信息、商品信息等需要多个字段的对象。相比将整个对象序列化成 String,Hash 可以单独获取、修改某个字段,更节省网络带宽和存储空间。
    • HSET user:1001 name "Alice" age "30" email "alice@example.com"
    • HGET user:1001 name -> “Alice”
  • 购物车:以用户ID为 Key,商品ID为 Field,商品数量为 Value。
    • HSET cart:1001 product:5001 3 (用户1001的商品5001数量为3)
    • HINCRBY cart:1001 product:5001 1 (增加1件)

3. List(列表)

一个简单的字符串列表,按插入顺序排序。你可以从列表的头部(左边)或尾部(右边)添加元素。

  • 内部实现:底层是 quicklist(快速列表),它是多个 ziplist 通过双向指针组成的链表,兼顾了空间效率和插入性能。
  • 常用命令LPUSH, RPUSH, LPOP, RPOP, LRANGE, BLPOP (阻塞操作)

应用场景

  • 消息队列:利用 LPUSH + BRPOP 可以实现一个简单的 FIFO(先进先出)队列。生产者从左边推入消息,消费者用阻塞方式从右边取出消息。
  • 最新列表:例如最新文章、最新评论、朋友圈时间线。利用 LPUSH 加入新元素,再用 LRANGE 0 9 获取最新的10条。
    • LPUSH news:latest "News ID 10086"
  • 记录用户操作历史:例如用户的最近搜索、最近浏览记录。

4. Set(集合)

Redis 的 Set 是 String 类型的无序集合,集合内的元素是唯一的,不允许重复。

  • 内部实现:底层是 intset(整数集合,当元素都是整数且数量少时)或 hashtable(哈希表,value 为 null)。
  • 常用命令SADD, SMEMBERS, SISMEMBER, SINTER (交集), SUNION (并集), SDIFF (差集)

应用场景

  • 标签(Tag):给用户、文章等对象打标签。可以很方便地求交集、并集等。
    • SADD article:1001:tags "tech" "redis" "database"
    • SADD user:1002:tags "tech" "python"
    • SINTER article:1001:tags user:1002:tags -> 获取共同标签 “tech”
  • 共同关注/好友:利用 SINTER 可以轻松求出两个用户的共同好友。
  • 抽奖/秒杀:利用 SADD 将所有参与用户ID加入,可以自动保证唯一性,不会重复添加。SMEMBERS 可以列出所有参与者。
  • 黑白名单:将需要过滤的 ID 放入 Set,用 SISMEMBER 快速判断某个 ID 是否在名单内。

5. Sorted Set(有序集合 / ZSet)

与 Set 类似,也是 String 类型元素的集合,且不允许重复。但每个元素都会关联一个 double 类型的分数(score)。Redis 正是通过分数来为集合中的成员进行从小到大的排序。成员是唯一的,但分数可以重复。

  • 内部实现:底层是 ziplist(压缩列表)或 skiplist(跳跃表) + dict(字典)的组合,跳跃表保证范围查询的效率,字典保证按成员查询的效率。
  • 常用命令ZADD, ZRANGE (按分数正序), ZREVRANGE (按分数倒序), ZRANK, ZREVRANK, ZRANGEBYSCORE

应用场景

  • 排行榜:这是最经典的应用场景。将分数设为点击量、销量、热度等,自动进行排序。
    • ZADD leaderboard 100 "player1" 200 "player2"
    • ZREVRANGE leaderboard 0 9 WITHSCORES -> 获取排行榜前十名
  • 带权重的队列:分数可以作为优先级,实现优先级队列。
  • 范围查找:例如处理成绩表,快速查找分数在 [90, 100] 之间的学生。
    • ZRANGEBYSCORE grades 90 100
  • 延时任务:将任务的执行时间作为 score,用一个进程轮询获取到期的任务(ZRANGEBYSCORE key 0 <当前时间戳>)。

其他高级数据结构

  • Bitmaps(位图): 本质上是 String,但可以对字符串的位进行操作。适用于大量布尔值的存储,如用户签到记录(每天1bit)、活跃用户统计,极其节省空间。
  • HyperLogLogs: 用于做基数统计(估算一个集合中不重复元素的个数),标准误差仅0.81%。优点是非常节省空间。适用于统计网站的 UV(独立访客)、搜索关键词的不重复数量等,PFADD, PFCOUNT, PFMERGE
  • Geospatial(地理空间): 可以存储地理坐标,并计算距离、查找范围内成员等。适用于附近的人、地理位置推荐。
  • Streams(流): Redis 5.0 引入,专门为消息队列设计,支持多消费者组、消息持久化、确认机制,功能比 List 更强大,是更专业的消息队列解决方案。

总结与选择建议

数据结构特性典型应用场景
String简单键值,支持数字和位操作缓存、计数器、分布式锁
Hash适合存储对象,可部分更新用户信息、购物车、配置项
List有序、可重复,支持阻塞操作消息队列、最新列表、历史记录
Set无序、唯一,支持集合运算标签、共同好友、抽奖、黑白名单
Sorted Set唯一、有序(按分数排序)排行榜、优先级队列、范围查找
Bitmaps极省空间的布尔状态存储用户签到、活跃用户统计
HyperLogLog极省空间的基数估算网站UV统计
Streams持久化的消息流复杂消息队列

选择时考虑以下几点

  1. 数据形态:是需要一个对象(Hash)、一个列表(List)、一个不重复集合(Set)还是一个带排序的集合(ZSet)?
  2. 操作类型:是需要频繁读取部分字段(Hash),还是需要排序(ZSet),或是需要集合运算(Set)?
  3. 性能与效率:String 存储序列化对象虽然简单,但修改一个字段就需要整个读写,不如 Hash 高效。在元素较少时,Redis 会使用更紧凑的编码(如 ziplist)来节省内存。

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

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

相关文章

【后端数据库】MySQL 索引生效/失效规则 + 核心原理

SQL 优化的核心 —— 什么时候能“走索引”&#xff0c;什么时候会“失效”。整理一个索引生效/失效规则 核心原理的全景图&#xff0c;帮助彻底理解。&#x1f511; MySQL 索引使用的核心原理MySQL 使用 BTree 索引&#xff08;最常见&#xff09;&#xff0c;特点是&#xf…

基于 YOLOv11n 的无人机航拍小目标检测算法学习

基于 YOLOv11n 的无人机航拍小目标检测算法问题&#xff1a;无人机航拍图像中小目标检测面临尺度变化大导致的检测精度较低和推理速度较慢等 解决&#xff1a;在 C3k2 模块中引入可变形卷积&#xff08;DCN&#xff09;&#xff0c;增强模型在复杂背景下对 多尺度目标的特征提取…

第06章:map():数据变形金刚,想变什么变什么

文章目录map()基础&#xff1a;一对一的数据转换map()的工作原理方法引用让代码更简洁对象转换&#xff1a;实际业务应用用户信息转换示例特殊类型的map()&#xff1a;mapToInt、mapToLong、mapToDouble链式map()&#xff1a;多重转换map()与filter()组合&#xff1a;数据处理管…

197-200CSS3响应式布局,BFC

CSS3响应式布局-媒体查询举例<title>01.媒体查询_媒体类型</title><style>h1 {width: 600px;height: 400px;background-image: linear-gradient(60deg,red,yellow,green);font-size: 40px;color: white;text-shadow: 0 0 20px black;text-align: center;line…

[Android] UI进阶笔记:从 Toolbar 到可折叠标题栏的完整实战

学习 Android 开发的过程中&#xff0c;UI 控件往往是最直观也最容易踩坑的部分。本文整理了我在学习《第一行代码》后的实践笔记&#xff0c;涵盖 Toolbar、自定义标题栏、菜单、Snackbar、CoordinatorLayout、可折叠标题栏、SwipeRefreshLayout 下拉刷新、FloatingActionButt…

计算机网络---http(超文本传输协议)

1. HTTP的定义与核心属性 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是万维网&#xff08;WWW&#xff09;的核心通信协议&#xff0c;定义了客户端&#xff08;如浏览器、APP&#xff09;与服务器之间如何传输“超文本”&#xff08…

【qml-7】qml与c++交互(自动补全提示)

背景&#xff1a; 【qml-5】qml与c交互&#xff08;类型单例&#xff09; 之前记录过qml与c交互的方式&#xff0c;目前为止我使用的是“类型单例”方式。这些名字是我自己起的&#xff0c;只为说明问题&#xff0c;严谨的还是以手册为准。 “类型单例”方式时提到过自动补全…

网页提示UI操作-适应提示,警告,信息——仙盟创梦IDE

代码<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>原生动态提示框</title><style>…

第八篇 永磁同步电机控制-MTPA、MTPV

永磁同步电机控制系列课程&#xff1a; 第一篇 永磁同步电机控制-认识电机 第二篇 永磁同步电机控制-电机的分类 第三篇 永磁同步电机控制-硬件基础知识 第四篇 永磁同步电机控制-软件基础知识 第五篇 永磁同步电机控制-数学模型 第六篇 永磁同步电机控制-控制方法 第七…

JAVA:Spring Boot 集成 Temporal 实现订单处理系统

🛠 1、简述 在现代分布式系统中,订单处理涉及多步骤工作流(如库存扣减、支付确认、物流派单等)。为了确保这些步骤的 可靠性、可观测性 和 容错性,我们可以使用 Temporal 实现工作流管理。 本文将介绍如何在 Spring Boot 中集成 Temporal,并通过一个订单处理的实际案例…

服务器硬件电路设计之 SPI 问答(六):如何提升服务器硬件电路中的性能?如何强化稳定性?

在服务器 SPI 硬件设计中&#xff0c;通信性能&#xff08;如传输速率、数据吞吐量&#xff09;与稳定性&#xff08;抗干扰、误码率&#xff09;直接决定外设响应效率&#xff0c;需从硬件设计、参数配置、干扰抑制三方面系统优化。一、性能优化核心策略&#xff1a;根据 SPI …

Web 聊天室消息加解密方案详解

目录 ​编辑 一、Web 聊天室消息加解密需求与技术约束 1.1 核心安全需求 1.2 技术约束 二、主流消息加解密方案详解 2.1 方案 1&#xff1a;对称加密&#xff08;AES-256-GCM&#xff09; 2.1.1 方案概述 2.1.2 核心原理 2.1.3 实现步骤&#xff08;分场景&#xff09…

组合导航 | RTK、IMU与激光雷达组合导航算法:原理、实现与验证

RTK、IMU与激光雷达组合导航算法:原理、实现与验证 文章目录 RTK、IMU与激光雷达组合导航算法:原理、实现与验证 一、组合导航系统原理与数学模型 1.1 传感器特性与互补性分析 1.2 系统状态方程构建 1.3 多源观测方程设计 (1)RTK观测模型 (2)激光雷达观测模型 (3)多源观…

使用Cadence工具完成数模混合设计流程简介

众所周知&#xff0c;Cadence的Virtuoso是模拟设计领域的核心工具&#xff0c;市占率达到75%&#xff0c;随着近些年来Cadence在数字版图设计&#xff08;APR&#xff09;领域的崛起&#xff0c;invs&#xff0c;PVS等一众工具也都成了很多公司的首选后端流程工具。依照强强联合…

FunASR人工智能语音转写服务本地部署测试

前提条件&#xff1a;本机&#xff1a;windows11 &#xff0c;已安装docker1.下载镜像使用命令下载docker镜像docker pull registry.cn-hangzhou.aliyuncs.com/funasr_repo/funasr:funasr-runtime-sdk-online-cpu-0.1.13下载完成后&#xff0c;建立文件夹储存之后需要下载的模型…

Python OpenCV图像处理与深度学习

Python OpenCV图像处理与深度学习 1. Python OpenCV入门&#xff1a;图像处理基础 2. Python OpenCV开发环境搭建与入门 3. Python OpenCV图像处理基础 4. Python OpenCV视频处理入门 5. Python OpenCV图像几何变换入门 6. Python OpenCV图像滤波入门 7. Python OpenCV边缘检测…

C# SIMD编程实践:工业数据处理性能优化案例

性能奇迹的开始 想象一下这样的场景&#xff1a;一台精密的工业扫描设备每次检测都会产生200万个浮点数据&#xff0c;需要我们计算出最大值、最小值、平均值和方差来判断工件是否合格。使用传统的C#循环处理&#xff0c;每次计算需要几秒钟时间&#xff0c;严重影响生产线效率…

XHR 介绍及实践

What is it? XML(XMLHttpRequest) 是浏览器提供的一种用于前端页面和后端服务器进行异步通信的编程接口。它允许在不重新加载整个页面的情况下&#xff0c;与服务器交换数据并更新部分页面内容&#xff0c;是 AJAX 技术的核心。 What is it used for? 异步请求&#xff1a;在…

【量化回测】backtracker整体架构和使用示例

backtrader整体框架 backtrader 是一个量化回测的库&#xff0c;支持多品种、多策略、多周期的回测和交易。更重要的是可以集成 torch 等神经网络分析模块。Cerebro类是 backtrader 的核心。Strategy类、Broker和Sizer类都是由Cerebro类实例化而来。 整体流程 backtrade 自带的…

【python+requests】一键切换测试环境:Windows 下环境变量设置指南

一键切换测试环境&#xff1a;Windows 下环境变量设置指南教你如何通过一个命令让测试脚本自动识别不同环境的配置文件你是否遇到过这种情况&#xff1a;同一套测试脚本&#xff0c;需要在测试环境、开发环境、预发布环境、生产环境等多种配置中切换&#xff1f;每次都要手动修…