diff --git a/src/main/java/com/itstyle/seckill/distributedlock/redis/RedissLockUtil.java b/src/main/java/com/itstyle/seckill/distributedlock/redis/RedissLockUtil.java index c505e8c..3715e18 100644 --- a/src/main/java/com/itstyle/seckill/distributedlock/redis/RedissLockUtil.java +++ b/src/main/java/com/itstyle/seckill/distributedlock/redis/RedissLockUtil.java @@ -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 diff --git a/src/main/java/com/itstyle/seckill/distributedlock/redis/RedissonAutoConfiguration.java b/src/main/java/com/itstyle/seckill/distributedlock/redis/RedissonAutoConfiguration.java index 691752d..e9127cd 100644 --- a/src/main/java/com/itstyle/seckill/distributedlock/redis/RedissonAutoConfiguration.java +++ b/src/main/java/com/itstyle/seckill/distributedlock/redis/RedissonAutoConfiguration.java @@ -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()); // } diff --git a/src/main/java/com/itstyle/seckill/queue/delay/redis/RedPacketDelayQueue.java b/src/main/java/com/itstyle/seckill/queue/delay/redis/RedPacketDelayQueue.java new file mode 100644 index 0000000..5f63f26 --- /dev/null +++ b/src/main/java/com/itstyle/seckill/queue/delay/redis/RedPacketDelayQueue.java @@ -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 blockingRedPacketQueue + = redissonClient.getBlockingQueue("redPacketDelayQueue"); + /** + * 定时任务将到期的元素转移到目标队列 + */ + RDelayedQueue 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()); + /** + * 处理相关业务逻辑:记录相关信息并退还剩余红包金额 + */ + } + } +} + + diff --git a/src/main/java/com/itstyle/seckill/queue/delay/redis/RedPacketMessage.java b/src/main/java/com/itstyle/seckill/queue/delay/redis/RedPacketMessage.java new file mode 100644 index 0000000..22b82e1 --- /dev/null +++ b/src/main/java/com/itstyle/seckill/queue/delay/redis/RedPacketMessage.java @@ -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; + } + +}