【Excel_To_DB】SpringBoot+EasyPoi+Redis消息队列实现Excel批量异步导入数据库(二)

【Excel_To_DB】SpringBoot+EasyPoi+Redis消息队列实现Excel批量异步导入数据库(一)
【Excel_To_DB】SpringBoot+EasyPoi+Redis消息队列实现Excel批量异步导入数据库(二)
【Excel_To_DB】SpringBoot+EasyPoi+Redis消息队列实现Excel批量异步导入数据库(三)
【效果演示】:JavaWeb毕业设计项目-足球队管理系统(四)引入Excel_To_DB项目+源码
【码云地址】:https://gitee.com/ydc_coding

Redis实现消息队列:
环境依赖:

        <!-- redis -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!-- fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.38</version>
        </dependency>

这里写图片描述
说明:这里我通过使用fastjson将bean转换成String(也就是json字符串),存入redis中,而没有选择用谷歌的Protostuff,虽然效率上有所降低,但Protostuff序列化后的数据存入redis中,不具备可读性。用更好的可读性换那一块效率,我觉得在当前这个业务环境中更合适一些。
另一个使用Protostuff的Demo:【redis-demo】使用Jedis api 实现后端缓存优化

redis数据库配置:

#redis
# Redis服务器地址
spring.redis.host=127.0.0.1
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=666666
# Redis数据库索引(默认为0)
spring.redis.database=0
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=2000
#spring-session 使用

消息接收者:

package com.ydc.excel_to_db.redis;

import com.ydc.excel_to_db.domain.ExcelModel;
import com.ydc.excel_to_db.service.ImportService;
import com.ydc.excel_to_db.util.Constant;
import com.ydc.excel_to_db.util.JsonUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @Description: 消息接收者,将其在ExcelToDbApplication.java中注入消息监听容器(MessageListenerAdapter)中
 * @Author: 杨东川【http://blog.csdn.net/yangdongchuan1995】
 * @Date: Created in  2018-2-6
 */
@Service
public class Receiver {
   
    @Autowired
    ImportService importService;
    @Autowired
    RedisDao redisDao;
    private static final Logger log = LoggerFactory.getLogger(Receiver.class);

    /**
     * @Description: 用于接收单个对象,将对象同步至数据库,如果同步失败,则存入redis中
     * @Param: [message] “fastjson”转换后的json字符串
     * @Retrun: void
     */
    public void receiveSingle(String message) throws InterruptedException {
        // 将json字符串转换成实体对象
        ExcelModel excelModel = JsonUtil.stringToBean(message, ExcelModel.class);
        // 尝试同步数据库并返回同步结果
        boolean result = importService.save(excelModel);
        if (!result)
            // 同步失败,将其存入redis中
            redisDao.leftPushKey(Constant.failToDBKey, excelModel);
        else
            // 同步成功,输出至日志中
            log.info("成功插入数据库的数据:" + excelModel.getCol2());
        // 加上-1,其实也就是做减1操作
        redisDao.incrOrDecr(Constant.succSizeTempKey, -1);

    }

    /**
     * @Description: 用于接收对象集合,将集合遍历拆分成单个对象并进行发布
     * @Param: [message] “fastjson”转换后的json字符串
     * @Retrun: void
     */
    public void receiveList(String message) throws InterruptedException {
        // 将json字符串转换成对象集合
        List<ExcelModel> list = JsonUtil.stringToList(message, ExcelModel.class);
        // 遍历集合,并依次将其发布
        for (ExcelModel excelModel : list) {
            redisDao.publish(Constant.receiveSingle, excelModel);
        }
    }
}

配置消息监听器:

package com.ydc.excel_to_db;

import com.ydc.excel_to_db
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis消息队列是指利用Redis实现的一种基于发布/订阅模式的消息传递机制。它可以实现异步处理任务,提高系统性能并且可以扩展到分布式系统中。下面进行详细讲解。 ## 一、Redis消息队列的原理 Redis消息队列实现原理是利用Redis的发布/订阅机制,通过将消息发送者称为“发布者”,将消息接收者称为“订阅者”,实现消息的传递和处理。 在Redis消息队列中,发布者将消息发布到一个频道中,订阅者从该频道中获取消息,完成相应的处理。具体流程如下: 1. 发布者将消息发布到指定频道中。 2. 订阅者向Redis服务器订阅指定频道的消息。 3. Redis服务器将频道中的消息推送给所有订阅该频道的订阅者。 4. 订阅者接收到消息后,执行相应的操作。 ## Redis消息队列的应用 1. 异步任务处理 当需要执行耗时的任务时,可以使用Redis消息队列实现异步处理,将任务放入队列中,由消费者进行处理,从而避免阻塞主线程,提高系统性能。 2. 实时消息推送 当需要向多个客户端实时推送消息时,可以使用Redis消息队列实现,将消息发布到指定频道中,订阅该频道的客户端即可接收到消息。 3. 日志处理 当需要将日志记录到文件或者数据库中时,可以使用Redis消息队列实现,将日志信息放入队列中,由消费者进行处理,从而提高系统性能。 ## 三、Redis消息队列的代码实现 Python代码实现Redis消息队列: ```python import redis class RedisQueue(object): def __init__(self, queue_name, redis_host='localhost', redis_port=6379): """ 初始化Redis连接 """ self.redis_conn = redis.StrictRedis(host=redis_host, port=redis_port, db=0) self.queue_name = queue_name def put(self, data): """ 将数据放入队列 """ self.redis_conn.rpush(self.queue_name, data) def get(self, block=True, timeout=None): """ 从队列中获取数据 """ if block: data = self.redis_conn.blpop(self.queue_name, timeout=timeout) else: data = self.redis_conn.lpop(self.queue_name) if data: return data.decode('utf-8') else: return None ``` 其中,put方法将数据放入队列,get方法从队列中获取数据。 使用示例: ```python queue = RedisQueue('test_queue') queue.put('hello world') data = queue.get() print(data) ``` 以上就是Redis消息队列的详细讲解和代码实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值