Spring-data-redis实现消息队列的demo(附源码)

 

一、概述

      1.开发任务:基于spring-date-redis的Redis的操作实例。

      2.开发周期: 4天。

      3.成果:     开发了生产者/消费者模式的消息队列。

二、实施方案

      1.使用SpringMVC,Spring-data-redis框架。

2.工程结构如下:

 

 

三、技术原理

1.spring-data-redis的使用流程

 

 

2.RedisTemplate常用API

1.opsForValue()  这个连接内可以做多个操作,不针对某个key

2.boundValue()  针对这个key的多个操作

3.消息生产者:

 1     //重写run方法
 2     @Override
 3     public void run() {
 4         try {
 5             this.product();    //生产消息方法
 6         } catch (Exception e) {
 7             e.printStackTrace();
 8         }
 9     }
10     
11     //PostConstruct注解可以在Spring容器启动后自动运行该方法
12     @PostConstruct
13     public void init() {       
14         this.start();    //启动生产者线程       
15     }
16     
17     //生产消息
18     public void product() throws InterruptedException {        
19         int i = 0;
20         
21         Random random = new Random();
22         int max = 6000;
23         int min = 4000;
24         int dms = random.nextInt(max-min+1) + min;    //线程睡眠随机数
25         
26         redisTemplate.delete("msg");    //清除遗留数据
27         
28         while(true) {
29             messageEntity.setMessage("{消息"+i+"}");
30             redisTemplate.opsForList().leftPush("msg",messageEntity);    //消息入队列
31             System.out.println("生产了:"+messageEntity.getMessage());
32             
33             this.sleep(dms);
34             i++;
35         }
36 
37     }

4.消费者1号(2号代码相似):

    //重写run方法
    @Override
    public void run() {
        try {
            this.consume();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    //PostConstruct注解可以在Spring容器启动后自动运行该方法
    @PostConstruct
    public void init() {       
        this.start();     //启动消费者线程       
    }

    public void consume() throws InterruptedException {
        
        Random random = new Random();
        int max = 15000;
        int min = 8000;
        int dms = random.nextInt(max-min+1) + min;    //线程睡眠随机数
        
        while(true) {
                if((messageEntity = redisTemplate.opsForList().rightPop("msg")) !=null ) {    //消息出队列,检查是否为空
                    System.out.print("消费者1号消费:");
                    System.out.println(messageEntity.getMessage());
                }else {
                    System.out.println("消费者1号: 队列里没消息了");
                }
                this.sleep(dms);
        }
    }

5.消息实体类:

public class MessageEntity implements Serializable {
    
    private String id;
    private String message;
    
    public String getId() {
        return id;
    }
    
    public void setId(String id) {
        this.id = id;
    }
    
    public String getMessage() {
        return message;
    }
    
    public void setMessage(String name) {
        this.message = name;
    }    

}

 

四、成果展示

1.运行效果:

 

 

五、总结

       Redis性能不错, 本次只是简单用了操作API和消息队列的实现, 还没有体会到更强大之处,期待以后能用到其强大的功能。

源码:

posted @ 2019-05-14 22:42  煮一杯Java  阅读(1571)  评论(0编辑  收藏  举报