1. 队列
//发布
@ApiOperation(value = "put 普通队列")
@PostMapping("/queuePut")
public Object put(@RequestBody CommonMapRespDTO respDTO) {
for (int i = 0; i < 20; i++) {
//队列
RQueue<Object> queue = redissonClient.getQueue(TopicConstant.normanQueueName);
//队列满 返回异常
queue.add(respDTO.getValue());
}
return "OK";
}
//消费
private void queueTest() {
ExecutorServiceCasche.EXECUTOR.execute(() -> {
//阻塞队列
RQueue<Object> queue = redissonClient.getQueue(TopicConstant.normanQueueName);
while (true) {
//如果为空则等待
Object object = queue.poll();
if (object == null) {
//50微妙
ThreadUtil.sleep(50, TimeUnit.MILLISECONDS);
continue;
}
System.out.println(Thread.currentThread().getName() + "读取到的值:" + object);
}
});
}
2. 阻塞队列
//发布数据
@ApiOperation(value = "put 阻塞队列")
@PostMapping("/blockingQueuePut")
public Object blockingQueue(@RequestBody CommonMapRespDTO respDTO) throws InterruptedException {
for (int i = 0; i < 20; i++) {
//阻塞队列
RBlockingQueue<Object> rBlockingQueue = redissonClient.getBlockingQueue(queueName);
rBlockingQueue.put(respDTO.getValue());
}
return "OK";
}
//消费
private void blockQueueTest() {
ExecutorServiceCasche.EXECUTOR.execute(() -> {
//阻塞队列
RBlockingQueue<Object> rBlockingQueue = redissonClient.getBlockingQueue(
RedissionController.queueName);
while (true) {
Object object = null;
try {
object = rBlockingQueue.take();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "读取到的值:" + object);
}
});
}
3. 延迟队列
//发布
@ApiOperation(value = "delayedQueue 延时队列")
@PostMapping("/delayedQueue")
public Object delayedQueue(@RequestBody CommonMapRespDTO respDTO) {
Random random = new Random();
for (int i = 0; i < 20; i++) {
//基于redis发送变更通知
RBlockingQueue<Object> rBlockingQueue = redissonClient.getBlockingQueue(TopicConstant.delayedQueueName);
RDelayedQueue<Object> queue = redissonClient.getDelayedQueue(rBlockingQueue);
Integer temp = random.nextInt(20);
queue.offer(temp, temp, TimeUnit.SECONDS);
}
return "OK";
}
//消费
private void delayQueue() {
ExecutorServiceCasche.EXECUTOR.execute(() -> {
//阻塞队列
RBlockingDeque<Object> blockingDeque = redissonClient
.getBlockingDeque(TopicConstant.delayedQueueName);
RDelayedQueue<Object> queue = redissonClient.getDelayedQueue(blockingDeque);
while (true) {
Object object = null;
try {
object = blockingDeque.take();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "读取到的值:" + object);
}
});
}
4. 发布订阅
//发送
@ApiOperation(value = "topic 发布订阅模式")
@PostMapping("/topic")
public Object topic(@RequestBody CommonMapRespDTO respDTO) {
for (int i = 0; i < 20; i++) {
//基于redis发送变更通知
RTopic topic = redissonClient.getTopic(TopicConstant.DICT_CHANGE_TOPIC);
topic.publish("change");
}
return "OK";
}
//消费
private void dictDataChangelistener() {
//小代码变更 topic 发布订阅模式
RTopic rTopic = redissonClient.getTopic(TopicConstant.DICT_CHANGE_TOPIC);
rTopic.addListener(String.class, new MessageListener<String>() {
@Override
public void onMessage(CharSequence charSequence, String s) {
try {
String key = charSequence.toString();
//单线程更新
System.out.println(Thread.currentThread().getName() + "==>收到通知:" + key);
} catch (Exception e) {
log.error("==>同步小代码异常", e);
}
}
});
}
5. 发布订阅不会进行数据的持久化、队列都会进行数据的持久化