Redis都有哪些数据结构,使用场景与原理解析

✅ String:字符串(最常用、最简单的类型)

📌 应用场景:

  1. 计数器

    (如:页面浏览量、点赞数、转发数等)

  2. 缓存单个值

    (如:token、验证码、用户昵称)

  3. 分布式锁

🔧 使用方式:

SET user:1001 "张三"
SET token:abcd1234 "user1001"
INCR page:views
SET lock:order123 1 NX EX 30

🧠 原理:

  • 底层是 SDS(Simple Dynamic String)简单动态字符串

  • 是 Redis 自定义的字符串类型,支持动态扩容、安全、长度记录

✅ 优点:

  • 使用简单,几乎所有业务都可以上手

  • 支持数值加减操作,适合做计数器

  • 原子性强,适合做分布式锁

⚠️ 缺点与建议:

  • 分布式锁建议用 Redisson、RedLock 来避免失效风险

  • 不适合存储结构化数据(比如对象或数组)


✅ List:列表(有序,可重复)

📌 应用场景:

  1. 消息队列

    (简单队列)

  2. 任务列表 / 待办事项
  3. 文章评论列表(按时间排序)
  4. 最近浏览记录

🔧 使用方式:

RPUSH task:pending task1
LPUSH comments:article:123 "这是一条评论"
LPOP task:pending
LRANGE task:pending 0 9

🧠 原理:

  • 底层使用 QuickList(压缩列表+双向链表的混合体)

  • 插入和删除效率高,尤其适合两端操作

✅ 优点:

  • 插入/读取非常快,适合队列结构

  • 支持阻塞读写(BLPOP)

⚠️ 缺点与建议:

  • 不支持多消费者分发消息

    ,同一条消息无法被多个消费者消费

  • 更复杂的消息队列场景建议使用 Redis Stream


✅ Hash:哈希(类似 Java Map)

📌 应用场景:

  1. 购物车

    (key = 用户,field = 商品ID,value = 数量)

  2. 缓存对象结构数据(用户信息、商品信息)
  3. 表单临时存储、会话信息等结构化数据

🔧 使用方式:

HSET cart:user:1001 10001 2
HSET user:1001 name "张三" age 18
HGETALL cart:user:1001

🧠 原理:

  • 少字段时用 ListPack(压缩结构) 节省内存

  • 字段多或数据复杂时切换为 HashTable

✅ 优点:

  • 适合结构化数据:一个 Key 下多个字段

  • 节省内存,访问效率高

⚠️ 建议:

  • 可结合 JSON 序列化在字段 value 存更多属性

  • 使用时建议一个用户一个 key,方便管理和清理


✅ Set:集合(无序、唯一)

📌 应用场景:

  1. 点赞功能(去重)
  2. 标签系统(兴趣标签)
  3. 共同关注 / 好友关系运算
  4. 在线用户列表

🔧 使用方式:

SADD like:article:123 user1001
SREM like:article:123 user1001
SISMEMBER like:article:123 user1001
SCARD like:article:123
SINTER user:1001:friends user:1002:friends

🧠 原理:

  • 底层是哈希表结构,插入/查找都是 O(1)

  • 元素唯一,自动去重

  • 支持交集、并集、差集等集合运算

✅ 优点:

  • 非常适合“去重”场景

  • 集合运算支持高级分析(如共同点赞、共同好友)

⚠️ 建议:

  • 不能存重复数据,若需要统计次数,用 Hash 或 ZSet 替代


✅ ZSet(Sorted Set):有序集合

📌 应用场景:

  1. 排行榜系统(根据分数排名)
  2. 延迟队列(score = 时间戳)
  3. 热门文章 / 热门话题

🔧 使用方式:

ZADD rank:game 200 user1001
ZADD rank:game 300 user1002
ZRANGE rank:game 0 -1 WITHSCORES
ZREVRANK rank:game user1001

🧠 原理:

  • 由 跳表(SkipList)+ 哈希表 构成

  • 按照 score 排序插入,查询时效率高

✅ 优点:

  • 能支持快速按 score 排序、范围查询

  • 适合动态排行榜、分数管理、计时任务处理等


✅ BitMap:位图

📌 应用场景:

  1. 用户签到统计
  2. 用户是否登录、是否活跃
  3. 某个功能是否开启(布尔状态)

🔧 使用方式:

SETBIT sign:20250715 1001 1
GETBIT sign:20250715 1001
BITCOUNT sign:20250715

🧠 原理:

  • 本质是字符串,内部按位存储,1bit 表示一个状态

  • 占用空间极小,适合高并发、大用户量场景

✅ 优点:

  • 超省空间,100万用户只占约125KB

  • 适合做大规模布尔值存储(状态标记)


✅ HyperLogLog:概率计数器

📌 应用场景:

  1. UV(独立用户访问数)统计
  2. 粗略的唯一元素去重计数

🔧 使用方式:

PFADD uv:20250715 user1001
PFCOUNT uv:20250715

🧠 原理:

  • 使用概率算法 HyperLogLog 估算基数

  • 精度在 0.81% 左右,空间固定 12KB

✅ 优点:

  • 超省内存,可统计上亿级唯一值

  • 精度足以满足大多数运营分析需求

⚠️ 缺点:

  • 不支持具体去重数据查看

    (只能知道有多少,不知道是谁)

  • 不适合对精度要求严格的计数


✅ GEO:地理位置

📌 应用场景:

  1. 查找附近的人/店
  2. 定位服务
  3. 地理范围筛选

🔧 使用方式:

GEOADD store:city 120.38 36.06 store1
GEORADIUS store:city 120.38 36.06 5 km
GEODIST store:city store1 store2 km

🧠 原理:

  • Redis GEO 底层使用 ZSet,score 是地理位置转为整数 score 的编码值

  • 查询时转换为范围查询

✅ 优点:

  • 精度高、效率快

  • 查询方便,结合 ZSet 进行范围定位


✅ Stream:消息队列(高级)

📌 应用场景:

  1. 异步消息处理(类似 Kafka)
  2. 订单流转、日志收集
  3. 多消费者消费模型

🔧 使用方式:

XADD order:stream * orderId 123 status created
XREAD COUNT 1 STREAMS order:stream 0
XGROUP CREATE order:stream group1 $
XREADGROUP GROUP group1 consumer1 STREAMS order:stream >

🧠 原理:

  • 内部使用 RadixTree + ListPack 高效存储

  • 每条消息是一个有序条目(ID 唯一),支持消费确认

  • 支持消费者组,保证“每个消息分发给一个消费者”

✅ 优点:

  • 支持持久化、多消费者、消息确认

  • 是 Redis 中真正的消息队列结构,功能完善

⚠️ 建议:

  • 替代 List 做消息队列

  • 对性能和可靠性要求高时优选


✅ 整体对比表(一句话总结)

数据结构

应用场景

特点

适用关键词

String

单值缓存、计数、锁

简单高效

计数器、token、验证码

Hash

对象、购物车

结构化、节省空间

多字段数据

List

队列、评论

有序、支持阻塞

先进先出、任务队列

Set

点赞、关注

唯一、支持集合运算

去重、关系运算

ZSet

排行榜、延迟队列

有序、按分数排序

热门排序

BitMap

签到、状态

位运算、极省空间

用户标记

HyperLogLog

UV统计

概率估算

大规模去重

GEO

附近的人

经纬度范围查询

LBS服务

Stream

高级消息队列

多消费者、持久化

实时任务、日志

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

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

相关文章

将EXCEL或者CSV转换为键值对形式的Markdown文件

# 创建命令行参数解析器parser argparse.ArgumentParser(description将 CSV 或 Excel 文件转换为带标头的 Markdown 格式)# 必需参数parser.add_argument(input_file, help输入文件路径 (CSV 或 Excel))parser.add_argument(output_file, help输出 Markdown 文件路径)# 可选参…

MySQL 配置性能优化实操指南:分版本5.7和8.0适配方案

在 MySQL 性能优化中,不同版本的特性差异会直接影响优化效果。本文基于 MySQL 5.7 和 8.0 两个主流版本,通过版本适配的配置代码、场景举例和通俗解释,让优化方案更精准落地。一、硬件与系统配置优化(基础层优化)1. 服…

【STM32实践篇】:串口通信

文章目录1. 串行通信与并行通信2. 异步通信与同步通信3. 单工,半双工和全双工通信4. 通信速率和接口标准5. USART 结构框图6. 串口电路6.1 串口之间的连接6.2 串口与 RS232 的转换和连接6.3 串口与 RS485 的转换和连接6.4 串口与 USB 的转换和连接7. USART 字符说明…

Trae IDE评测体验:通过 MCP Server - Figma AI Bridge 一键将 Figma 转为前端代码

Trae IDE评测体验:通过 MCP Server - Figma AI Bridge 一键将 Figma 转为前端代码 在现代前端开发中,从设计稿到可用页面的交付往往需要大量重复劳动:切图、手写样式、布局调整……而借助 MCP Server - Figma AI Bridge,我们可以…

文献阅读 250715-Atmospheric rivers cause warm winters and extreme heat events

Atmospheric rivers cause warm winters and extreme heat events 来自 <Atmospheric rivers cause warm winters and extreme heat events | Nature> ## Abstract: Definition: Atmospheric rivers (ARs) are narrow regions of intense water vapour transport in the …

线上协同办公时代:以开源AI大模型等工具培养网感,拥抱职业变革

摘要&#xff1a;在提倡线上协同办公的时代背景下&#xff0c;职场人需迅速提升工作能力以适应职业变革。培养网感成为时代所需&#xff0c;它为快速连接时代奠定基础。本文深入探讨了开源AI大模型、AI智能名片、S2B2C商城小程序源码等工具在培养网感过程中的重要作用&#xff…

Netty网络聊天室及扩展序列化算法

一、前言Netty是一个基于Java的高性能、事件驱动的网络应用框架&#xff0c;广泛应用于各种网络通信场景。本文将介绍如何使用Netty构建一个简单的网络聊天室&#xff0c;并扩展序列化算法来提高数据传输效率和灵活性。二、Netty网络聊天室的实现1. 项目结构我们将使用Maven构建…

基于单片机金沙河粮仓环境监测系统设计与实现

摘 要 本文围绕基于单片机的金沙河粮仓环境监测系统展开设计与实现研究。系统以单片机为核心&#xff0c;集成 DHT11、MQ - 135 等传感器&#xff0c;可实时精准监测粮仓温湿度、气体成分等关键环境参数。借助 LoRa、ESP8266 实现数据的可靠传输与远程通信 &#xff0c;OLED 屏…

如何解决Android Studio安装时无法下载SDK的问题(Windows、Linux、Mac解决方案大全)

如何解决Android Studio安装时无法下载SDK的问题&#xff08;Windows、Linux、Mac解决方案大全&#xff09; 前言 对于全栈开发者而言&#xff0c;安装 Android Studio 是迈向 Android 开发的第一步&#xff0c;但在 Windows、Linux、macOS 等不同平台上&#xff0c;经常会遇…

SQL Server从入门到项目实践(超值版)读书笔记 21

9.5 数据的内连接查询连接是关系数据库模型的主要特点&#xff0c;连接查询是关系数据库中最主要的查询&#xff0c;主要包括内连接、外连接等。内连接查询操作列出与连接条件匹配的数据行&#xff0c;它使用比较运算符比较被链接列的列值。具体语法格式如下&#xff1a;SELECT…

瑞芯微7月17日举办开发者大会,多款AIoT新品发布,触觉智能RK方案商报导

瑞芯微第九届开发者大会RKDC 2025将有多款新品发布。 据瑞芯微电子Rockchip此前宣布&#xff1a;该企业的本年度开发者大会RKDC 2025将于7月17~18日在福建福州海峡国际会展中心举行。本次瑞芯微开发者大会以“AIoT模型创新重做产品”为主题&#xff0c;关注传统IoT功能设备向场…

Eureka+Ribbon实现服务注册与发现

目录 一、相关文章 二、兼容说明 三、服务注册 四、服务发现 一、相关文章 基础工程&#xff1a;gradle7.6.1springboot3.2.4创建微服务工程-CSDN博客 Eureka服务端启动&#xff1a;https://blog.csdn.net/cherishSpring/article/details/149473554 Ribbon负载均衡&#…

数据库、HTML

一、数据库 数据库文件与普通文件区别: 普通文件对数据管理(增删改查)效率低2.数据库对数据管理效率高&#xff0c;使用方便 常用数据库: 1.关系型数据库: 将复杂的数据结构简化为二维表格形式 大型:0racle、DB2 中型:MySq1、sQLServer 小型:Sqlite 2.非关系型数据库以键值对…

RCE随笔(1)

哪些是可以执行代码执行&#xff1a;php代码。eval如&#xff1a;eval:<?php eval($_post[key]);eval&#xff1a;php中不被叫做函数叫动态执行命令assert&#xff1a;执行函数call_user_func_array<?php call_user_func_array(assert,array($_REQUEST[shu]));传入xxs-…

FPGA——ZYNQ7020学习日记(PS端)4(开始PS控制VGA显示)

1.DMA 我们的整体VGA显示分为几步&#xff1a;比如先导入VIDEO TIMING CONTROL来做对输入数据的时序“对齐”&#xff0c;这里开源骚客写的很详细&#xff0c;先用了一个虚拟IO&#xff08;VIO)来作为输入&#xff0c;导入了一个简单的RTL模块&#xff08;当VTL的使能信号有效…

AGX Xavier 搭建360环视教程【补充一:鱼眼去畸变(Fisheye Undistortion)】

对每路帧做鱼眼去畸变除了用cv::cuda::remap是否有更好的办法呢&#xff1f;确实 cv::cuda::remap 不是唯一可选项&#xff0c;甚至未必是最高效或最适合实际业务量级的方案。&#x1f3af; 1️⃣ 去畸变的原理鱼眼相机&#xff08;或者大广角相机&#xff09;会把直线拉弯&…

tomato靶机练习

下载完靶机后&#xff0c;直接运行&#xff0c;选择安装路径后将虚拟机的网络设置为nat模式&#xff0c;设置完成后重启虚拟机扫描同一网段&#xff0c;查找主机&#xff0c;这里我们使用kali的nmap&#xff0c;既能找到主机&#xff0c;也能查看开启的端口依次尝试&#xff0c…

136. Java 泛型 - 下限通配符

文章目录136. Java 泛型 - 下限通配符 (? super T)**1. 什么是下限通配符 (? super T)&#xff1f;****2. 为什么使用下限通配符&#xff1f;****3. 示例&#xff1a;使用 ? super Integer 允许添加 Integer****✅ 正确示例****4. 为什么 List<? super Integer> 和 L…

C++23中的std::expected:异常处理

C23中的std::expected:异常处理 众所周知&#xff0c;C23以前的异常处理是比较麻烦的&#xff0c;尤其是自己要在可能抛出异常的地方&#xff0c;需要自己去捕获它&#xff0c;比如除数为0的异常、使用std::stoi函数将字符串转换成int整型数据、处理文件读写的异常等等&#x…

处理Electron Builder 创建新进程错误 spawn ENOMEM

这个错误 spawn ENOMEM 表明系统内存不足&#xff0c;无法为 Electron Builder 创建新进程。以下是一些可能的解决方案&#xff1a;释放系统内存关闭不必要的程序和服务增加物理内存 (RAM) 或交换空间 (swap)使用 free -h 和 top 命令检查内存使用情况临时增加交换空间# 创建一…