转:https://blog.csdn.net/qq_42175986/article/details/88576849

pom.xml

<!-- redis依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<!-- redis依赖 -->

application.yml

spring:
application:
name: yys-redismq
redis:
host: 127.0.0.1
port:
password:
pool:
max-active:
max-idle:
min-idle:
max-wait:
timeout:
database: server:
port:
tomcat:
uri-encoding: UTF-

RedisConfig.java

package com.yys.demo.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import redis.clients.jedis.JedisPoolConfig; /**
* 描述:redis配置类
* @author yys
* @date 2019.03.15
*/
@Configuration
public class RedisConfig { /** redis 服务器地址 */
@Value("${spring.redis.host}")
private String host; /** redis 端口号 */
@Value("${spring.redis.port}")
private int port; /** redis 服务器密码 */
@Value("${spring.redis.password}")
private String password; /** redis 连接池最大连接数(使用负值无限制) */
@Value("${spring.redis.pool.max-active}")
private int maxActive; /** redis 连接池最大空闲数 */
@Value("${spring.redis.pool.max-idle}")
private int maxIdle; /** redis 连接池小空闲数 */
@Value("${spring.redis.pool.min-idle}")
private int minIdle; /** redis 连接池最大阻塞等待时间(负值无限制) */
@Value("${spring.redis.pool.max-wait}")
private int maxWait; /** redis 数据库索引(默认0) */
@Value("${spring.redis.database}")
private int database; /** redis 超时时间 */
@Value("${spring.redis.timeout}")
private int timeout; @Bean
public JedisPoolConfig getRedisConfig(){
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(maxActive);
config.setMaxIdle(maxIdle);
config.setMinIdle(minIdle);
config.setMaxWaitMillis(maxWait);
return config;
} @Bean
public JedisConnectionFactory getConnectionFactory() {
JedisConnectionFactory factory = new JedisConnectionFactory();
factory.setHostName(host);
factory.setPort(port);
factory.setPassword(password);
factory.setDatabase(database);
JedisPoolConfig config = getRedisConfig();
factory.setPoolConfig(config);
return factory;
} @Bean
public RedisTemplate<?, ?> getRedisTemplate() {
JedisConnectionFactory factory = getConnectionFactory();
RedisTemplate<?, ?> redisTemplate = new StringRedisTemplate(factory);
return redisTemplate;
} }

RedisClient.java

package com.yys.demo.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils; import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit; /**
* 描述:redis工具类(本配置类只有redis消息队列相关命令方法)
* @author yys
* @date 2019.03.15
*/
@Component
public class RedisClient { @Autowired
private RedisTemplate<String, Object> redisTemplate; /** ---------------------------------- redis消息队列 ---------------------------------- */
/**
* 存值
* @param key 键
* @param value 值
* @return
*/
public boolean lpush(String key, Object value) {
try {
redisTemplate.opsForList().leftPush(key, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
} /**
* 取值 - <rpop:非阻塞式>
* @param key 键
* @return
*/
public Object rpop(String key) {
try {
return redisTemplate.opsForList().rightPop(key);
} catch (Exception e) {
e.printStackTrace();
return null;
}
} /**
* 取值 - <brpop:阻塞式> - 推荐使用
* @param key 键
* @param timeout 超时时间
* @param timeUnit 给定单元粒度的时间段
* TimeUnit.DAYS //天
* TimeUnit.HOURS //小时
* TimeUnit.MINUTES //分钟
* TimeUnit.SECONDS //秒
* TimeUnit.MILLISECONDS //毫秒
* @return
*/
public Object brpop(String key, long timeout, TimeUnit timeUnit) {
try {
return redisTemplate.opsForList().rightPop(key, timeout, TimeUnit.SECONDS);
} catch (Exception e) {
e.printStackTrace();
return null;
}
} /**
* 查看值
* @param key 键
* @param start 开始
* @param end 结束 0 到 -1代表所有值
* @return
*/
public List<Object> lrange(String key, long start, long end) {
try {
return redisTemplate.opsForList().range(key, start, end);
} catch (Exception e) {
e.printStackTrace();
return null;
}
} /** ---------------------------------- redis消息队列 ---------------------------------- */ }

RedisProducerController.java

package com.yys.demo.controller;

import com.yys.demo.config.RedisClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import java.util.Arrays;
import java.util.List; /**
* 描述:生产者(消息发送方)
* @author yys
* @date 2019.03.15
*/
@RestController
@RequestMapping("/producer")
public class RedisProducerController { @Autowired
RedisClient redisClient; /** 公共配置 */
private final static String SUCCESS = "success";
private final static String MESSAGE = "testmq";
private static final List<String> list; static {
list = Arrays.asList(new String[]{"猿医生", "CD", "yys"});
} /**
* 消息发送API
* @return
*/
@RequestMapping("/sendMessage")
public String sendMessage() {
for (String message : list) {
redisClient.lpush(MESSAGE, message);
}
return SUCCESS;
} }

RedisConsumerController.java

package com.yys.demo.controller;

import com.yys.demo.config.RedisClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import java.util.concurrent.TimeUnit; /**
* 描述:消费者(消息接收方)
* @author yys
* @date 2019.03.15
*/
@RestController
@RequestMapping("/consumer")
public class RedisConsumerController { @Autowired
RedisClient redisClient; /** 公共配置 */
private final static String MESSAGE = "testmq"; /**
* 接收消息API
* @return
*/
@RequestMapping("/receiveMessage")
public String sendMessage() {
return (String) redisClient.brpop(MESSAGE, 0, TimeUnit.SECONDS);
} }

注:批量消费消息例子如下

package com.cashloan.analytics.controller;

import com.cashloan.analytics.model.DcProjectCount;
import com.cashloan.analytics.utils.RedisQueue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit; @RestController
@RequestMapping("/test")
public class Test {
@Autowired
private RedisQueue redisQueue; /** 公共配置 */
private final static String MESSAGE = "testmq"; @RequestMapping("/send")
public String sendMessage(String[] strs) {
List<String> str = Arrays.asList(strs);
for (String msg : str) {
DcProjectCount dcProjectCount = new DcProjectCount();
dcProjectCount.setId(Long.valueOf(msg));
redisQueue.lpush(MESSAGE, dcProjectCount);
}
return "1";
} @GetMapping("/see")
public List<Object> see() {
List<Object> lrange = redisQueue.lrange(MESSAGE, 0, -1);
return lrange;
} @GetMapping("/get")
public Object get() {
List<Object> lrange = redisQueue.lrange(MESSAGE, 0, -1);
int size = lrange.size();
System.out.println("size:" + size);
if (size >= 10) {
List<DcProjectCount> dcProjectCounts = new ArrayList<>();
for (int i = 0; i < size; i++) {
Object brpop = redisQueue.brpop(MESSAGE, 0, TimeUnit.SECONDS);
if (brpop != null) {
dcProjectCounts.add((DcProjectCount) brpop);
}
}
for (DcProjectCount dcProjectCount : dcProjectCounts) {
System.out.println(dcProjectCount.getId());
}
}
return "true";
}
}

DcProjectCount类只要设置private Long id并添加set、get方法即可!

redis实现消息队列-java代码实现的更多相关文章

  1. Redis 做消息队列

    一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式.利用redis这两种场景的消息队列都能够实现.定义: 生产者消费者模式:生产者生产消息放到队列里,多个消费者同时监听队列, ...

  2. Redis除了做缓存--Redis做消息队列/Redis做分布式锁/Redis做接口限流

    1.用Redis实现消息队列 用命令lpush入队,rpop出队 Long size = jedis.lpush("QueueName", message);//返回存放的数据条数 ...

  3. Redis作为消息队列服务场景应用案例

    NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例   一.消息队列场景简介 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更 ...

  4. Lumen开发:结合Redis实现消息队列(1)

    1.简介 Lumen队列服务为各种不同的后台队列提供了统一的API.队列允许你推迟耗时任务(例如发送邮件)的执行,从而大幅提高web请求速度. 1.1 配置 .env文件的QUEUE_DRIVER选项 ...

  5. 程序员过关斩将--redis做消息队列,香吗?

    Redis消息队列 在程序员这个圈子打拼了太多年,见过太多的程序员使用redis,其中一部分喜欢把redis做缓存(cache)使用,其中最典型的当属存储用户session,除此之外,把redis作为 ...

  6. redis resque消息队列

    Resque 目前正在学习使用resque .resque-scheduler来发布异步任务和定时任务,为了方便以后查阅,所以记录一下. resque和resque-scheduler其优点在于功能比 ...

  7. 【springboot】【redis】springboot+redis实现发布订阅功能,实现redis的消息队列的功能

    springboot+redis实现发布订阅功能,实现redis的消息队列的功能 参考:https://www.cnblogs.com/cx987514451/p/9529611.html 思考一个问 ...

  8. 【Redis】php+redis实现消息队列

    在项目中使用消息队列一般是有如下几个原因: 把瞬间服务器的请求处理换成异步处理,缓解服务器的压力 实现数据顺序排列获取 redis实现消息队列步骤如下: 1).redis函数rpush,lpop 2) ...

  9. sping+redis实现消息队列的乱码问题

    使用spring支持redis实现消息队列,参考官方样例:https://spring.io/guides/gs/messaging-redis/ 实现后在运行过程中发现消费者在接收消息时会出现乱码的 ...

随机推荐

  1. 三天精通Vue--学前摘要

    Vue Vue是一个前端框架,中文学习教程https://cn.vuejs.org/v2/guide/components.html 学习的前提:一点的 HTML+CSS+js node.js是前端的 ...

  2. 对称加密与非对称加密,及Hash算法

    一 , 概述 在现代密码学诞生以前,就已经有很多的加密方法了.例如,最古老的斯巴达加密棒,广泛应用于公元前7世纪的古希腊.16世纪意大利数学家卡尔达诺发明的栅格密码,基于单表代换的凯撒密码.猪圈密码, ...

  3. Nginx通过geo模式实现限速白名单和全局负载均衡 - 运维笔记

    Nginx的geo模块不仅可以有限速白名单的作用,还可以做全局负载均衡,可以要根据客户端ip访问到不同的server.比如,可以将电信的用户访问定向到电信服务器,网通的用户重 定向到网通服务器”,从而 ...

  4. IDEA中,使用maven-可视化-下载jar包的source和javadoc

    需求:想看jar包的源码和文档注释 操作:在Idea的右侧Maven窗口,选中一个Module,然后展开Dependencies|,选中一个依赖包,按住鼠标右键单击,选择Download Source ...

  5. BBC micro:bit引脚介绍

    另外两个大引脚(3V和GND)是非常不同的! 注意 标记为3V和GND的引脚与电路板的电源相关,千万不要连接在一起. 电源输入:如果BBC micro:bit由USB或电池供电,则可以使用3V引脚作为 ...

  6. [转帖]k8s 基本使用(下)

    k8s 基本使用(下) https://www.jianshu.com/p/116ce601a60f 如果你没有看过上篇的话,推荐阅读完 k8s 基本使用(上)后再阅读本篇内容. kubectl cr ...

  7. IDEA中Tomcat部署时war和war exploded区别

    原理说明 war模式:将WEB工程以包的形式上传到服务器 :war exploded模式:将WEB工程以当前文件夹的位置关系上传到服务器: 含义解释 war模式这种可以称之为是发布模式,看名字也知道, ...

  8. Linux crond任务调度(定时任务),Linux磁盘分区/挂载

    一.crond任务调度 1.基本语法 crontab [选项] -e : 编辑 crontab定时任务 -l : 查询crontab -r : 删除当前用户所有的crontab任务 例子: 每分钟执行 ...

  9. Ubuntu 18 Kubernetes集群的安装和部署 以及Helm的安装

    首先说一下我的环境, 我是在windows 10 上面建了一个ubuntu18的虚拟机,同时由于某些原因 不受网络限制, 所以安装比较顺利. Install 1.安装并启用 Docker  sudo ...

  10. 微信小程序路径表达式解析规则

    小程序 setData 方法支持路径表达式来设置属性,例如 setData({"x.y.z": 1}). 微信官方没有公布路径表达式的语法规则及解析规则,本文所描述的路径表达式解析 ...