zoukankan      html  css  js  c++  java
  • 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和消息队列的实现, 还没有体会到更强大之处,期待以后能用到其强大的功能。

    源码:

  • 相关阅读:
    我的WCF之旅(1):创建一个简单的WCF程序
    网页设计中颜色的搭配
    CSS HACK:全面兼容IE6/IE7/IE8/FF的CSS HACK
    UVa 1326 Jurassic Remains
    UVa 10340 All in All
    UVa 673 Parentheses Balance
    UVa 442 Matrix Chain Multiplication
    UVa 10970 Big Chocolate
    UVa 679 Dropping Balls
    UVa 133 The Dole Queue
  • 原文地址:https://www.cnblogs.com/liyujava/p/10382041.html
Copyright © 2011-2022 走看看