redis实现消息队列-java代码实现
转: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代码实现的更多相关文章
- Redis 做消息队列
一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式.利用redis这两种场景的消息队列都能够实现.定义: 生产者消费者模式:生产者生产消息放到队列里,多个消费者同时监听队列, ...
- Redis除了做缓存--Redis做消息队列/Redis做分布式锁/Redis做接口限流
1.用Redis实现消息队列 用命令lpush入队,rpop出队 Long size = jedis.lpush("QueueName", message);//返回存放的数据条数 ...
- Redis作为消息队列服务场景应用案例
NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例 一.消息队列场景简介 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更 ...
- Lumen开发:结合Redis实现消息队列(1)
1.简介 Lumen队列服务为各种不同的后台队列提供了统一的API.队列允许你推迟耗时任务(例如发送邮件)的执行,从而大幅提高web请求速度. 1.1 配置 .env文件的QUEUE_DRIVER选项 ...
- 程序员过关斩将--redis做消息队列,香吗?
Redis消息队列 在程序员这个圈子打拼了太多年,见过太多的程序员使用redis,其中一部分喜欢把redis做缓存(cache)使用,其中最典型的当属存储用户session,除此之外,把redis作为 ...
- redis resque消息队列
Resque 目前正在学习使用resque .resque-scheduler来发布异步任务和定时任务,为了方便以后查阅,所以记录一下. resque和resque-scheduler其优点在于功能比 ...
- 【springboot】【redis】springboot+redis实现发布订阅功能,实现redis的消息队列的功能
springboot+redis实现发布订阅功能,实现redis的消息队列的功能 参考:https://www.cnblogs.com/cx987514451/p/9529611.html 思考一个问 ...
- 【Redis】php+redis实现消息队列
在项目中使用消息队列一般是有如下几个原因: 把瞬间服务器的请求处理换成异步处理,缓解服务器的压力 实现数据顺序排列获取 redis实现消息队列步骤如下: 1).redis函数rpush,lpop 2) ...
- sping+redis实现消息队列的乱码问题
使用spring支持redis实现消息队列,参考官方样例:https://spring.io/guides/gs/messaging-redis/ 实现后在运行过程中发现消费者在接收消息时会出现乱码的 ...
随机推荐
- PyTorch学习之六个学习率调整策略
PyTorch学习率调整策略通过torch.optim.lr_scheduler接口实现.PyTorch提供的学习率调整策略分为三大类,分别是 有序调整:等间隔调整(Step),按需调整学习率(Mul ...
- 安装kafka + zookeeper集群
系统:centos 7.4 要求:jdk :1.8.x kafka_2.11-1.1.0 1.绑定/etc/hosts 10.10.10.xxx online-ops-xxx-0110.10 ...
- es 内存占用优化
对6.3: 修改Elasticsearch中JVM配置文件jvm.options: Dlog4j2.enable.threadlocals=false 注: 本文主要针对ES 2.x. “该给ES分配 ...
- ORM之Dapper
ORM之Dapper 一.下载安装: nuget 搜索dapper安装 二.使用: 三.优缺点: 优点: 1.开源.轻量.单文件(代码就一个SqlMapper.cs文件,编译后就40K的一个很小的Dl ...
- 【神经网络与深度学习】chainer边运行边定义的方法使构建深度学习网络变的灵活简单
Chainer是一个专门为高效研究和开发深度学习算法而设计的开源框架. 这篇博文会通过一些例子简要地介绍一下Chainer,同时把它与其他一些框架做比较,比如Caffe.Theano.Torch和Te ...
- hive 批量添加,删除分区
一.批量添加分区: use bigdata; alter table siebel_member add if not exists partition(dt='20180401') locati ...
- Maven 教程(4)— 新建Maven项目
原文地址:https://blog.csdn.net/liupeifeng3514/article/details/79542203 我们以简单的helloworld来作为入门的实例,有些人说掌握了h ...
- [教程]K8Cscan调用外部程序(Win/Linux批量上控/执行多条命令/保存结果)
0x000 调用原理 Cscan调用外部程序有两种方式,一是编写DLL,二是配置文件 编写DLL文件对于不懂编程的人来说可能会很难(虽然支持各语言) 由于考虑到很多人不会编程或会编程又急用无法短时间转 ...
- 使用Clion优雅的完全远程自动同步和远程调试c++
摘要:在linux上用vim写C++的时候,通常用gdb进行调试,不能随心所欲的看代码和跳转代码以及加watch(也有可能是因为我还没有get正确的使用方法).为此我发现Clion可以做到自动同步本场 ...
- 【题解】Palindrome pairs [Codeforces159D]
[题解]Palindrome pairs [Codeforces159D] 传送门:\(Palindrome\) \(pairs\) \([CF159D]\) [题目描述] 给定一个长度为 \(N\) ...