mirror of
https://gitee.com/52itstyle/spring-boot-seckill.git
synced 2025-12-30 10:22:26 +00:00
:sparkles:基于 redisson 的高可用延迟队列
This commit is contained in:
@@ -1,10 +1,11 @@
|
||||
package com.itstyle.seckill.distributedlock.redis;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import org.redisson.api.RLock;
|
||||
import org.redisson.api.RMapCache;
|
||||
import org.redisson.api.RedissonClient;
|
||||
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* redis分布式锁帮助类
|
||||
* @author 科帮网 By https://blog.52itstyle.com
|
||||
|
||||
@@ -4,7 +4,6 @@ import org.apache.commons.lang3.StringUtils;
|
||||
import org.redisson.Redisson;
|
||||
import org.redisson.api.RedissonClient;
|
||||
import org.redisson.config.Config;
|
||||
//import org.redisson.config.SentinelServersConfig;
|
||||
import org.redisson.config.SingleServerConfig;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
||||
@@ -34,7 +33,7 @@ public class RedissonAutoConfiguration {
|
||||
// .setTimeout(redssionProperties.getTimeout())
|
||||
// .setMasterConnectionPoolSize(redssionProperties.getMasterConnectionPoolSize())
|
||||
// .setSlaveConnectionPoolSize(redssionProperties.getSlaveConnectionPoolSize());
|
||||
//
|
||||
//
|
||||
// if(StringUtils.isNotBlank(redssionProperties.getPassword())) {
|
||||
// serverConfig.setPassword(redssionProperties.getPassword());
|
||||
// }
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
package com.itstyle.seckill.queue.delay.redis;
|
||||
|
||||
import org.redisson.Redisson;
|
||||
import org.redisson.api.RBlockingQueue;
|
||||
import org.redisson.api.RDelayedQueue;
|
||||
import org.redisson.api.RedissonClient;
|
||||
import org.redisson.config.Config;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* 红包过期失效 高可用延迟队列
|
||||
* https://blog.52itstyle.vip/archives/5163/
|
||||
*/
|
||||
public class RedPacketDelayQueue {
|
||||
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(RedPacketDelayQueue.class);
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
Config config = new Config();
|
||||
config.useSingleServer().setAddress("redis://127.0.0.1:6379")
|
||||
.setPassword("123456").setDatabase(2);
|
||||
RedissonClient redissonClient = Redisson.create(config);
|
||||
|
||||
/**
|
||||
* 红包目标队列
|
||||
*/
|
||||
RBlockingQueue<RedPacketMessage> blockingRedPacketQueue
|
||||
= redissonClient.getBlockingQueue("redPacketDelayQueue");
|
||||
/**
|
||||
* 定时任务将到期的元素转移到目标队列
|
||||
*/
|
||||
RDelayedQueue<RedPacketMessage> delayedRedPacketQueue
|
||||
= redissonClient.getDelayedQueue(blockingRedPacketQueue);
|
||||
|
||||
/**
|
||||
* 延时信息入队列
|
||||
*/
|
||||
delayedRedPacketQueue.offer(new RedPacketMessage(20200113), 3, TimeUnit.SECONDS);
|
||||
delayedRedPacketQueue.offer(new RedPacketMessage(20200114), 5, TimeUnit.SECONDS);
|
||||
delayedRedPacketQueue.offer(new RedPacketMessage(20200115), 10, TimeUnit.SECONDS);
|
||||
|
||||
while (true){
|
||||
/**
|
||||
* 取出失效红包
|
||||
*/
|
||||
RedPacketMessage redPacket = blockingRedPacketQueue.take();
|
||||
LOGGER.info("红包ID:{}过期失效",redPacket.getRedPacketId());
|
||||
/**
|
||||
* 处理相关业务逻辑:记录相关信息并退还剩余红包金额
|
||||
*/
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
package com.itstyle.seckill.queue.delay.redis;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.time.Instant;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.ZoneId;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.concurrent.Delayed;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* 红包队列消息
|
||||
*/
|
||||
public class RedPacketMessage implements Serializable {
|
||||
|
||||
/**
|
||||
* 红包 ID
|
||||
*/
|
||||
private long redPacketId;
|
||||
|
||||
/**
|
||||
* 创建时间戳
|
||||
*/
|
||||
private long timestamp;
|
||||
|
||||
public RedPacketMessage() {
|
||||
|
||||
}
|
||||
|
||||
public RedPacketMessage(long redPacketId) {
|
||||
this.redPacketId = redPacketId;
|
||||
this.timestamp = System.currentTimeMillis();
|
||||
}
|
||||
|
||||
public long getRedPacketId() {
|
||||
return redPacketId;
|
||||
}
|
||||
|
||||
public long getTimestamp() {
|
||||
return timestamp;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user