百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

分布式系统的那些 Redis 应用场景,看看你知道哪些

mhr18 2024-10-24 11:07 17 浏览 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在分布式系统里面主流的使用场景,具体技术实现细节以及更深层次的思考,大家可以根据自己业务场景再去查阅相关资料。毕竟我们既要能抬头看天,也要能下地干活!

喜欢的话别忘了,关注、点赞、分享,谢谢拉~

相关推荐

Docker安装详细步骤及相关环境安装配置

最近自己在虚拟机上搭建一个docker,将项目运行在虚拟机中。需要提前准备的工具,FinallShell(远程链接工具),VM(虚拟机-配置网络)、CentOS7(Linux操作系统-在虚拟机上安装)...

Linux下安装常用软件都有哪些?做了一个汇总列表,你看还缺啥?

1.安装列表MySQL5.7.11Java1.8ApacheMaven3.6+tomcat8.5gitRedisNginxpythondocker2.安装mysql1.拷贝mysql安装文件到...

Nginx安装和使用指南详细讲解(nginx1.20安装)

Nginx安装和使用指南安装1.检查并安装所需的依赖软件1).gcc:nginx编译依赖gcc环境安装命令:yuminstallgcc-c++2).pcre:(PerlCompatibleRe...

docker之安装部署Harbor(docker安装hacs)

在现代软件开发和部署环境中,Harbor作为一个企业级的容器镜像仓库,提供了高效、安全的镜像管理解决方案。通过Docker部署Harbor,可以轻松构建私有镜像仓库,满足企业对镜像存储、管理和安全性...

成功安装 Magento2.4.3最新版教程「技术干货」

外贸独立站设计公司xingbell.com经过多次的反复实验,最新版的magento2.4.3在oneinstack的环境下的详细安装教程如下:一.vps系统:LinuxCentOS7.7.19...

【Linux】——从0到1的学习,让你熟练掌握,带你玩转Linu

学习Linux并掌握Java环境配置及SpringBoot项目部署是一个系统化的过程,以下是从零开始的详细指南,帮助你逐步掌握这些技能。一、Linux基础入门1.安装Linux系统选择发行版:推荐...

cent6.5安装gitlab-ce最新版本-11.8.2并配置邮件服务

cent6.5安装gitlab-ce最新版本-11.8.2并配置邮件服务(yum选择的,时间不同,版本不同)如果对运维课程感兴趣,可以在b站上搜索我的账号:运维实战课程,可以关注我,学习更多免费的运...

时隔三月,参加2020秋招散招,终拿字节跳动后端开发意向书.

3个月前头条正式批笔试4道编程题只AC了2道,然后被刷了做了200多道还是太菜了,本来对字节不抱太大希望,毕竟后台竞争太大,而且字节招客户端开发比较多。后来看到有散招免笔试,抱着试一试的心态投了,然而...

Redisson:Java程序员手中的“魔法锁”

Redisson:Java程序员手中的“魔法锁”在这个万物互联的时代,分布式系统已经成为主流。然而,随着系统的扩展,共享资源的争夺成为了一个棘手的问题。就比如你想在淘宝“秒杀”一款商品,却发现抢的人太...

【线上故障复盘】RPC 线程池被打满,1024个线程居然不够用?

1.故障背景昨天晚上,我刚到家里打开公司群,就看见群里有人讨论:线上环境出现大量RPC请求报错,异常原因:被线程池拒绝。虽然异常量很大,但是异常服务非核心服务,属于系统旁路,服务于数据核对任务,即使...

小红书取消大小周,有人不高兴了!

小红书宣布五一节假日之后,取消大小周,恢复为正常的双休,乍一看工作时长变少,按道理来说大家应该都会很开心,毕竟上班时间缩短了,但是还是有一些小红书的朋友高兴不起来,心情很复杂。因为没有了大小周,以前...

延迟任务的多种实现方案(延迟机制)

场景订单超时自动取消:延迟任务典型的使用场景是订单超时自动取消。功能精确的时间控制:延时任务的时间控制要尽量准确。可靠性:延时任务的处理要是可靠的,确保所有任务最终都能被执行。这通常要求延时任务的方案...

百度java面试真题(java面试题下载)

1、SpingBoot也有定时任务?是什么注解?在SpringBoot中使用定时任务主要有两种不同的方式,一个就是使用Spring中的@Scheduled注解,另一个则是使用第三方框架Q...

回归基础:访问 Kubernetes Pod(concurrent.futures访问数据库)

Kubernetes是一头巨大的野兽。在它开始有用之前,您需要了解许多概念。在这里,学习几种访问集群外pod的方法。Kubernetes是一头巨大的野兽。在它开始有用之前,您需要了解许多不同的...

Spring 缓存神器 @Cacheable:3 分钟学会优化高频数据访问

在互联网应用中,高频数据查询(如商品详情、用户信息)往往成为性能瓶颈。每次请求都触发数据库查询,不仅增加服务器压力,还会导致响应延迟。Spring框架提供的@Cacheable注解,就像给方法加了一...

取消回复欢迎 发表评论: