Redis在微服务架构中的几种应用场景

在微服务架构模式中Redis的应用 Redis是一种开源的内存数据库,也被称为数据结构服务器,它支持多种数据类型,如字符串、哈希表、列表、集合和有序集合。Redis具有快速、高效的特点,可以在内存中存储数据,并通过持久化机制将数据写入磁盘,保证数据的持久性。Redis还提供了丰富的功能,如事务、发布订阅、Lua脚本等,使其成为一个强大的缓存和消息队列工具。由于其高性能和灵活性,Redis被广泛应用于Web开发、分布式系统和云计算等领域。 阅读详情

本文介绍在SpringCloud中使用Redis作为Pub/Sub异步通信、缓存或主数据库和配置服务器的三种场景应用。

Redis可以广泛用于微服务架构。它可能是您应用程序以多种不同方式利用的少数流行软件解决方案之一。根据要求,它可以充当主数据库,缓存或消息代理。虽然它也是一个键/值存储,但我们可以将它用作微服务体系结构中的配置服务器或发现服务器。虽然它通常被定义为内存中的数据结构,但我们也可以在持久模式下运行它。

这里我将向您展示一些使用Redis与Spring Boot和Spring Cloud框架之上构建的微服务的示例。这些应用程序将使用Redis Pub / Sub异步通信,使用R​​edis作为缓存或主数据库,最后使用Redis作为配置服务器。

Redis作为配置服务器

如果您已经使用Spring Cloud构建了微服务,那么您可能对Spring Cloud Config有一些经验。它负责为微服务提供分布式配置模式。

不幸的是,Spring Cloud Config不支持Redis作为属性源的后端存储库。这就是我决定分叉Spring Cloud Config项目并实现此功能的原因。

我希望我的实现很快将被包含在官方的Spring Cloud版本中,但是,现在,您可以使用我的fork repo来运行它。它可以在我的GitHub帐户上找到: piomin / spring-cloud-config。我们怎么用呢?非常简单。让我们来看看。

Spring Boot的当前SNAPSHOT版本2.2.0.BUILD-SNAPSHOT与我们用于Spring Cloud Config的版本相同。在构建Spring Cloud Config Server时,我们只需要包含这两个依赖项,如下所示。

<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.0.BUILD-SNAPSHOT</version> </parent> <artifactId>config-service</artifactId> <groupId>pl.piomin.services</groupId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> <version>2.2.0.BUILD-SNAPSHOT</version> </dependency> </dependencies>

默认情况下,Spring Cloud Config Server使用Git存储库后端。我们需要激活 redis配置文件以强制它使用Redis作为后端。如果您的Redis实例侦听的地址不是localhost:6379您需要使用spring.redis.*属性覆盖自动配置的连接设置 。这是我们的bootstrap.yml文件。

spring: application: name: config-service profiles: active: redis redis: host: 192.168.99.100

应用程序主类应注释@EnableConfigServer:

@SpringBootApplication @EnableConfigServer public class ConfigApplication { public static void main(String[] args) { new SpringApplicationBuilder(ConfigApplication.class).run(args); } }

在运行应用程序之前,我们需要启动Redis实例。这是将其作为Docker容器运行并在端口6379上公开的命令。

$ docker run -d --name redis -p 6379:6379 redis

每个应用程序的配置必须在密钥${spring.application.name}或${spring.application.name}-${spring.profiles.active[n]}。我们必须使用与配置属性名称对应的键创建哈希。 我们的示例应用程序driver-management使用三个配置属性:server.port用于设置HTTP侦听端口,spring.redis.host用于更改用作消息代理和数据库的默认Redis地址,以及sample.topic.name用于设置用于我们的微服务之间的异步通信的主题的名称。这是我们为driver-management使用RDBTools可视化而创建的Redis哈希的结构。 在Redis CLI 中运行HGETALL ,返回:

>> HGETALL driver-management { "server.port": "8100", "sample.topic.name": "trips", "spring.redis.host": "192.168.99.100" }

在Redis中设置键值并使用redis配置文件运行Spring Cloud Config Server之后,我们需要在客户端启用分布式配置功能。要做到这一点,我们只需要包含对每个微服务的spring-cloud-starter-config依赖pom.xml。

<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>

使用最新稳定的Spring Cloud:

<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Greenwich.SR1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>

应用程序的名称是spring.application.name在启动时从属性中获取的,因此我们需要提供以下bootstrap.yml文件。

spring: application: name: driver-management

Redis作为消息代理

现在我们可以在基于微服务的体系结构中继续使用Redis的第二个用例 - 消息代理。我们将实现一个典型的异步系统。 微服务trip-management在创建新行程后以及完成当前行程后向Redis Pub / Sub发送通知。通知由订阅特定频道的driver-management和接收 。 我们的应用非常简单。我们只需要添加以下依赖项,以便提供REST API并与Redis Pub / Sub集成。

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>

我们应该使用频道channel名称和发布者注册bean。TripPublisher负责向目标主题发送消息。

@Configuration public class TripConfiguration { @Autowired RedisTemplate<?, ?> redisTemplate; @Bean TripPublisher redisPublisher() { return new TripPublisher(redisTemplate, topic()); } @Bean ChannelTopic topic() { return new ChannelTopic("trips"); } }

TripPublisher使用RedisTemplate将消息发送到的话题。在发送之前,它会使用Jackson2JsonRedisSerializer对来自对象的每条消息转换为JSON字符串。

public class TripPublisher { private static final Logger LOGGER = LoggerFactory.getLogger(TripPublisher.class); RedisTemplate<?, ?> redisTemplate; ChannelTopic topic; public TripPublisher(RedisTemplate<?, ?> redisTemplate, ChannelTopic topic) { this.redisTemplate = redisTemplate; this.redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Trip.class)); this.topic = topic; } public void publish(Trip trip) throws JsonProcessingException { LOGGER.info("Sending: {}", trip); redisTemplate.convertAndSend(topic.getTopic(), trip); } }

我们已经在发布者方面实现了逻辑。现在,我们可以继续在消费接受方面的代码事先。 我们有两个微服务driver-management,passenger-management,它们监听trip-management微服务发送的通知 。我们需要定义RedisMessageListenerContainerbean并设置消息监听器实现类。

@Configuration public class DriverConfiguration { @Autowired RedisConnectionFactory redisConnectionFactory; @Bean RedisMessageListenerContainer container() { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.addMessageListener(messageListener(), topic()); container.setConnectionFactory(redisConnectionFactory); return container; } @Bean MessageListenerAdapter messageListener() { return new MessageListenerAdapter(new DriverSubscriber()); } @Bean ChannelTopic topic() { return new ChannelTopic("trips"); } }

负责处理传入通知的类需要实现该 MessageListener接口。收到消息后, DriverSubscriber将其从JSON反序列化到对象并更改驱动程序的状态。

@Service public class DriverSubscriber implements MessageListener { private final Logger LOGGER = LoggerFactory.getLogger(DriverSubscriber.class); @Autowired DriverRepository repository; ObjectMapper mapper = new ObjectMapper(); @Override public void onMessage(Message message, byte[] bytes) { try { Trip trip = mapper.readValue(message.getBody(), Trip.class); LOGGER.info("Message received: {}", trip.toString()); Optional<Driver> optDriver = repository.findById(trip.getDriverId()); if (optDriver.isPresent()) { Driver driver = optDriver.get(); if (trip.getStatus() == TripStatus.DONE) driver.setStatus(DriverStatus.WAITING); else driver.setStatus(DriverStatus.BUSY); repository.save(driver); } } catch (IOException e) { LOGGER.error("Error reading message", e); } } }

Redis作为主数据库

虽然使用Redis的主要目的是内存中缓存或作为键/值存储,但它也可以充当应用程序的主数据库。在这种情况下,以持久模式运行Redis是值得的。

$ docker run -d --name redis -p 6379:6379 redis redis-server --appendonly yes

实体使用哈希散列操作和mmap结构存储在Redis中。每个实体都需要一个哈希键和id。

@RedisHash("driver") public class Driver { @Id private Long id; private String name; @GeoIndexed private Point location; private DriverStatus status; // setters and getters ... }

幸运的是,Spring Data Redis为Redis集成提供了一个众所周知的存储库模式。要启用它,我们应该使用@EnableRedisRepositories注释配置类或主类。使用Spring存储库模式时,我们不必自己构建对Redis的任何查询。

@Configuration @EnableRedisRepositories public class DriverConfiguration { // logic ... }

使用Spring Data存储库,我们不必构建任何Redis查询,只需遵循Spring Data的约定下的名称方法。为了我们的示例目的,我们可以使用Spring Data中实现的默认方法。这是存储库接口的声明driver-management。

public interface DriverRepository extends CrudRepository<Driver, Long> {}

不要忘记通过使用@EnableRedisRepositories注释主应用程序类或配置类来启用Spring Data存储库。

@Configuration @EnableRedisRepositories public class DriverConfiguration { ... }

结论

正如我在前言中提到的,Redis在微服务架构中有各种用例。我刚刚介绍了如何与Spring Cloud和Spring Data一起使用它来提供配置服务器,消息代理和数据库。Redis通常被认为是缓存存储,但我希望在阅读本文之后,您将改变主意。像往常一样,示例应用程序源代码可以在GitHub上找到:https://github.com/piomin/sample-redis-microservices.git。

Redis在微服务架构中的角色:服务间通信与数据共享 I. 引言 A. 介绍微服务架构的概念和特点 B. 简述Redis的功能和特性,强调其在微服务架构中的应用价值 II. Redis在微服务中的服务间通信 A. 介绍服务间通信的重要性和常见的通信模式 B. 分析如何利用Redis实现服务间的通信,如利用发布/订阅模式实现事件驱动的服务间通信 III. Redis在微服务中的数据共享 A. 介绍数据共享在微服务架构中的重要性 B. 分析如何利用Redis实现服务间的数据共享,如使用Redis作为分布式缓存或者分布式锁 阅读详情

相关推荐

【Redis】壹 —— Redis 介绍

对Redis及其特性和应用场景和服务器高并发分布式结构的演变进行了介绍

2401_86777036的博客 4107

RedisTemplate操作redis

RedisTemplate操作redis

magic_818的博客 1944

微服务架构技巧篇——全局幂等

本文探讨了分布式系统中实现全局幂等的关键技术与设计模式。文章首先阐述了幂等在分布式环境中的必要性,特别是在接口调用和消息传递可能失败的情况下。随后提出全局幂等的核心原理:通过"全局唯一标识+状态控制"确保操作一致性。文中详细介绍了三种主要模式:事务级同步处理模式(适合快速同步场景)、事务级异步处理模式(适合耗时异步操作)和接口级自动幂等(适用于关键业务接口)。在技术实现层面,提出了四种幂等判断手段:数据库唯一索引、Redis SETNX命令、ZooKeeper节点创建和状态机判断,并分析

小志的博客 7001

多线程中redistemplate不执行_Redis在微服务架构中的几种应用场景

本文介绍在SpringCloud中使用Redis作为Pub/Sub异步通信、缓存或主数据库和配置服务器的三种场景应用。Redis可以广泛用于微服务架构。它可能是您应用程序以多种不同方式利用的少数流行软件解决方案之一。根据要求,它可以充当主数据库,缓存或消息代理。虽然它也是一个键/值存储,但我们可以将它用作微服务体系结构中的配置服务器或发现服务器。虽然它通常被定义为内存中的数据结构,但我们也可以在持...

weixin_39993301的博客 469

大模型在心律失常预测及治疗方案制定中的应用研究报告

目录一、引言1.1 研究背景与意义1.2 研究目的与方法1.3 研究创新点二、大模型技术概述2.1 大模型基本原理2.2 常见大模型类型及特点2.3 大模型在医疗领域的应用现状三、心律失常的术前预测与准备3.1 术前心律失常预测的重要性3.2 大模型在术前预测中的应用案例3.3 基于预测结果的术前准备方案四、术中监测与实时调整4.1 术中监测心律失常的方法与技术4.2 大模型辅助术中决策的机制4.3 实时调整手术方案的策略与实践五、术后恢复与并发症风险预测5.1 术后心律失常的监测与评估5.2 大模型预测术

嵌入式毕设/课设资料清单(速查手册·文档模板·题库,持续更新)→ 见最新文章 1599

scDeepCluster_pytorch代码解读与文章理解

论文:Clustering single-cell RNA-seq data with a。

qq_34179307的博客 915

实战:Redis在微服务架构中的应用

1.背景介绍 在微服务架构中,Redis 是一种非常常见的缓存技术,它可以帮助我们解决许多性能和可用性问题。在本文中,我们将深入探讨 Redis 在微服务架构中的应用,包括其核心概念、算法原理、最佳实践以及实际应用场景。 1. 背景介绍 微服务架构是一种分布式系统的设计模式,它将应用程序拆分成多个小型服务,每个服务都负责处理特定的功能。这种架构有助于提高系统的可扩展性、可维护性和可靠性。然而...

AI天才研究院 1556

5、Visual Studio Code:强大的编码与文件管理功能

本文详细介绍了 Visual Studio Code 的强大编码与文件管理功能,涵盖代码导航、引用查找、符号重命名、实时代码分析、IntelliCode 提示、文件和文件夹操作等内容。通过功能对比、流程图和实际开发案例,展示了 VS Code 如何提升开发效率和代码质量,适用于各类编程语言和项目开发场景。

water的专栏 134

一文解决Spring Data Redis两个问题:内存泄露和并发 - europace

前言 我们最近将会话管理从 MongoDB 迁移到了 Redis。迁移本身是由我们使用 MongoDB 的经验推动的,它不能特别好地处理高频率更新和更频繁的读取。另一方面,Redis 被称为经过验证的存储,可以准确处理该用例。 数据库迁移并不总是那么容易,因为我们需要学习其他服务的新模式、最佳实践和怪癖。我们的目标是让我们的 Java 服务层尽可能简单,使其稳定且面向未来:会话管理当然是具有相当稳定功能集的服务之一,并且不会经常触及其代码。因此,对于几年后窥探它的任何人来说,保持它的简单易懂是一个重要方

a1472750149的博客 2919

基于STM32设计的智能手环(ESP8266+华为云IOT)_178

为了满足用户对健康监测的需求,手环项目集成了血氧检测、心率检测、体温检测等功能。这些功能采用了专门的传感器模块,如MAX30102、DS18B20等,确保了测量数据的准确性和可靠性。同时,为了方便用户了解自己的运动情况,项目还加入了行走步数统计功能,通过MPU6050模块实现精确计步。

2405

maxim max96712+max96717调试笔记

mxxim max96712 和max96717调试笔记

libuping2023的博客 1万+

Redis分布式锁在微服务架构中的应用场景

在微服务架构中,Redis分布式锁是协调共享资源访问的关键工具,适用于防止重复操作、资源互斥、任务调度等场景。它能有效提升系统的可靠性和数据一致性,但需合理设计超时和错误处理。实际应用中,结合业务需求选择锁策略,并监控Redis性能,以确保分布式锁高效稳定运行。

aaisjhsgxksgdj的博客 337

Windows2008使用-解决漏洞-CVE-2010-2730

随着硬件的升级,操作系统也逐渐进行了版本更新。目前阶段,Windows2016Server、Windows2022Server逐渐成为了以Windows系列的服务器平台系统。对于有些应用而言,由于其业务的固定,可能仍只能运行在Windows2008Server或者Windows2012Server上。有时候我们为安全需要,需要将相关的操作系统涉及的漏洞做修复。最近碰到在一个Windows2008R2 的操作系统漏洞CVE-2010-2730,一顿操作,终于找到了合适的方案,这里分享给大家。

mystonelxj的博客 2316

redis-faina:微服务架构中的终极Redis查询分析工具

在微服务架构中,Redis作为高性能的内存数据库被广泛应用,但随着服务规模增长,Redis查询效率问题逐渐成为性能瓶颈。redis-faina作为一款强大的Redis查询分析工具,能够通过解析Redis MONITOR命令输出,提供关键的计数器和时序统计数据,帮助开发者快速定位和优化Redis性能问题。 ## 微服务架构下Redis面临的挑战 微服务架构通常包含数十甚至数百个独立服务,每个服务

gitblog_00208的博客 873

第42章:AI代码生成的质量标准——何时用AI、何时自己写

> - AI代码生成的质量分级标准:可用、稳定、安全、优雅 > - 一个决策矩阵:什么场景适合用AI,什么场景必须人工编写 > - 如何评估AI生成的代码质量(复杂度、可读性、安全性) > - 实战对比:同一需求下AI生成代码 vs 人工编写代码 > - 团队落地:将质量标准集成到Code Review和CI流程 > - 我如何将团队AI代码接受率从70%提升到90%

sfishfly的博客 161

OpenClaw实战四|内容创作全流程AI助理:自动撰稿+智能剪辑+多平台发布,一人顶一个内容团队

AI替代的是「写稿、剪辑、发布」这种流水线工作,真正让你解放出来,去做选题、创意、人设、变现这些高价值的事。OpenClaw这套内容创作全流程AI助理,最大的价值不是「帮你发内容」,而是让一个人,拥有一个内容团队的产能。不管是个人博主、小团队,还是企业新媒体,都能用零代码的方式,快速搭建属于自己的自动化内容矩阵。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 591

TS.Microservices:构建高效.NetCore微服务架构的利器

TS.Microservices:构建高效.NetCore微服务架构的利器 项目介绍 TS.Microservices 是一个基于 .NetCore 的微服务框架,旨在帮助开发者快速构建高效、可扩展的微服务应用。该项目不仅提供了丰富的功能模块,还通过简洁的代码结构和强大的扩展性,使得开发者能够轻松应对复杂的业务需求。无论你是微服务架构的新手,还是经验丰富的开发者,TS.Microservices ...

gitblog_01075的博客 701

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Redis在Go微服务中的10大应用场景,你知道几个?

掌握Go Redis整合的10大实战场景,提升微服务性能与响应速度。涵盖缓存、分布式锁、会话存储等高频应用,详解集成方法与优化技巧,助力高并发系统稳定运行,值得收藏。

AlgoChat的博客 1016

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【Redis实战进阶】Redis在微服务架构中的最佳实践

在微服务架构日益流行的今天,Redis凭借其高性能和丰富的数据结构,已成为微服务生态中不可或缺的组件。本文将深入探讨Redis在微服务架构中的多种应用场景,包括分布式会话管理、缓存策略设计、分布式锁实现、消息队列应用等,分享在实际生产环境中的最佳实践和避坑指南。

2301_78262805的博客 486

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

从单机架构到分布式:Redis为何成为架构升级的关键一环?

本文是Redis系列的开篇先导,将采取循序渐进的方式来讲解,不会深入Redis的具体命令和配置,而是聚焦于回答一个根本问题:我们的架构为什么会走到需要Redis这一步?让我们从最初的起点开始...(温馨提示,本文文字内容较多,建议收藏下来反复学习喔)

2301_81073317的博客 1万+

微服务架构中登录Token存储到Redis的实现方案

本文介绍了Redis在微服务架构中的应用与实现。主要内容包括:Redis作为高性能内存数据库的核心特性(数据结构丰富、持久化支持、高可用性);在项目中的典型应用场景(缓存层、会话存储、分布式锁和消息队列);与其他存储系统的对比优势;以及在微服务架构中的重要作用(数据共享、状态管理、限流控制)。文章还提供了Redis配置最佳实践和监控维护建议,并通过具体代码示例展示了JWT令牌生成和Redis存储的实现方法,突出了Redis对提升系统性能、支持高并发的重要价值。

m0_65565490的博客 1141

java微服务中使用redis做缓存技术的应用场景介绍和代码实现

通过上述示例和最佳实践,你可以在Java微服务中有效地使用Redis作为缓存技术,提高系统的性能和响应速度。选择合适的Redis客户端(如Jedis或Lettuce),并结合Spring Data Redis等框架,可以简化Redis的集成和使用。希望这些内容对你有所帮助!

慧香一格的专栏 1265

分布式架构:微服务与Redis实践

📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》、(架构篇)、作者、清华大学出版社签约作家、Java领域优质创作者、优快云博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。

我是Java程序员廖志伟,感谢朋友们的支持!不定期贡献一篇高品质、过万文字、图文并茂且附有视频解说、满载代码示例注释的良心之作,坚决杜绝粗制乱造。 629

滚雪球学Redis[7.4讲]:Redis在分布式系统中的应用:微服务与跨数据中心策略

在上一期【7.3 Redis在排行榜系统中的应用】中,我们探讨了如何利用Redis的Sorted Set数据结构构建一个高效的排行榜系统,并讨论了动态更新与大规模数据下的性能优化方案。通过Redis的轻量级、高性能特点,排行榜系统不仅能实时更新,还能在大数据量下保持查询的高效性。排行榜系统只是Redis众多应用场景之一,Redis的强大之处还体现在分布式系统的应用中。在如今以微服务架构为主导的分布式系统中,Redis不仅能作为缓存,还能承担服务注册配置中心等关键角色。

**My Coding Family** 1578
上一篇: 教你如何使用Spring Boot实现模块化
下一篇: 教会你如何进行JVM内存调优
Java_LingFeng
博客等级 码龄4年 505粉丝 259原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值