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

    源码:

  • 相关阅读:
    继承与多态
    欢迎来到vmax-tam的博客
    MySQL令人咋舌的隐式转换
    MySQL数据库SQL语句(高级进阶二,图文详解)
    深入浅出MySQL之索引为什么要下推?
    【推荐】开源项目ElasticAmbari助力 ElasticSearch、Kibana、ambari服务高效运维管理
    Java集合篇:Map集合的几种遍历方式及性能测试
    大厂Redis高并发场景设计,面试问的都在这!
    第八届“图灵杯”NEUQ-ACM程序设计竞赛(全题解&&详细)
    11个编程接单的网站,你有技术就有收入,有收入就有女朋友《男盆友》
  • 原文地址:https://www.cnblogs.com/liyujava/p/10382041.html
Copyright © 2011-2022 走看看