Redis 的不同数据结构分别适用于哪些微服务场景
我们一块来分析下Redis 的不同数据结构在微服务场景下的具体应用:
1. String (字符串)
- 特点: 最基本的数据类型,二进制安全,可以存储任何类型的数据(文本、序列化对象、图片等),最大 512MB。支持原子性的递增/递减操作。
- 微服务适用场景:
- 分布式缓存: 最常见的用途。缓存数据库查询结果、API 响应、渲染后的 HTML 片段等。
- 示例:
UserService查询用户信息后,将用户 ID 作为 Key,用户信息(序列化后的 JSON 或其他格式)作为 Value 存入 Redis String,并设置 TTL。GET user:123->{"name": "Alice", "email": "..."}。
- 示例:
- 分布式会话: 存储 Session ID 到用户会话数据的映射。
- 示例: 用户登录后,
AuthService生成一个 Session ID,将 Session ID 作为 Key,用户的登录状态、权限等信息作为 Value 存入 Redis String。GET session:xyzabc->{"userId": 123, "role": "admin", "loginTime": ...}。
- 示例: 用户登录后,
- 计数器/限流器: 利用
INCR,DECR,INCRBY等原子操作实现。- 示例:
APIGateway对某个接口进行限流,使用INCR api:/orders:user:123,并结合EXPIRE设置时间窗口。当计数值超过阈值时拒绝请求。 - 示例:
ContentService统计文章阅读数:INCR article:readcount:456。
- 示例:
- 分布式锁 (简单实现): 利用
SET key value NX EX seconds命令实现简单的互斥锁。- 示例:
InventoryService在扣减库存前尝试获取商品锁:SET product:lock:sku123 my_request_id NX EX 30。
- 示例:
- 分布式缓存: 最常见的用途。缓存数据库查询结果、API 响应、渲染后的 HTML 片段等。
2. Hash (哈希)
- 特点: 存储一个 Key 到多个 Field-Value 对的映射,类似于编程语言中的 Map 或 Dictionary。适合存储结构化对象。
- 微服务适用场景:
- 缓存结构化对象: 存储对象的部分或全部属性,便于单独更新或获取某个字段,节省网络带宽和序列化开销。
- 示例:
UserService缓存用户信息,Key 为user:123,Fields 包括name,email,age等。HGET user:123 name->"Alice";HSET user:123 age 31只更新年龄。
- 示例:
- 购物车: 存储用户的购物车信息。
- 示例:
CartService使用 Hash 存储购物车,Key 为cart:user:123,Field 为商品 ID (product:sku456),Value 为商品数量 (3)。HINCRBY cart:user:123 product:sku456 1实现添加商品数量。
- 示例:
- 缓存结构化对象: 存储对象的部分或全部属性,便于单独更新或获取某个字段,节省网络带宽和序列化开销。
3. List (列表)
- 特点: 有序的字符串列表,按照插入顺序排序。可以在列表头部或尾部添加/移除元素。支持阻塞式弹出操作。
- 微服务适用场景:
- 轻量级消息队列/任务队列: 实现先进先出 (FIFO) 或后进先出 (LIFO) 的简单队列。
- 示例:
OrderService创建订单后,使用LPUSH order:notify:queue {"orderId": 789, "type": "email"}将通知任务推入队列。NotificationService使用BRPOP order:notify:queue 10阻塞式地获取并处理任务。
- 示例:
- 最新消息/动态 Feed: 存储用户最近的操作或接收到的消息列表(通常需要配合
LTRIM来限制列表长度)。- 示例:
TimelineService用户发布新帖子后,LPUSH user:timeline:123 post:abc,并用LTRIM user:timeline:123 0 999保留最新的 1000 条。
- 示例:
- 轻量级消息队列/任务队列: 实现先进先出 (FIFO) 或后进先出 (LIFO) 的简单队列。
4. Set (集合)
- 特点: 无序的、唯一的字符串集合。支持高效的成员检查、添加、删除操作,以及集合间的交集、并集、差集运算。
- 微服务适用场景:
- 标签系统/分类: 存储对象(如文章、商品)关联的标签。
- 示例:
ProductService存储商品的标签:SADD product:tags:sku123 "electronics" "audio" "bluetooth"。可以方便地通过SISMEMBER检查商品是否有某标签,或通过SINTER查找同时具有多个标签的商品。
- 示例:
- 共同好友/关注关系: 存储用户的关注列表或好友列表,并利用集合运算找到共同关系。
- 示例:
SocialService存储用户关注的人:SADD user:following:alice "bob" "charlie";SADD user:following:bob "alice" "charlie" "david".SINTER user:following:alice user:following:bob->{"charlie"}(共同关注)。
- 示例:
- 唯一访客统计 (简单场景): 记录访问某页面或功能的独立用户 ID。
- 示例:
AnalyticsService记录访问某页面的独立访客:SADD page:visitors:/home "user:123" "user:456"。SCARD page:visitors:/home获取独立访客数。
- 示例:
- 标签系统/分类: 存储对象(如文章、商品)关联的标签。
5. Sorted Set (ZSet / 有序集合)
- 特点: Set 的升级版,每个成员都关联一个 double 类型的分数 (score),并根据分数进行排序。成员唯一,但分数可以重复。支持按分数范围或排名范围获取成员。
- 微服务适用场景:
- 排行榜: 根据分数(如积分、销售额、时间戳)对成员进行排序。
- 示例:
GameService存储玩家积分榜:ZADD game:leaderboard 1500 "player1" 1200 "player2"。ZREVRANGE game:leaderboard 0 9 WITHSCORES获取排名前 10 的玩家及其分数。
- 示例:
- 延迟队列/定时任务: 将任务的执行时间戳作为 score,利用
ZRANGEBYSCORE定期查询到期的任务。- 示例:
OrderService创建订单后 30 分钟未支付自动取消:ZADD order:pending:cancel <current_timestamp + 30_minutes> "order:789"。后台任务定时ZRANGEBYSCORE order:pending:cancel 0 <current_timestamp>获取到期订单进行处理。
- 示例:
- 带权重的任务队列: score 可以代表任务优先级。
- 排行榜: 根据分数(如积分、销售额、时间戳)对成员进行排序。
6. Stream (流)
- 特点: Redis 5.0 引入的强大的 append-only 日志结构。支持消费组 (Consumer Groups),允许多个消费者并行处理同一个流的不同部分,并提供消息确认 (ACK) 机制,比 List 做消息队列更可靠、功能更丰富。
- 微服务适用场景:
- 可靠的消息队列/事件总线: 用于服务间的异步通信、事件溯源(轻量级)、日志收集等。
- 示例:
OrderService在订单状态变更时,XADD order:events * status "paid" orderId "789" userId "123"将事件添加到流中。InventoryService和ShippingService可以分别创建消费组,独立地从流中读取并处理paid事件,并通过XACK确认处理完成。
- 示例:
- 可靠的消息队列/事件总线: 用于服务间的异步通信、事件溯源(轻量级)、日志收集等。
7. HyperLogLog (HLL)
- 特点: 概率数据结构,用于对集合的基数(唯一元素的数量)进行估算,占用内存极小 (固定约 12KB),但结果有微小误差 (标准误差约 0.81%)。
- 微服务适用场景:
- 大规模唯一计数: 统计海量数据中的独立元素数量,如网站的 UV (Unique Visitors)、独立 IP 数、搜索词的独立用户数等,对精度要求不是 100% 严格的场景。
- 示例:
AnalyticsService统计每日独立访客:对每个访问的用户 ID 执行PFADD daily_visitors:2023-10-27 "user_id_abc"。最后通过PFCOUNT daily_visitors:2023-10-27获得估算的 UV 值。
- 示例:
- 大规模唯一计数: 统计海量数据中的独立元素数量,如网站的 UV (Unique Visitors)、独立 IP 数、搜索词的独立用户数等,对精度要求不是 100% 严格的场景。
8. Geospatial (GEO)
- 特点: 基于 Sorted Set 实现,专门用于存储地理空间坐标(经度、纬度)并进行相关查询。
- 微服务适用场景:
- 位置服务: 查找附近的人/地点、计算两点间距离等。
- 示例:
LocationService或RideSharingService存储司机的位置:GEOADD drivers:available 116.40 39.90 "driver123"。用户请求打车时,GEORADIUS drivers:available <user_longitude> <user_latitude> 5 km WITHDIST查找 5 公里内的可用司机及其距离。
- 示例:
- 位置服务: 查找附近的人/地点、计算两点间距离等。
总结:
选择哪种 Redis 数据结构取决于微服务具体要解决的问题。通过比较每种数据结构的特性和优势,可以更高效的实现微服务中的缓存、通信和特定业务逻辑。我们要合理利用这些结构让Redis 在微服务架构中发挥它的价值。
相关文章:
Redis 的不同数据结构分别适用于哪些微服务场景
我们一块来分析下Redis 的不同数据结构在微服务场景下的具体应用: 1. String (字符串) 特点: 最基本的数据类型,二进制安全,可以存储任何类型的数据(文本、序列化对象、图片等),最大 512MB。支持原子性的…...
信息系统项目管理工程师备考计算类真题讲解四
一、三点估算(PERT) PERT(Program Evaluation and Review Technique):计划评估技术,又称三点估算技术。PERT估算是一种项目管理中用于估算项目工期或成本的方法,以下是其详细介绍: …...
Golang|KVBitcask
文章目录 初识KVbitcask论文详解 初识KV bitcask论文详解 论文地址:https://riak.com/assets/bitcask-intro.pdf理想的存储引擎,应该满足下面一些特点:...
Python学习之路(三)
将 Python 与数据库对接是开发过程中常见的任务,可以使用多种数据库(如 SQLite、MySQL、PostgreSQL、Oracle、MongoDB 等)。以下是一些常见的数据库及其与 Python 的对接方法,包括安装库、连接数据库、执行查询和操作数据的示例。…...
基于骨骼识别的危险动作报警系统设计与实现
基于骨骼识别的危险动作报警系统设计与实现 基于骨骼识别的危险动作报警分析系统 【包含内容】 【一】项目提供完整源代码及详细注释 【二】系统设计思路与实现说明 【三】基于骨骼识别算法的实时危险行为预警方案 【技术栈】 ①:系统环境:Windows 10…...
PDF转换格式失败?原因及解决方法全解析
在日常工作中,我们经常会遇到将PDF转换为Word、Excel、PPT等格式的需求。有时候以为一键转换就能搞掂,没想到却转换失败。到底问题出在哪?别急,我们可以看看是否以下几个问题引起的,找到解决问题的关键! 原…...
模型提示词
一 提示词 (一) 提示词(Prompt)是用户发送给大语言模型的问题、指令或请求,** 1 来明确地告诉模型用户想要解决的问题或完成的任务,是大语言模型理解用户需求并据此生成相关、准确回答或内容的基础。对于…...
void MainWindow::on_btnOutput_clicked()为什么我在QT里面没有connect,也能触发点击效果
在 Qt 中,即使你没有显式调用 connect 函数,某些信号(如按钮的 clicked() 信号)仍然可以触发槽函数。这是因为 Qt 提供了一种自动连接机制,称为 自动连接(Auto-Connection)。以下是可能的原因和…...
Node.js 数据库 事务 项目示例
1、参考:JavaScript语言的事务管理_js 函数 事务性-CSDN博客 或者百度搜索:Nodejs控制事务, 2、实践 2.1、对于MySQL或MariaDB,你可以使用mysql或mysql2库,并结合Promise或async/await语法来控制事务。 使用 mysql2…...
Qt开发:QFileInfo详解
文章目录 一、QFileInfo 简介二、常用的构造函数三、常用函数的介绍和使用四、常用静态函数的介绍和使用五、完整代码示例 一、QFileInfo 简介 QFileInfo 提供了一个对象化的方式,用于访问文件系统中单个文件的信息。它可以接受: 文件名字符串ÿ…...
ubuntu1804服务器开启ftp,局域网共享特定文件给匿名用户
要在 Ubuntu 18.04 上设置一个 FTP 服务器,满足以下要求: 允许匿名登录(无需账号密码)。指定分享特定目录下的文件。只允许只读下载。 可以使用 vsftpd(Very Secure FTP Daemon)来实现。以下是详细步骤&a…...
蓝桥杯常考排序
1.逆序 Collections.reverseOrder() 方法对列表进行逆序排序。通过 Collections.sort() 方法配合 Collections.reverseOrder(),可以轻松实现从大到小的排序。 import java.util.ArrayList; // 导入 ArrayList 类,用于创建动态数组 import java.util.C…...
深度学习基础:从入门到理解核心概念
引言 近年来,深度学习(Deep Learning)已成为人工智能领域最热门的研究方向之一。从AlphaGo战胜人类围棋冠军,到ChatGPT等大型语言模型的惊艳表现,深度学习技术正在深刻改变我们的生活和工作方式。本文将系统介绍深度学习的基础知识࿰…...
科技项目验收测试报告有哪些作用?需要多长时间和费用?
在当今快速发展的科技环境中,科技项目的有效验收至关重要。对于公司、开发团队以及客户来说,科技项目验收测试报告更是一个不可缺少的一项重要环节。 科技项目验收测试报告是对一个项目在开发完成后所进行的一系列测试结果的总结。这份报告不仅用于证明…...
redis-事务(MULTI、EXEC、DISCARD、WATCH与lua脚本、包含lua脚本的简单介绍、乐观锁抢购案例的实现)
https://juejin.cn/post/6891158857708797959 首先Redis事务在实际的场景应用上也占着比较重要的地位,例如在秒杀场景中,我们就可以利用Redis事务中的watch命令监听key,实现乐观锁,保证不会出现冲突,也防止商品超卖。 …...
【Linux】su、su-、sudo、sudo -i、sudo su - 命令有什么区别?分别适用什么场景?
目录 su su- sudo sudo -i sudo su - /etc/sudoers su 该命令将启动非登录shell,即虽然以该用户身份启动shell,但使用的是原始用户的环境设置。普通用户账户运行 su 命令切换到另一用户账户,需提供要切换的账户的密码。root用户&…...
CCLinkIE转ModbusTCP借网关之力打破组态王与三菱PLC通讯隔阂
在某自动化生产线项目中,客户采用了三菱PLC作为现场控制核心,该PLC支持CCLinkIE现场总线协议。同时,客户希望使用组态王上位机软件进行生产过程的监控与管理,然而组态王上位机更擅长与ModbusTCP协议设备进行通讯。为了解决这一协议…...
MyBatis-Plus 通过 ID 更新数据为NULL总结
在使用 MyBatis-Plus 通过 ID 更新数据时,若需将字段值设为 null,可参考以下解决方案: 方法一:使用 TableField 注解 在实体类字段上添加注解,指定更新策略为忽略非空检查: public class User {TableFie…...
Linux网络编程第一课:深入浅出TCP/IP协议簇与网络寻址系统
知识点1【网络发展简史】 **网络节点:**路由器和交换机组成 交换机的作用:拓展网络接口 路由:网络通信路径 1、分组交换 分组的目的: 数据量大,不能一次型传输,只能分批次传输,这里的每一批…...
深入解析布尔注入:原理、实战与防御
目录 一、布尔注入的原理与核心逻辑 二、布尔注入的实战步骤 三、关键函数与绕过技巧 四、实战案例:获取数据库名称 五、防御策略与最佳实践 六、总结 一、布尔注入的原理与核心逻辑 布尔注入(Boolean-Based Blind SQL Injection)是一种…...
GESP2023年12月认证C++七级( 第三部分编程题(2)纸牌游戏)
参考程序: #include <iostream> #include <cstring> // for memset #include <vector> using namespace std;const int max_n 1005; int n; int a[max_n], b[max_n], c[max_n]; // a[]: 得分系数;b[]: 换牌惩罚;c[]: …...
不同的人机验证的机制
目录 Cloudflare Turnstile验证 reCAPTCHA V2 GeeTest CAPTCHA Arkose Labs 验证码(FunCaptcha) 图像(图片)验证码 亚马逊验证码 (AWS/WAF) Cloudflare Turnstile验证 Cloudflare Turnstile 验证码以隐形方式运行…...
HarmonyOS学习 实验九:@State和@Prop装饰器的使用方法
HarmonyOS应用开发:父子组件状态管理实验报告 引言 在HarmonyOS应用开发领域,组件之间的状态管理是一个至关重要的概念。通过有效的状态管理,我们可以确保应用的数据流动清晰、可预测,从而提升应用的稳定性和可维护性。本次实验…...
基于瑞芯微RK3562 四核 ARM Cortex-A53 + 单核 ARM Cortex-M0——Linux应用开发手册
前 言 本文主要介绍TL3562-MiniEVM评估板的AMP(Asymmetric Multi-processing)开发案例,适用开发环境如下: Windows开发环境:Windows 7 64bit、Windows 10 64bit Linux开发环境:VMware16.2.5、Ubuntu20.04.6 64bit U-Boot:U-Boot-2017.09 Kernel:Linux-5.10.209 Lin…...
Java c线程等待ab线程执行完再执行
1、LockSupport AtomicInteger LockSupport.park() 函数表示挂起当前线程LockSupport.unpark© 函数表示解除线程c的阻塞状态AtomicInteger.decrementAndGet() 函数表示将该变量减一,并返回当前变量值(线程安全的原子类) 2、CountDownL…...
ubuntu20.04 Android14编译环境配置
ubuntu 更新和必要安装 sudo apt update sudo apt install git sudo apt install python2-minimal sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 1 sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 2 sudo upda…...
优化 Dockerfile 性能之实践(Practice of Optimizing Dockerfile Performance)
优化 Dockerfile 性能之实践 构建 Docker 镜像时,Dockerfile 的性能会显著影响构建过程的效率。经过优化的 Dockerfile 可以缩短构建时间、最小化镜像大小并提高整体容器性能。在本文中,我们将探讨优化 Dockerfile 性能的最佳实践。 尽量减少层数 影响…...
【Ai】MCP实战:手写 client 和 server [Python版本]
什么是mcp MCP 是一个开放协议,它为应用程序向 LLM 提供上下文的方式进行了标准化。你可以将 MCP 想象成 AI 应用程序的 USB-C 接口。就像 USB-C 为设备连接各种外设和配件提供了标准化的方式一样,MCP 为 AI 模型连接各种数据源和工具提供了标准化的接口…...
解决 AWS RDS MySQL mysqldump 导入sql SET @@GLOBAL 权限不足问题
在使用 mysqldump 导出数据库时,导出的 SQL 文件通常会包含一些 SET 语句,例如 SET MYSQLDUMP, SET SESSION, SET GLOBAL 等,这些语句用于设置会话或全局变量以确保数据一致性和兼容性。然而,在 AWS RDS MySQL 环境中,…...
Java与C在典型场景下的性能对比深度剖析
🎁个人主页:User_芊芊君子 🎉欢迎大家点赞👍评论📝收藏⭐文章 🔍系列专栏:AI 【前言】 在计算机编程领域,Java和C语言都是举足轻重的编程语言。Java以其跨平台性、自动内存管理和丰富…...
