利用Redis 实现消息队列

简介:

1.用redis中的List可以实现队列,这样可以用来做消息处理和任务调度的队列


2.代码模拟

代码结构


生产者模拟程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/** 
  *  
  */  
package  scheduleTest;  
   
import  java.util.Random;  
import  java.util.UUID;  
   
import  redis.clients.jedis.Jedis;  
   
/** 
  * 模拟一个生产者 
  * <p>Title: TaskProducer</p> 
  * <p>Description: </p> 
  * <p>Company: </p> 
  * @author 夏 杰 
  * @date 2015年12月11日 下午4:26:48 
  * @vesion 1.0 
*/  
public  class  TaskProducer  implements  Runnable{  
     Jedis jedis =  new  Jedis( "120.55.195.177" , 6379 );  
       
     public  void  run() {  
         Random random =  new  Random();  
         while ( true ){  
             try {  
                 Thread.sleep(random.nextInt( 600 ) +  600 );  
                 // 模拟生成一个任务  
                 UUID taskid = UUID.randomUUID();  
                 //将任务插入任务队列:task-queue  
                 jedis.lpush( "task-queue" , taskid.toString());  
                 System.out.println( "插入了一个新的任务: "  + taskid);  
   
             } catch (Exception e){  
                 e.printStackTrace();  
             }  
         }  
           
     }  
   
}


消费者模拟程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/** 
  *  
  */  
package  scheduleTest;  
   
import  java.util.Random;  
   
import  redis.clients.jedis.Jedis;  
   
/** 
  * 模拟消费者 
  * <p>Title: TaskConsumer</p> 
  * <p>Description: </p> 
  * <p>Company: </p> 
  * @author 夏 杰 
  * @date 2015年12月11日 下午4:44:23 
  * @vesion 1.0 
*/  
public  class  TaskConsumer  implements  Runnable {  
     Jedis jedis =  new  Jedis( "120.55.195.177" , 6379 );  
   
     public  void  run() {  
         Random random =  new  Random();  
           
         while ( true ){  
               
             //从任务队列"task-queue"中获取一个任务,并将该任务放入暂存队列"tmp-queue"  
             String taskid = jedis.rpoplpush( "task-queue" "tmp-queue" );  
               
               
             // 处理任务----纯属业务逻辑,模拟一下:睡觉  
             try  {  
                 Thread.sleep( 1000 );  
             catch  (InterruptedException e) {  
                 e.printStackTrace();  
             }  
               
               
             //模拟成功和失败的偶然现象  
             if (random.nextInt( 13 ) %  7  ==  0 ){ // 模拟失败的情况,概率为2/13  
                 //将本次处理失败的任务从暂存队列"tmp-queue"中,弹回任务队列"task-queue"  
                 jedis.rpoplpush( "tmp-queue" "task-queue" );  
                 System.out.println(taskid +  "处理失败,被弹回任务队列" );  
               
             else  { // 模拟成功的情况  
                   
                 // 将本次任务从暂存队列"tmp-queue"中清除  
                 jedis.rpop( "tmp-queue" );  
                 System.out.println(taskid+ "处理成功,被清除" );  
                   
             }     
         }  
                           
     }  
       
   
       
}


调度主程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/** 
  *  
  */  
package  scheduleTest;  
   
/** 
  * <p>Title: TaskShedulerSystem</p> 
  * <p>Description: </p> 
  * <p>Company: </p> 
  * @author 夏 杰 
  * @date 2015年12月11日 下午4:19:09 
  * @vesion 1.0 
*/  
public  class  TaskShedulerSystem {  
     public  static  void  main(String[] args)  throws  Exception {  
           
         // 启动一个生产者线程,模拟任务的产生  
         new  Thread( new  TaskProducer()).start();  
           
         Thread.sleep( 15000 );  
           
         //启动一个线程者线程,模拟任务的处理  
         new  Thread( new  TaskConsumer()).start();  
           
         //主线程休眠  
         Thread.sleep(Long.MAX_VALUE);  
     }  
}


运行结果


插入了一个新的任务: 8025c8b8-f81f-4560-a653-3f339cc371a6

插入了一个新的任务: 98dcf980-10d9-4df6-8765-a4873f6b6a74

插入了一个新的任务: d9636112-4cea-4f49-9f70-88e934aa2a66

插入了一个新的任务: 0a8a2799-d672-4444-b53d-74b679559565

插入了一个新的任务: 3948e29e-0217-434a-b7fe-c3be2f0b1073

插入了一个新的任务: f06c3a03-83a1-4278-a7c8-61d88afcbadf

插入了一个新的任务: fbf7ed91-b1f1-4713-8490-325d77f951b0

插入了一个新的任务: 99cbf0e4-d981-45ad-88f4-10db1604171e

插入了一个新的任务: ca7cd3cf-9ae3-41a1-b8e1-c8ac9a729255

插入了一个新的任务: 3c954253-d195-4185-b27d-390a6e441eaa

插入了一个新的任务: 4b7f2b4d-c77b-4813-9a63-2b6975cb44a1

插入了一个新的任务: 662e0d60-7163-444c-9f1a-43451bb442c3

插入了一个新的任务: d9cca9bd-9870-468d-9beb-f2c3e029c58c

插入了一个新的任务: 7af0318f-7771-4996-99aa-7adb26214f6c

插入了一个新的任务: 7deb7d15-9234-44c8-92d6-53e44b578f6b

插入了一个新的任务: 419a4e25-4343-43f6-bd0e-1f02c6aea19f

插入了一个新的任务: b955ac83-6371-461e-b86b-2a12f45809cc

8025c8b8-f81f-4560-a653-3f339cc371a6处理成功,被清除

插入了一个新的任务: 73218c74-dfd6-46c3-84eb-a14df4a3f7f5

98dcf980-10d9-4df6-8765-a4873f6b6a74处理成功,被清除

插入了一个新的任务: f90f9781-6456-474f-8736-93dc3dcc548f

d9636112-4cea-4f49-9f70-88e934aa2a66处理成功,被清除

插入了一个新的任务: cc499c95-3153-4392-9341-3e7173cbf685

0a8a2799-d672-4444-b53d-74b679559565处理失败,被弹回任务队列

插入了一个新的任务: 437c33ae-8adb-49fd-8aad-9e7a396aa72b

3948e29e-0217-434a-b7fe-c3be2f0b1073处理失败,被弹回任务队列

插入了一个新的任务: dbd99594-0a82-4dee-a481-117e1541c549

f06c3a03-83a1-4278-a7c8-61d88afcbadf处理成功,被清除

插入了一个新的任务: d9900559-a995-49cd-9300-540375c21ea0

fbf7ed91-b1f1-4713-8490-325d77f951b0处理成功,被清除

插入了一个新的任务: 72dd3c9a-0cf7-4dd4-9a8d-378da4a531a1




      本文转自布拉君君 51CTO博客,原文链接:http://blog.51cto.com/5148737/1976868,如需转载请自行联系原作者






相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
30天前
|
消息中间件 NoSQL Java
springboot redis 实现消息队列
springboot redis 实现消息队列
34 1
|
2月前
|
消息中间件 NoSQL Java
Redis List:打造高效消息队列的秘密武器【redis实战 一】
Redis List:打造高效消息队列的秘密武器【redis实战 一】
110 0
|
2月前
|
消息中间件 NoSQL Java
Redis Streams在Spring Boot中的应用:构建可靠的消息队列解决方案【redis实战 二】
Redis Streams在Spring Boot中的应用:构建可靠的消息队列解决方案【redis实战 二】
187 1
|
5天前
|
消息中间件 缓存 NoSQL
Redis stream 用做消息队列完美吗
Redis Stream 是 Redis 5.0 版本中引入的一种新的数据结构,它用于实现简单但功能强大的消息传递模式。 这篇文章,我们聊聊 Redis Stream 基本用法 ,以及如何在 SpringBoot 项目中应用 Redis Stream 。
Redis stream 用做消息队列完美吗
|
1月前
|
消息中间件 存储 缓存
【Redis实战】有MQ为啥不用?用Redis作消息队列!?Redis作消息队列使用方法及底层原理高级进阶
【Redis实战】有MQ为啥不用?用Redis作消息队列!?Redis作消息队列使用方法及底层原理高级进阶
|
1月前
|
消息中间件 存储 监控
RabbitMQ:分布式系统中的高效消息队列
RabbitMQ:分布式系统中的高效消息队列
|
6月前
|
消息中间件 存储 网络协议
企业实战(11)消息队列之Docker安装部署RabbitMQ实战
企业实战(11)消息队列之Docker安装部署RabbitMQ实战
118 0
|
1月前
|
消息中间件 Java
springboot整合消息队列——RabbitMQ
springboot整合消息队列——RabbitMQ
74 0
|
3月前
|
消息中间件 JSON Java
RabbitMQ消息队列
RabbitMQ消息队列
45 0