推荐这款基于Redis的高可用延迟队列,用了都说好,javahashmap底层实现原理

this.timestamp = System.currentTimeMillis();

}

public long getRedPacketId() {

return redPacketId;

}

public long getTimestamp() {

return timestamp;

}

}

代码案例:

/**

  • 红包过期失效 高可用延迟队列

*/

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){

/**

  • 取出失效红包

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

/

RedPacketMessage redPacket = blockingRedPacketQueue.take();

LOGGER.info(“红包ID:{}过期失效”,redPacket.getRedPacketId());

/**

  • 处理相关业务逻辑:记录相关信息并退还剩余红包金额

*/

}

}

}

高可用


主从部署方式:

/**

  • 主从部署方式

*/

Config config = new Config();

config.useMasterSlaveServers()

//设置redis主节点

.setMasterAddress(“redis://192.168.1.120:6379”)

//设置redis从节点

.addSlaveAddress(“redis://192.168.1.130:6379”, “redis://192.168.1.140:6379”);

RedissonClient redisson = Redisson.create(config);

集群部署方式:

/**

  • 集群部署方式

  • cluster方式至少6个节点

  • 3主3从,3主做sharding,3从用来保证主宕机后可以高可用

*/

Config config = new Config();

config.useClusterServers()

.setScanInterval(2000)//集群状态扫描间隔时间,单位是毫秒

.addNodeAddress(“redis://192.168.1.120:6379”)

.addNodeAddress(“redis://192.168.1.130:6379”)

.addNodeAddress(“redis://192.168.1.140:6379”)

.addNodeAddress(“redis://192.168.1.150:6379”)

.addNodeAddress(“redis://192.168.1.160:6379”)

.addNodeAddress(“redis://192.168.1.170:6379”);

RedissonClient redissonClient = Redisson.create(config);

哨兵部署方式:

/**

  • 哨兵部署方式

  • sentinel是采用 Paxos拜占庭协议,一般sentinel至少3个节点

*/

Config config = new Config();

config.useSentinelServers()

.setMasterName(“my-sentinel-name”)

.addSentinelAddress(“redis://192.168.1.120:6379”)

.addSentinelAddress(“redis://192.168.1.130:6379”)

.addSentinelAddress(“redis://192.168.1.140:6379”);

RedissonClient redisson = Redisson.create(config);

云托管部署方式:

/**

  • 云托管部署方式

  • 这种方式主要解决redis提供商为云服务的提供商的redis连接

  • 比如亚马逊云、微软云

*/

config.useReplicatedServers()

//主节点变化扫描间隔时间

.setScanInterval(2000)

.addNodeAddress(“redis://192.168.1.120:6379”)

.addNodeAddress(“redis://192.168.1.130:6379”)

.addNodeAddress(“redis://192.168.1.140:6379”);

RedissonClient redisson = Redisson.create(config);

小结

无论是JDK内置的延迟队列还是基于时间轮算法的队列,都无法保证生产系统的高可用性,而Redisson很好的解决了这个问题。

源码

https://gitee.com/52itstyle/spring-boot-seckill

来源:https://blog.52itstyle.vip/archives/5163/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值