理想论坛_专业20年的财经股票炒股论坛交流社区 - 股票论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2865|回复: 0

Redis之上的分布式Java队列

[复制链接]

9650

主题

9650

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
28966
发表于 2019-12-27 11:16 | 显示全部楼层 |阅读模式
近来进修的势头大涨,码了很多干货。分享给大家参考进修!

经过优锐课的java进修笔记中,了解到关于让我们利用Redisson Java框架会商六种不同典范的基于Redis的散布式行列。

1、在Redis中利用行列

Redis是一个功用强大的工具,支持从字符串和列表到映照和流的很多不同典范的数据结构。 开辟职员将Redis用于多种方针,包含用于数据库,缓存和消息代理。
像任何消息代理一样,Redis需要以正确的次第发送消息。 可以按照消息的年龄或某些其他预界说的优先级品级发送消息。
为了存储这些未决消息,Redis开辟职员需要行列数据结构。 Redisson是利用Redis和Java举行散布式编程的框架,它供给了很多散布式数据结构(包含行列)的实现。
Redisson经过供给Java API使Redis开辟加倍轻易。 Redisson不需要开辟职员进修Redis命令,而是包含全数众所周知的Java接口,例如Queue和BlockingQueue。 Redisson还处置惩罚Redis中烦琐的幕后工作,例如毗连治理,故障转移处置惩罚和数据序列化。
2、基于Redis的散布式Java行列

Redisson供给了Java中底子行列数据结构的多个基于Redis的实现,每种实现都有差此外功用。 这使你可以挑选最适当你方针的行列典范。
下面,我们将利用Redisson Java框架会商六种不同典范的基于Redis的散布式行列。
3、行列

Redisson中的RQueue工具实现了java.util.Queue接口。 行列用于需要从最早的最早的元素起头处置惩罚(也称为“先辈先出”或FIFO)的情况。
与平常Java一样,可以利用peek()方式检查RQueue的第一个元素,大要利用poll()方式检查和删除RQueue的第一个元素:
  1. 1 RQueue queue = redisson.getQueue("anyQueue");2 3 queue.add(new SomeObject());4 5 SomeObject obj = queue.peek();6 7 SomeObject someObj = queue.poll();
复制代码

4、阻塞行列

Redisson中的RBlockingQueue工具实现了java.util.BlockingQueue接口。
BlockingQueues是阻塞线程的行列,这些线程试图从空行列及第行轮询,大要试图在已满的行列中插入元素。 该线程将被阻塞,直到另一个线程将一个元素插入到空行列中,或从完整行列中轮询第一个元素为止。
下面的示例代码演示了RBlockingQueue的正确切例化和利用。 出格是,你可以利用参数指定工具将等待线程变得可用的时候来挪用poll()方式:
  1. 1 RBlockingQueue queue = redisson.getBlockingQueue("anyQueue");2 3 queue.offer(new SomeObject());4 5 SomeObject obj = queue.peek();6 7 SomeObject someObj = queue.poll();8 9 SomeObject ob = queue.poll(10, TimeUnit.MINUTES);
复制代码

在故障转移或重新毗连到Redis办事器的进程中,将自动重新预订poll(),pollFromAny(),pollLastAndOfferFirstTo()和take()Java方式。
5、BoundedBlockingQueue

Redisson中的RBoundedBlockingQueue工具实现了有界的阻塞行列结构。 有界阻塞行列是容量已受限制(即有限)的阻塞行列。
以下代码演示了怎样在Redisson中实例化和利用RBoundedBlockingQueue。 trySetCapacity()方式用于尝试设备阻塞行列的容量。 trySetCapacity()返回布尔值“ true”或“ false”,这取决因而否乐成设备了容量或能否已经设备了容量:
  1. 1 RBoundedBlockingQueue queue = redisson.getBoundedBlockingQueue("anyQueue"); 2  3 queue.trySetCapacity(2); 4  5 queue.offer(new SomeObject(1)); 6  7 queue.offer(new SomeObject(2)); 8  9 // will be blocked until free space available in queue10 11 queue.put(new SomeObject());12 13 SomeObject obj = queue.peek();14 15 SomeObject someObj = queue.poll();16 17 SomeObject ob = queue.poll(10, TimeUnit.MINUTES);
复制代码

6、迟误排队

Redisson中的RDelayedQueue工具答应你在Redis中实现迟误行列。 当利用诸如指数抵偿的计谋将消息转达给消耗者时,这大要会很有用。 每次尝试发送邮件失利后,重试之间的时候将成倍增加。
在与元素一路指定的迟误以后,迟误行列中的每个元素将被转移到方针行列。 此方针行列可所以实现RQueue接口的任何行列,例如RBlockingQueue或RBoundedBlockingQueue。
  1. 1 RQueue destinationQueue = redisson.getQueue("anyQueue"); 2  3 RDelayedQueue delayedQueue = getDelayedQueue(destinationQueue); 4  5 // move object to destinationQueue in 10 seconds 6  7 delayedQueue.offer("msg1", 10, TimeUnit.SECONDS); 8  9 // move object to destinationQueue in 1 minute10 11 delayedQueue.offer("msg2", 1, TimeUnit.MINUTES);
复制代码

在不再需要行列以后,经过利用destroy()方式烧毁迟误的行列是一个好主张。 可是,假如要封闭Redisson,则没有必要。
7、PriorityQueue
Redisson中的RPriorityQueue工具实现了java.util.Queue接口。 优先级行列能否是按元素的利用期限而是依照与每个元素关连联的优先级排序的行列。
以下面的示例代码所示,RPriorityQueue利用比力器对行列中的元素举行排序:
  1. 1 RPriorityQueue queue = redisson.getPriorityQueue("anyQueue"); 2  3 queue.trySetComparator(new MyComparator()); // set object comparator 4  5 queue.add(3); 6  7 queue.add(1); 8  9 queue.add(2);10 11 queue.removeAsync(0);12 13 queue.addAsync(5);14 15 queue.poll();
复制代码

8、PriorityBlockingQueue

Redisson中的RPriorityBlockingQueue工具团结了RPriorityQueue和RBlockingQueue的功用。 与RPriorityQueue一样,RPriorityBlockingQueue也利用Comparator对行列中的元素举行排序。
  1. 1 RPriorityBlockingQueue queue = redisson.getPriorityBlockingQueue("anyQueue"); 2  3 queue.trySetComparator(new MyComparator()); // set object comparator 4  5 queue.add(3); 6  7 queue.add(1); 8  9 queue.add(2);10 11 queue.removeAsync(0);12 13 queue.addAsync(5);14 15 queue.take();
复制代码

在故障转移或重新毗连到Redis办事器的进程中,将自动重新预订poll(),pollLastAndOfferFirstTo()和take()Java方式。
文章分享到这里,若有不够之处,接待补充批评!
抽丝剥茧,细说架构那些事!

免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|理想论坛_专业20年的财经股票炒股论坛交流社区 - 股票论坛

GMT+8, 2020-7-7 08:31 , Processed in 0.152475 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表