From 945a8bab5d15d6fcc1c96c589014ce6dff0df75f Mon Sep 17 00:00:00 2001 From: meowrain Date: Sun, 27 Jul 2025 22:51:13 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0Redisson=E5=BB=B6?= =?UTF-8?q?=E6=97=B6=E9=98=9F=E5=88=97=E5=92=8C=E6=A8=A1=E6=9D=BF=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E6=A8=A1=E5=BC=8F=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit docs: 更新BigDecimal高精度计算文档分类 --- public/api/i/2025/07/27/qllmzm-1.webp | Bin 0 -> 28884 bytes public/api/i/2025/07/27/qne5sq-1.webp | Bin 0 -> 13212 bytes public/api/i/2025/07/27/qp4v65-1.webp | Bin 0 -> 14496 bytes .../posts/Java/BigDecimal高精度计算.md | 2 +- .../中间件/Redis/Redisson延时队列架构.md | 173 ++++++++++++ src/content/posts/设计模式/模板方法模式.md | 264 ++++++++++++++++++ 6 files changed, 438 insertions(+), 1 deletion(-) create mode 100644 public/api/i/2025/07/27/qllmzm-1.webp create mode 100644 public/api/i/2025/07/27/qne5sq-1.webp create mode 100644 public/api/i/2025/07/27/qp4v65-1.webp create mode 100644 src/content/posts/中间件/Redis/Redisson延时队列架构.md create mode 100644 src/content/posts/设计模式/模板方法模式.md diff --git a/public/api/i/2025/07/27/qllmzm-1.webp b/public/api/i/2025/07/27/qllmzm-1.webp new file mode 100644 index 0000000000000000000000000000000000000000..b8f86ab7e50edbe8e0d9fb20fdbdb258bc89f78f GIT binary patch literal 28884 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 literal 0 HcmV?d00001 diff --git a/public/api/i/2025/07/27/qp4v65-1.webp b/public/api/i/2025/07/27/qp4v65-1.webp new file mode 100644 index 0000000000000000000000000000000000000000..cc873950f2749cdca7c8020b3f7534639554788e GIT binary patch literal 14496 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 j^RF=mkT?FA`Stv1 面试' +category: 'Java > 面试题' draft: false lang: '' --- diff --git a/src/content/posts/中间件/Redis/Redisson延时队列架构.md b/src/content/posts/中间件/Redis/Redisson延时队列架构.md new file mode 100644 index 0000000..e3dd50c --- /dev/null +++ b/src/content/posts/中间件/Redis/Redisson延时队列架构.md @@ -0,0 +1,173 @@ +--- +title: Redisson延时队列架构 +published: 2025-07-27 +description: '' +image: '' +tags: ['Redis','Redisson','延时队列'] +category: '中间件 > Redis' +draft: false +lang: '' +--- + +延时队列是一种特殊的消息队列,消息在发送后不会立即被消费,而是等待指定的时间后才被消费者处理。就像设置了一个"闹钟",到时间才响。 + +# 阻塞队列 RBlockingDeque - 阻塞双端队列 +特点: +- 双端: 可以从两端插入和取出元素 +- 阻塞: 当队列为空的时候,取元素会阻塞等待 +- 线程安全: 多个线程可以安全操作 + + +```java +// 特点: +// - 双端:可以从两端插入和取出元素 +// - 阻塞:当队列为空时,取元素会阻塞等待 +// - 线程安全:多个线程可以安全操作 + +RBlockingDeque deque = redissonClient.getBlockingDeque("myDeque"); +deque.offerFirst("头部元素"); +deque.offerLast("尾部元素"); +String element = deque.takeFirst(); // 阻塞获取 + +``` + +# RDelayedQueue - 延时队列 + +特点: +- 自动延时:消息在指定时间后自动变为可消费状态 +- 精确控制:可以精确控制每个消息的延时时间 +- Redis实现:基于Redis的有序集合(ZSet)实现 + +```java + +RDelayedQueue delayedQueue = redissonClient.getDelayedQueue(deque); +delayedQueue.offer("消息内容", 30, TimeUnit.SECONDS); // 30秒后可消费 +``` + +## 完整实现示例 + +### 生产者端(消息发送) +```java +@Service +public class DelayQueueProducer { + + @Autowired + private RedissonClient redissonClient; + + public void sendDelayedMessage(String message, long delaySeconds) { + try { + // 创建队列 + RBlockingDeque blockingDeque = redissonClient + .getBlockingDeque("DELAY_QUEUE_EXAMPLE"); + RDelayedQueue delayedQueue = redissonClient + .getDelayedQueue(blockingDeque); + + // 发送延时消息 + delayedQueue.offer(message, delaySeconds, TimeUnit.SECONDS); + + System.out.println("发送延时消息: " + message + + ", 延时: " + delaySeconds + "秒"); + } catch (Exception e) { + log.error("发送延时消息失败", e); + } + } +} +``` + +### 消费者端(消息处理) +```java +@Component +public class DelayQueueConsumer { + + @Autowired + private RedissonClient redissonClient; + + @PostConstruct + public void startConsumer() { + // 启动独立线程消费延时消息 + new Thread(this::consumeMessages, "DelayQueueConsumer").start(); + } + + private void consumeMessages() { + try { + RBlockingDeque blockingDeque = redissonClient + .getBlockingDeque("DELAY_QUEUE_EXAMPLE"); + + while (!Thread.currentThread().isInterrupted()) { + // 阻塞获取消息(自动等待延时到期) + String message = blockingDeque.take(); + System.out.println("消费延时消息: " + message); + + // 处理业务逻辑 + processMessage(message); + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + log.info("消费者线程被中断"); + } catch (Exception e) { + log.error("消费消息异常", e); + } + } + + private void processMessage(String message) { + // 实际的业务处理逻辑 + System.out.println("处理业务消息: " + message); + } +} +``` + + +## 底层实现原理 + +### Redis数据结构使用 +```bash +# Redisson使用以下数据结构: +# 1. 有序集合(ZSet) - 存储延时消息和到期时间 +ZADD delay_queue 1640995200 "message1" # 到期时间戳作为score + +# 2. 列表(List) - 存储已到期可消费的消息 +LPUSH ready_queue "message1" + +# 3. 定时任务 - 定期检查到期消息 +# Redisson内部使用定时任务扫描ZSet,将到期消息移动到List +``` + +### 延时检查机制 +```java +// Redisson内部逻辑(简化版) +public class DelayedQueueChecker { + public void checkExpiredMessages() { + long now = System.currentTimeMillis(); + + // 从有序集合中获取已到期的消息 + Set expiredMessages = redisTemplate + .opsForZSet() + .rangeByScore("delay_queue", 0, now); + + for (String message : expiredMessages) { + // 移动到可消费队列 + redisTemplate.opsForList().leftPush("ready_queue", message); + redisTemplate.opsForZSet().remove("delay_queue", message); + } + } +} +``` +## 使用场景 + +```java +// 1. 订单超时处理 +public void handleOrderTimeout(String orderId) { + delayedQueue.offer(orderId, 30, TimeUnit.MINUTES); +} + +// 2. 优惠券到期提醒 +public void couponExpireReminder(String couponId) { + delayedQueue.offer(couponId, 24, TimeUnit.HOURS); +} + +// 3. 消息重试机制 +public void messageRetry(String messageId) { + delayedQueue.offer(messageId, 5, TimeUnit.SECONDS); // 5秒后重试 +} +``` + diff --git a/src/content/posts/设计模式/模板方法模式.md b/src/content/posts/设计模式/模板方法模式.md new file mode 100644 index 0000000..3c98918 --- /dev/null +++ b/src/content/posts/设计模式/模板方法模式.md @@ -0,0 +1,264 @@ +--- +title: 模板方法模式 +published: 2025-07-27 +description: '' +image: '' +tags: [策略模式, 设计模式] +category: '设计模式' +draft: false +lang: '' +--- + +# 介绍 +![](https://blog.meowrain.cn/api/i/2025/07/27/qllmzm-1.webp) +对原理类图的说明: +AbstractClass 抽象类, 类中实现了模板方法(template),定义了算法的骨架,具体子类需要去实现 其它的抽象方法 +ConcreteClass 具体类, 实现了抽象类中的抽象方法 + +也就是父类模板方法定义不变的流程,子类重写流程中的方法。 + +![](https://blog.meowrain.cn/api/i/2025/07/27/qne5sq-1.webp) + +# ①、AbstractClass 抽象模板 + +## 一、基本方法 + +上面的 baseOperation() 或者 customOperation() 方法,也叫基本操作,是由子类实现的方法,并且在模板方法中被调用。 + + 基本方法尽量设计为protected类型, 符合迪米特法则, 不需要暴露的属性或方法尽量不要设置为protected类型。 实现类若非必要, 尽量不要扩大父类中的访权限。 +## 二、模板方法 + +上面的 templateMethod() 方法,可以有一个或者几个,实现对基本方法的调度,完成固定的逻辑。 + + 为了防止恶意操作,通常模板方法都加上 final 关键字,不允许覆写。 + ![](https://blog.meowrain.cn/api/i/2025/07/27/qp4v65-1.webp) + +# ②、ConcreteClass 具体模板 + +实现父类定义的一个或多个抽象方法,也就是父类定义的基本方法在子类中得以实现。 +# 应用 +这个设计模式我们可以拿来做mq的发送和封装 + +我们在抽象模板中实现通用的`sendMessage方法`,在具体模板中实现具体的消息构建和封装发送逻辑。 + +## 定义消息发送事件基础扩充属性实体 +```java +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public final class BaseSendExtendDTO { + + /** + * 事件名称 + */ + private String eventName; + + /** + * 主题 + */ + private String topic; + + /** + * 标签 + */ + private String tag; + + /** + * 业务标识 + */ + private String keys; + + /** + * 发送消息超时时间 + */ + private Long sentTimeout; + + /** + * 具体延迟时间 + */ + private Long delayTime; +} + +``` + + +我们这样定义抽象模板: `AbstractCommonSendProduceTemplate` + + +## 抽象模板 +```java +/** + * RocketMQ 抽象公共发送消息组件 + */ +@RequiredArgsConstructor +@Slf4j(topic = "CommonSendProduceTemplate") +public abstract class AbstractCommonSendProduceTemplate { + + private final RocketMQTemplate rocketMQTemplate; + + /** + * 构建消息发送事件基础扩充属性实体 + * + * @param messageSendEvent 消息发送事件 + * @return 扩充属性实体 + */ + protected abstract BaseSendExtendDTO buildBaseSendExtendParam(T messageSendEvent); + + /** + * 构建消息基本参数,请求头、Keys... + * + * @param messageSendEvent 消息发送事件 + * @param requestParam 扩充属性实体 + * @return 消息基本参数 + */ + protected abstract Message buildMessage(T messageSendEvent, BaseSendExtendDTO requestParam); + + /** + * 消息事件通用发送 + * + * @param messageSendEvent 消息发送事件 + * @return 消息发送返回结果 + */ + public SendResult sendMessage(T messageSendEvent) { + BaseSendExtendDTO baseSendExtendDTO = buildBaseSendExtendParam(messageSendEvent); + SendResult sendResult; + try { + // 构建 Topic 目标落点 formats: `topicName:tags` + StringBuilder destinationBuilder = StrUtil.builder().append(baseSendExtendDTO.getTopic()); + if (StrUtil.isNotBlank(baseSendExtendDTO.getTag())) { + destinationBuilder.append(":").append(baseSendExtendDTO.getTag()); + } + + // 延迟时间不为空,发送任意延迟消息,否则发送普通消息 + if (baseSendExtendDTO.getDelayTime() != null) { + sendResult = rocketMQTemplate.syncSendDeliverTimeMills( + destinationBuilder.toString(), + buildMessage(messageSendEvent, baseSendExtendDTO), + baseSendExtendDTO.getDelayTime() + ); + } else { + sendResult = rocketMQTemplate.syncSend( + destinationBuilder.toString(), + buildMessage(messageSendEvent, baseSendExtendDTO), + baseSendExtendDTO.getSentTimeout() + ); + } + + log.info("[生产者] {} - 发送结果:{},消息ID:{},消息Keys:{}", baseSendExtendDTO.getEventName(), sendResult.getSendStatus(), sendResult.getMsgId(), baseSendExtendDTO.getKeys()); + } catch (Throwable ex) { + log.error("[生产者] {} - 消息发送失败,消息体:{}", baseSendExtendDTO.getEventName(), JSON.toJSONString(messageSendEvent), ex); + throw ex; + } + + return sendResult; + } +} + +``` + +# 具体模板 + +这里举个例子,我们做一个短信通知的,定义MessageNotifyEvent + +```java +@Slf4j +@Component +public class SmsNotificationProducer extends AbstractCommonSendProduceTemplate { + + private final ConfigurableEnvironment environment; + + public SmsNotificationProducer(@Autowired RocketMQTemplate rocketMQTemplate, @Autowired ConfigurableEnvironment environment) { + super(rocketMQTemplate); + this.environment = environment; + } + + @Override + protected BaseSendExtendDTO buildBaseSendExtendParam(MessageNotifyEvent messageSendEvent) { + return BaseSendExtendDTO.builder() + .eventName("短信通知发送") + .keys(String.valueOf(messageSendEvent.getNotificationId())) + .topic(environment.resolvePlaceholders(MerchantAdminRocketMQConstant.SMS_NOTIFICATION_TOPIC_KEY)) + .sentTimeout(3000L) + .build(); + } + + @Override + protected Message buildMessage(MessageNotifyEvent messageSendEvent, BaseSendExtendDTO requestParam) { + String keys = StrUtil.isEmpty(requestParam.getKeys()) ? UUID.randomUUID().toString() : requestParam.getKeys(); + return MessageBuilder + .withPayload(new MessageWrapper(keys, messageSendEvent)) + .setHeader(MessageConst.PROPERTY_KEYS, keys) + .setHeader(MessageConst.PROPERTY_TAGS, requestParam.getTag()) + .build(); + } +} +``` + +## 补充说明 + +为了使上述示例能够完整运行,还需要定义以下类: + +1. `MessageNotifyEvent` - 短信通知事件类: + +```java +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class MessageNotifyEvent { + private Long notificationId; + private String phoneNumber; + private String messageContent; + private String sender; +} +``` + +2. `MessageWrapper` - 消息包装类: + +```java +@Data +@NoArgsConstructor +@AllArgsConstructor +public class MessageWrapper { + private String key; + private Object payload; + + public MessageWrapper(String key, Object payload) { + this.key = key; + this.payload = payload; + } +} +``` + +3. `SmsNotificationConsumer` - 短信通知消费者类: + +```java +@Slf4j +@Component +@RocketMQMessageListener( + topic = MerchantAdminRocketMQConstant.SMS_NOTIFICATION_TOPIC_KEY, + consumerGroup = MerchantAdminRocketMQConstant.SMS_NOTIFICATION_CONSUMER_GROUP +) +public class SmsNotificationConsumer implements RocketMQListener { + + @Override + public void onMessage(MessageWrapper messageWrapper) { + MessageNotifyEvent event = (MessageNotifyEvent) messageWrapper.getPayload(); + log.info("[短信消费者] 收到短信通知消息 - ID: {}, 手机号: {}, 内容: {}, 发送者: {}", + event.getNotificationId(), + event.getPhoneNumber(), + event.getMessageContent(), + event.getSender()); + + // 模拟发送短信 + System.out.println("[短信服务] 向 " + event.getPhoneNumber() + " 发送短信: " + event.getMessageContent()); + } +} +``` + +通过以上完整的代码示例,我们可以看到模板方法模式在MQ消息发送场景中的应用: +- `AbstractCommonSendProduceTemplate` 定义了消息发送的通用流程(模板方法) +- `SmsNotificationProducer` 实现了具体的业务逻辑(构建参数和消息) +- `SmsNotificationConsumer` 监听消息并处理 +- 这样既保证了消息发送流程的一致性,又允许不同业务场景自定义具体实现 \ No newline at end of file