小项目的不甘(基于redis的消息队列)

简介: 过往项目涉及到的技术和中间件主要有springboot+mysql+redis等,其中的一个文书的生成环节,涉及到的操作过多(文书生成(从xml->doc->pdf),文书信息入库,模版状态的更改、操作日志记录等等),导致测试在进行压测(50/S,100/S,200/S)的时候,接口执行时间过长🤓,以此进行优化。

一、背景

同样是在海口的项目的文书平台,项目涉及到的技术和中间件主要有springboot+mysql+redis等,其中的一个文书的生成环节,涉及到的操作过多(文书生成(从xml->doc->pdf),文书信息入库,模版状态的更改、操作日志记录等等),导致测试在进行压测(50/S,100/S,200/S)的时候,接口执行时间过长🤓,所以要进行优化。

二、优化路线

对于CRUD的语句优化得不能再优化后,主要耗时的部分在于模版转化文书的过程(从xml->doc->pdf),在确保每条sql执行不会出现异常情况下(除非宕机),将流程拆分为异步处理(主要的削峰)。由于是分布式的情况下,单体应用的队列就不考虑了,所以考虑到的是阿里的RocketMQ,其中的消息顺序消费也是符合需求的。但海口的其它项目组并没有使用到MQ,又不能自己申请一个😫,加上个人不太在项目引入过多的中间件(运维成本和项目风险),现在能使用的也就Redis,而且之前引入Redisson,所以采用了Redisson的消息队列。


三、集成Redisson消息队列

1、引入redisson(跟上篇一样🙄)

<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>版本号</version></dependency>


2、redisson配置

@Configuration@EnableAutoConfigurationpublicclassRedissonConfig {
@Value("${spring.redis.host}")
privateStringhost;
@Value("${spring.redis.port}")
privateStringport;
@Value("${spring.redis.password}")
privateStringpassword;
@BeanpublicRedissonClientgetRedisson() {
Configconfig=newConfig();
config.useSingleServer()
                .setAddress("redis://"+host+":"+port)
                .setTcpNoDelay(true)
                .setConnectTimeout(30000)
                .setSubscriptionsPerConnection(5)
                .setKeepAlive(true)
                .setSubscriptionConnectionPoolSize(50)
                .setPingConnectionInterval(60000);
// 添加主从配置// config.useMasterSlaveServers().setMasterAddress("").setPassword("").addSlaveAddress(new String[]{"",""});returnRedisson.create(config);
    }
}


3、主要代码块

执行器

@Component@Order(3)
publicclassQueueRunnerimplementsCommandLineRunner {
privateExecutorServicequeueThreadPool=newThreadPoolExecutor(4,
8,
1000,
TimeUnit.MILLISECONDS,
newLinkedBlockingDeque<>(8),
newThreadPoolExecutor.CallerRunsPolicy());
@AutowiredQueueHandlerqueueHandler;
@Overridepublicvoidrun(String... args) {
queueThreadPool.execute(queueHandler);
    }
}



监听器

@Getter@Setter@ComponentpublicclassQueueHandlerimplementsRunnable {
@ResourceRedissonClientredissonClient;
@Overridepublicvoidrun() {
// 添加topic监听RTopictopic=redissonClient.getTopic(CommonConstant.REDISSION_SYS_TOPIC, newSerializationCodec());
topic.addListener(SystemMessage.class, (CharSequencecharSequence, SystemMessagereportMessage) -> {
executeTask(reportMessage);
        });
    }
/*** 处理队列信息* 由于队列是异步的,无法获取SessionUtils的用户信息,需要手动回传** @param systemMessage*/privatevoidexecuteTask(SystemMessagesystemMessage) {
switch (systemMessage.getModelEnum()) {
casePARAMS:
// 业务逻辑break;
default:
break;
        }
    }
// 省略。。。}


四、压测结果

经过采用异步处理,文书生成接口通过测试的压测(50/S,100/S,200/S)。


五、没demo,参考资料

https://blog.csdn.net/u011663149/article/details/88855849

https://blog.csdn.net/CharlesYooSky/article/details/101701690

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2月前
|
NoSQL 安全 测试技术
Redis游戏积分排行榜项目中通义灵码的应用实战
Redis游戏积分排行榜项目中通义灵码的应用实战
65 4
|
3月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
85 6
|
26天前
|
NoSQL Java 关系型数据库
Liunx部署java项目Tomcat、Redis、Mysql教程
本文详细介绍了如何在 Linux 服务器上安装和配置 Tomcat、MySQL 和 Redis,并部署 Java 项目。通过这些步骤,您可以搭建一个高效稳定的 Java 应用运行环境。希望本文能为您在实际操作中提供有价值的参考。
119 26
|
2月前
|
NoSQL Java API
springboot项目Redis统计在线用户
通过本文的介绍,您可以在Spring Boot项目中使用Redis实现在线用户统计。通过合理配置Redis和实现用户登录、注销及统计逻辑,您可以高效地管理在线用户。希望本文的详细解释和代码示例能帮助您在实际项目中成功应用这一技术。
49 4
|
4月前
|
消息中间件 存储 NoSQL
剖析 Redis List 消息队列的三种消费线程模型
Redis 列表(List)是一种简单的字符串列表,它的底层实现是一个双向链表。 生产环境,很多公司都将 Redis 列表应用于轻量级消息队列 。这篇文章,我们聊聊如何使用 List 命令实现消息队列的功能以及剖析消费者线程模型 。
110 20
剖析 Redis List 消息队列的三种消费线程模型
|
3月前
|
消息中间件 分布式计算 NoSQL
大数据-41 Redis 类型集合(2) bitmap位操作 geohash空间计算 stream持久化消息队列 Z阶曲线 Base32编码
大数据-41 Redis 类型集合(2) bitmap位操作 geohash空间计算 stream持久化消息队列 Z阶曲线 Base32编码
35 2
|
3月前
|
消息中间件 存储 NoSQL
python 使用redis实现支持优先级的消息队列详细说明和代码
python 使用redis实现支持优先级的消息队列详细说明和代码
55 0
|
3月前
|
存储 NoSQL Java
Spring Boot项目中使用Redis实现接口幂等性的方案
通过上述方法,可以有效地在Spring Boot项目中利用Redis实现接口幂等性,既保证了接口操作的安全性,又提高了系统的可靠性。
68 0
|
消息中间件 NoSQL Go
|
16天前
|
存储 缓存 NoSQL
解决Redis缓存数据类型丢失问题
解决Redis缓存数据类型丢失问题
158 85