推举阅读:从远程办公到简历被拒,再到斩获阿里offer,这份PDF功不可没
序言之前给大家推举的几款延迟任务处理行列步队,对付一些哀求比较高的场景是无法利用于生产环境的,一旦机器宕机或者运用重启会导致行列步队丢失,从而造成无法挽回的丢失。本日给大家分享一款高可用延迟行列步队 Redisson。
简介Redisson 在基于 NIO 的 Netty 框架上,充分利用了 Redis 键值数据库供应的一系列上风,在 Java 实用工具包中常用接口的根本上,为利用者供应了一系列具有分布式特性的常用工具类。使得原来作为折衷单机多线程并发程序的工具包得到了折衷分布式多机多线程并发系统的能力,大大降落了设计和研发大规模分布式系统的难度。同时结合各富特色的分布式做事,更进一步简化了分布式环境中程序相互之间的协作。
代码案例
框架支持多种 redis 集成支配办法,包括单节点,主从模式,集群模式,哨兵模式等等。
项目pom.xml 引入:
<dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.12.1</version></dependency>
定义红包信息实体类,必须实现序列并定义空布局方法:
/ 红包信息 /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; }}
代码案例:
/ 红包过期失落效 高可用延迟行列步队 /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()); / 处理干系业务逻辑:记录干系信息并退还剩余红包金额 / } }}
高可用
主从支配办法:
/ 主从支配办法 /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/