利用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
目录
打赏
0
0
0
0
347
分享
相关文章
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
96 6
剖析 Redis List 消息队列的三种消费线程模型
Redis 列表(List)是一种简单的字符串列表,它的底层实现是一个双向链表。 生产环境,很多公司都将 Redis 列表应用于轻量级消息队列 。这篇文章,我们聊聊如何使用 List 命令实现消息队列的功能以及剖析消费者线程模型 。
127 20
剖析 Redis List 消息队列的三种消费线程模型
大数据-41 Redis 类型集合(2) bitmap位操作 geohash空间计算 stream持久化消息队列 Z阶曲线 Base32编码
大数据-41 Redis 类型集合(2) bitmap位操作 geohash空间计算 stream持久化消息队列 Z阶曲线 Base32编码
43 2
python 使用redis实现支持优先级的消息队列详细说明和代码
python 使用redis实现支持优先级的消息队列详细说明和代码
62 0
Redis Stream消息队列之基本语法与使用方式
这篇文章详细介绍了Redis Stream消息队列的基本语法和使用方式,包括消息的添加、读取、删除、修剪以及消费者组的使用和管理,强调了其在消息持久化和主备复制方面的优势。
98 0
解决Redis缓存数据类型丢失问题
解决Redis缓存数据类型丢失问题
180 85
云端问道21期方案教学-应对高并发,利用云数据库 Tair(兼容 Redis®*)缓存实现极速响应
云端问道21期方案教学-应对高并发,利用云数据库 Tair(兼容 Redis®*)缓存实现极速响应
云端问道21期实操教学-应对高并发,利用云数据库 Tair(兼容 Redis®)缓存实现极速响应
本文介绍了如何通过云端问道21期实操教学,利用云数据库 Tair(兼容 Redis®)缓存实现高并发场景下的极速响应。主要内容分为四部分:方案概览、部署准备、一键部署和完成及清理。方案概览中,展示了如何使用 Redis 提升业务性能,降低响应时间;部署准备介绍了账号注册与充值步骤;一键部署详细讲解了创建 ECS、RDS 和 Redis 实例的过程;最后,通过对比测试验证了 Redis 缓存的有效性,并指导用户清理资源以避免额外费用。
Redis经典问题:缓存穿透
本文详细探讨了分布式系统和缓存应用中的经典问题——缓存穿透。缓存穿透是指用户请求的数据在缓存和数据库中都不存在,导致大量请求直接落到数据库上,可能引发数据库崩溃或性能下降。文章介绍了几种有效的解决方案,包括接口层增加校验、缓存空值、使用布隆过滤器、优化数据库查询以及加强监控报警机制。通过这些方法,可以有效缓解缓存穿透对系统的影响,提升系统的稳定性和性能。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等