:sparkles:基于 redisson 的高可用延迟队列

This commit is contained in:
小柒2012
2020-02-15 12:48:36 +08:00
parent e4205c4ad1
commit e891b33277
4 changed files with 103 additions and 3 deletions

View File

@@ -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

View File

@@ -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());
// }

View File

@@ -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());
/**
* 处理相关业务逻辑:记录相关信息并退还剩余红包金额
*/
}
}
}

View File

@@ -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;
}
}