redistemplate 批量读取_RedisTemplate实现消息队列并且批量插入数据。

本文介绍了如何使用SpringBoot的RedisTemplate组件构建一个基于Redis的消息队列,用于缓解数据库压力并实现日志的批量处理。通过RedisConfig配置RedisTemplate,创建消息实体Message,使用观察者模式管理订阅者,以及实现Redis的发布者和消费者。最后展示了如何在业务场景中批量插入数据,例如注册日志处理。
摘要由CSDN通过智能技术生成

早期由于生产环境业务量小。所以日志是一条一条commit的。运行也没出过问题。

后来随着业务扩大并发量上来后,日志写入因为频繁与数据库打交道导致数据库连接池经常占满,直至程序崩溃。

因为日志并非需要实时响应。所以考虑改用异步+批量提交的方式。

为了缓解jvm内存压力。采用redis做消息队列(因为原项目有集成过redis,公司不想使用其他mq增加维护成本)。

所以在网上找了篇springboot整合redistemplate做消息队列的资料。稍微改了一下。

首先是redisConfig。

import com.fasterxml.jackson.annotation.JsonAutoDetect;

import com.fasterxml.jackson.annotation.PropertyAccessor;

import com.fasterxml.jackson.databind.ObjectMapper;

import org.springframework.cache.annotation.EnableCaching;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.data.redis.connection.RedisConnectionFactory;

import org.springframework.data.redis.core.*;

import org.springframework.data.redis.listener.RedisMessageListenerContainer;

import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;

import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration

@EnableCaching //开启注解

public class RedisConfig {

/**

* retemplate相关配置

* @param factory

* @return

*/

@Bean

public RedisTemplate redisTemplate(RedisConnectionFactory factory) {

RedisTemplate template = new RedisTemplate<>();

// 配置连接工厂

template.setConnectionFactory(factory);

//使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)

Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);

ObjectMapper om = new ObjectMapper();

// 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public

om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);

// 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常

om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

jacksonSeial.setObjectMapper(om);

// 值采用json序列化

template.setValueSerializer(jacksonSeial);

//使用StringRedisSerializer来序列化和反序列化redis的key值

template.setKeySerializer(new StringRedisSerializer());

// 设置hash key 和value序列化模式

template.setHashKeySerializer(new StringRedisSerializer());

template.setHashValueSerializer(jacksonSeial);

template.afterPropertiesSet();

return template;

}

@Bean

public RedisMessageListenerContainer container(RedisConnectionFactory redisConnectionFactory) {

RedisMessageListenerContainer container = new RedisMessageListenerContainer();

container.setConnectionFactory(redisConnectionFactory);

return container;

}

}

消息实体Message

import com.alibaba.fastjson.JSON;

i

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值