利用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,如需转载请自行联系原作者






相关文章
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
342 6
|
消息中间件 存储 NoSQL
剖析 Redis List 消息队列的三种消费线程模型
Redis 列表(List)是一种简单的字符串列表,它的底层实现是一个双向链表。 生产环境,很多公司都将 Redis 列表应用于轻量级消息队列 。这篇文章,我们聊聊如何使用 List 命令实现消息队列的功能以及剖析消费者线程模型 。
剖析 Redis List 消息队列的三种消费线程模型
|
消息中间件 分布式计算 NoSQL
大数据-41 Redis 类型集合(2) bitmap位操作 geohash空间计算 stream持久化消息队列 Z阶曲线 Base32编码
大数据-41 Redis 类型集合(2) bitmap位操作 geohash空间计算 stream持久化消息队列 Z阶曲线 Base32编码
236 2
|
消息中间件 存储 NoSQL
python 使用redis实现支持优先级的消息队列详细说明和代码
python 使用redis实现支持优先级的消息队列详细说明和代码
348 0
|
消息中间件 NoSQL Redis
Redis Stream消息队列之基本语法与使用方式
这篇文章详细介绍了Redis Stream消息队列的基本语法和使用方式,包括消息的添加、读取、删除、修剪以及消费者组的使用和管理,强调了其在消息持久化和主备复制方面的优势。
791 0
|
消息中间件 NoSQL Redis
Redis 消息队列介绍
Redis的消息队列使用简单,没有什么配置,比ActiveMQ要轻量级太多,当然功能也比较简单,如果只需要简单的订阅以及发布,可以考虑使用它。 **订阅操作** 命令为:subscribe [channel] [channel] ..,如【代码1】所示,即成功订阅频道[redis.blog]。 **发布操作** 命令为publish [channel] [message],
4583 0
|
12月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
7月前
|
缓存 负载均衡 监控
135_负载均衡:Redis缓存 - 提高缓存命中率的配置与最佳实践
在现代大型语言模型(LLM)部署架构中,缓存系统扮演着至关重要的角色。随着LLM应用规模的不断扩大和用户需求的持续增长,如何构建高效、可靠的缓存架构成为系统性能优化的核心挑战。Redis作为业界领先的内存数据库,因其高性能、丰富的数据结构和灵活的配置选项,已成为LLM部署中首选的缓存解决方案。
754 25
|
12月前
|
缓存 NoSQL Java
Redis+Caffeine构建高性能二级缓存
大家好,我是摘星。今天为大家带来的是Redis+Caffeine构建高性能二级缓存,废话不多说直接开始~
1532 0
|
8月前
|
存储 缓存 NoSQL
Redis专题-实战篇二-商户查询缓存
本文介绍了缓存的基本概念、应用场景及实现方式,涵盖Redis缓存设计、缓存更新策略、缓存穿透问题及其解决方案。重点讲解了缓存空对象与布隆过滤器的使用,并通过代码示例演示了商铺查询的缓存优化实践。
343 1
Redis专题-实战篇二-商户查询缓存