分布式系统的那些 Redis 应用场景,看看你知道哪些
mhr18 2024-10-24 11:07 30 浏览 0 评论
Redis 以高性能、灵活数据结构、原子操作、复制和高可用、分区与水平扩展等优势,成为解决分布式系统中复杂业务问题的核心解决方案,适用于各种需要快速、可扩展和高性能的业务场景。
首先,什么是 Redis,为什么我们使用它?
Redis 是一个内存数据结构存储。它最常用作缓存。它支持许多数据结构,如字符串,哈希,列表,集合和有序集合。Redis 以出色的高性能读写能力而闻名。
1、对象缓存 - Caching Objects
Redis 最经典的是用场景,是业务对象缓存来加速Web应用程序。
在这个场景中,Redis 将用户经常请求的业务数据存储在内存中。它使得Web服务器能够快速返回经常访问的业务数据,从而减轻数据库负载并提高应用程序的响应时间。
在业务量达到一定规模时,缓存分布在一组 Redis 服务器之间。数据分片是一种常见的技术,能够在整个集群中均匀分配缓存负载。
2、会话存储 - Session Store
无状态对于实现分布式系统的可伸缩至关重要,无状态的节点更容易水平扩展,因为每个节点都可以独立地处理请求,而无需与其他节点共享状态信息。这使得系统能够通过添加更多的节点来应对不断增长的负载。无状态节点可以更容易地实现负载均衡。负载均衡器可以简单地将请求分发到任何可用的节点,而无需关心请求的上下文信息或状态。
Redis 可以帮助我们在无状态的服务器之间共享会话数据。当用户登录到Web应用程序时,会话数据与唯一的会话ID一起存储在 Redis 中,并作为cookie返回给客户端。
当用户发出对应用程序的请求时,会话ID包含在请求中,无状态Web服务器使用该ID从 Redis 检索会话数据。
如果 Redis 服务器重新启动,存储在 Redis 中的会话数据将丢失。
尽管 Redis 提供了通过快照 和 AOF 追加文件实现数据持久化的方案,允许将会话数据保存到磁盘并在重新启动时重新加载到内存中。但是,这些选项通常需要花费太长时间来加载,不适用于生产环境。在这种情况下,通常使用Redis复制方案替代。主实例数据被复制到备用实例。在主实例宕机的情况下,备用实例将被快速启用来承接流量。
Redis复制是一种通过在多个 Redis 实例之间复制数据来提供高可用性和容错性的机制。复制过程涉及主从架构,其中一个 Redis 服务器(主服务器)将其数据复制到一个或多个 Redis 服务器(从服务器)。下面是Redis 主从复制的过程:
主服务器:主 Redis 服务器是持有原始数据集的主服务器。它接受来自客户端的写操作,并将数据的副本发送到连接的从服务器。
从服务器:从服务器复制主服务器的数据。它们充当主数据集的只读副本,可以处理客户端的读查询。可以连接多个从服务器到单个主服务器。
复制过程:复制过程始于主服务器向从服务器发送数据集的完整快照,当从服务器初始连接或需要重新同步时。在初始同步之后,主服务器继续向从服务器发送增量更新(复制日志)。
副本晋升:如果主服务器下线或无法访问,从服务器可以被晋升为新的主服务器。这确保即使主服务器发生故障,服务仍能继续。客户端可以将其写操作重定向到新的主服务器。
同步延迟:由于复制是异步的,主服务器和从服务器之间可能存在轻微的延迟。这种延迟被称为“同步延迟”,在设计高可用性方案时需要考虑。
自动重新连接:Redis 具有处理主从断开连接和自动重新连接的机制。如果从服务器断开连接,它可以重新连接并追赶主服务器的状态。
处理部分重新同步:如果从服务器明显滞后或断开连接时间较长,它可以执行部分重新同步,只请求其错过的数据部分,减少传输的数据量。
Redis 复制提供了容错性、负载均衡和改进的读可扩展性。它是确保分布式 Redis 部署中数据可用性和连续性的重要特性。
3、分布式锁 - Distributed Locks
当应用程序中的多个节点需要协调对某个共享资源的访问时,使用分布式锁。Redis 作为分布式锁时,使用原子命令如 SETNX 或 SET(如果不存在)。
它允许调用者仅在键尚不存在时设置键。
以下是它底层工作原理。客户端一尝试通过使用SETNX命令设置具有唯一值和超时的键来获取锁定。如果键尚未设置,SETNX命令将返回1,表示日志已由客户端一获取。客户端一完成其工作。
通过删除键释放日志。现在,如果键已存在,则 SETNX 命令返回 0,表示该日志已被另一个客户端持有。在这种情况下,客户端一将等待并重试 SETNX 操作,直到其他客户端释放该日志。
下面是示例代码:
值得注意的是,这种简单的实现对于许多场景使用来说可能已经足够完美了,但对于生产用途来说并不完全容错。
1、这个法在等待和重试期间存在竞态条件,可能导致一些客户端一直无法获取资源,或者导致等待时间较长。
2、没有处理死锁或异常情况的机制,可能导致资源的不正确释放或永久性占用。
但是有许多 Redis 客户端库提供了集成的高质量分布式锁实现。
4、限流 - Rate Limiter
限流是一种用于控制访问速率的重要机制,可以确保系统不受到突发大量请求的影响,从而提高系统的稳定性和可靠性。Redis 可以通过其增量命令和过期时间设置,实现简单而有效的访问限流。
一个非常基本的速率限制算法是这样工作的。对于每个传入请求,请求的 IP 或用户 ID 作为一个键。
通过 Redis 中的递增命令来增加对该键的请求次数。当前计数与允许的速率限制进行比较。如果计数在速率限制范围内,请求将被处理。如果计数超过限制,请求将被拒绝。这些键在特定的时间窗口后过期,例如一分钟,以便为下一个时间窗口重置计数。
在这个例子中,RateLimiter 类包含了一个简单的 allowRequest 方法,该方法用于判断当前是否允许处理请求。计数器的键由键前缀和标识符(IP 或用户 ID)构成,计数器的值通过递增操作实现。该示例设置了一个固定的请求配额限制(limit)和一个固定的窗口大小(windowSize),并通过 Jedis 客户端连接到本地的 Redis 服务器。请注意,实际生产环境中可能需要更复杂的处理和调优。
以上属于固定窗口计数的限流策略,当然更复杂的速率限制器,例如滑动窗口限流、令牌桶算法以及漏桶算法,也都可以使用Redis进行实现。
5、排行榜 - Leaderboard
Redis 是实现各种类型的排行榜的一种最简单高效的方式。Sorted Sets(有序集合)是支持这一功能的基本数据结构。
Sorted Set 类似于 Redis 中的 Set 数据结构。成员可以是一个非重复的字符串列表。唯一的区别在于,每个成员都与一个分数相关联,这是一个浮点数,为 Sorted Set 提供了排序顺序。成员始终按照分数从最小到最大的顺序排序。
元素按分数排序。这使得可以通过分数在对数时间内快速检索元素。下面是用 Java 演示,如何使用 Redis Sorted Set 实现简单的游戏排行榜系统。
在这个例子中,通过 addScore 方法,可以向游戏排行榜中添加玩家及其相应的分数。getLeaderboard 方法,可以获取完整的游戏排行榜,按照分数从高到低排序。通过 getLeaderboardByScoreRange 方法,可以根据指定的分数范围获取排行榜。 在 main 函数中,演示了如何创建游戏排行榜实例、添加分数、以及通过不同的方法获取排行榜数据,并打印输出。
此示例正是使用了 Redis 的有序集合(Sorted Set)来存储玩家及其分数,利用有序集合的特性可以按照分数排序,从而实现了简单的排行榜功能。
结语:
这篇文章本意让我们了解,Redis在分布式系统里面主流的使用场景,具体技术实现细节以及更深层次的思考,大家可以根据自己业务场景再去查阅相关资料。毕竟我们既要能抬头看天,也要能下地干活!
喜欢的话别忘了,关注、点赞、分享,谢谢拉~
相关推荐
- 【推荐】一个开源免费、AI 驱动的智能数据管理系统,支持多数据库
-
如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!.前言在当今数据驱动的时代,高效、智能地管理数据已成为企业和个人不可或缺的能力。为了满足这一需求,我们推出了这款开...
- Pure Storage推出统一数据管理云平台及新闪存阵列
-
PureStorage公司今日推出企业数据云(EnterpriseDataCloud),称其为组织在混合环境中存储、管理和使用数据方式的全面架构升级。该公司表示,EDC使组织能够在本地、云端和混...
- 对Java学习的10条建议(对java课程的建议)
-
不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...
- SQLShift 重大更新:Oracle→PostgreSQL 存储过程转换功能上线!
-
官网:https://sqlshift.cn/6月,SQLShift迎来重大版本更新!作为国内首个支持Oracle->OceanBase存储过程智能转换的工具,SQLShift在过去一...
- JDK21有没有什么稳定、简单又强势的特性?
-
佳未阿里云开发者2025年03月05日08:30浙江阿里妹导读这篇文章主要介绍了Java虚拟线程的发展及其在AJDK中的实现和优化。阅前声明:本文介绍的内容基于AJDK21.0.5[1]以及以上...
- 「松勤软件测试」网站总出现404 bug?总结8个原因,不信解决不了
-
在进行网站测试的时候,有没有碰到过网站崩溃,打不开,出现404错误等各种现象,如果你碰到了,那么恭喜你,你的网站出问题了,是什么原因导致网站出问题呢,根据松勤软件测试的总结如下:01数据库中的表空间不...
- Java面试题及答案最全总结(2025版)
-
大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...
- 数据库日常运维工作内容(数据库日常运维 工作内容)
-
#数据库日常运维工作包括哪些内容?#数据库日常运维工作是一个涵盖多个层面的综合性任务,以下是详细的分类和内容说明:一、数据库运维核心工作监控与告警性能监控:实时监控CPU、内存、I/O、连接数、锁等待...
- 分布式之系统底层原理(上)(底层分布式技术)
-
作者:allanpan,腾讯IEG高级后台工程师导言分布式事务是分布式系统必不可少的组成部分,基本上只要实现一个分布式系统就逃不开对分布式事务的支持。本文从分布式事务这个概念切入,尝试对分布式事务...
- oracle 死锁了怎么办?kill 进程 直接上干货
-
1、查看死锁是否存在selectusername,lockwait,status,machine,programfromv$sessionwheresidin(selectsession...
- SpringBoot 各种分页查询方式详解(全网最全)
-
一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...
- 《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略
-
《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...
- LoadRunner(loadrunner录制不到脚本)
-
一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...
- Redis数据类型介绍(redis 数据类型)
-
介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...
- RMAN备份监控及优化总结(rman备份原理)
-
今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)