iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Spring Boot如何解决Redis缓存+MySQL批量入库问题
  • 418
分享到

Spring Boot如何解决Redis缓存+MySQL批量入库问题

2023-06-29 02:06:00 418人浏览 薄情痞子
摘要

这篇文章给大家分享的是有关spring Boot如何解决Redis缓存+MySQL批量入库问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。架构设计架构图:时序图记录基础数据Mysql表结构CREATE

这篇文章给大家分享的是有关spring Boot如何解决Redis缓存+MySQL批量入库问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

架构设计

架构图:

Spring Boot如何解决Redis缓存+MySQL批量入库问题

时序图

Spring Boot如何解决Redis缓存+MySQL批量入库问题

记录基础数据Mysql表结构

CREATE TABLE `zh_article_count` (  `id` bigint(20) NOT NULL AUTO_INCREMENT,  `bu_no` varchar(32) DEFAULT NULL COMMENT '业务编码',  `customer_id` varchar(32) DEFAULT NULL COMMENT '用户编码',  `type` int(2) DEFAULT '0' COMMENT '统计类型:0APP内文章阅读',  `article_no` varchar(32) DEFAULT NULL COMMENT '文章编码',  `read_time` datetime DEFAULT NULL COMMENT '阅读时间',  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',  `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',  `param1` int(2) DEFAULT NULL COMMENT '预留字段1',  `param2` int(4) DEFAULT NULL COMMENT '预留字段2',  `param3` int(11) DEFAULT NULL COMMENT '预留字段3',  `param4` varchar(20) DEFAULT NULL COMMENT '预留字段4',  `param5` varchar(32) DEFAULT NULL COMMENT '预留字段5',  `param6` varchar(64) DEFAULT NULL COMMENT '预留字段6',  PRIMARY KEY (`id`) USING BTREE,  UNIQUE KEY `uk_zh_article_count_buno` (`bu_no`),  KEY `key_zh_article_count_csign` (`customer_id`),  KEY `key_zh_article_count_ano` (`article_no`),  KEY `key_zh_article_count_rtime` (`read_time`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文章阅读统计表';

技术实现方案

SpringBoot

Redis

mysql

代码实现

完整代码(GitHub,欢迎大家Star,Fork,Watch)

https://github.com/dangnianchuntian/springboot

主要代码展示

Controller

package com.zhanghan.zhredistodb.controller;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.validation.annotation.Validated;import org.springframework.WEB.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RestController;import com.zhanghan.zhredistodb.controller.request.PostArticleViewsRequest;import com.zhanghan.zhredistodb.service.ArticleCountService;@RestControllerpublic class ArticleCountController {    @Autowired    private ArticleCountService articleCountService;       @RequestMapping(value = "/post/article/views", method = RequestMethod.POST)    public Object postArticleViews(@RequestBody @Validated PostArticleViewsRequest postArticleViewsRequest) {        return articleCountService.postArticleViews(postArticleViewsRequest);    }        @RequestMapping(value = "/post/batch", method = RequestMethod.POST)    public Object postBatch() {        return articleCountService.postBatchRedisToDb();}

Service

package com.zhanghan.zhredistodb.service.impl;import java.util.ArrayList;import java.util.Date;import java.util.List;import java.util.stream.Collectors;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.stereotype.Service;import org.springframework.util.CollectionUtils;import com.alibaba.fastJSON.jsON;import com.zhanghan.zhredistodb.controller.request.PostArticleViewsRequest;import com.zhanghan.zhredistodb.dto.ArticleCountDto;import com.zhanghan.zhredistodb.mybatis.mapper.XArticleCountMapper;import com.zhanghan.zhredistodb.service.ArticleCountService;import com.zhanghan.zhredistodb.util.wrapper.WrapMapper;import cn.hutool.core.util.IdUtil;@Servicepublic class ArticleCountServiceImpl implements ArticleCountService {    private static Logger logger = LoggerFactory.getLogger(ArticleCountServiceImpl.class);    @Autowired    private RedisTemplate<String, String> strRedisTemplate;    private XArticleCountMapper xArticleCountMapper;    @Value("${zh.article.count.redis.key:zh}")    private String zhArticleCountRedisKey;    @Value("#{T(java.lang.Integer).parseInt('${zh..article.read.num:3}')}")    private Integer articleReadNum;        @Override    public Object postArticleViews(PostArticleViewsRequest postArticleViewsRequest) {        ArticleCountDto articleCountDto = new ArticleCountDto();        articleCountDto.setBuNo(IdUtil.simpleUUID());        articleCountDto.setCustomerId(postArticleViewsRequest.getCustomerId());        articleCountDto.setArticleNo(postArticleViewsRequest.getArticleNo());        articleCountDto.setReadTime(new Date());        String strArticleCountDto = JSON.toJSONString(articleCountDto);        strRedisTemplate.opsForList().rightPush(zhArticleCountRedisKey, strArticleCountDto);        return WrapMapper.ok();    }     * 批量将缓存中的数据同步到Mysql    public Object postBatchRedisToDb() {        Date now = new Date();        while (true) {            List<String> strArticleCountList =                    strRedisTemplate.opsForList().range(zhArticleCountRedisKey, 0, articleReadNum);            if (CollectionUtils.isEmpty(strArticleCountList)) {                return WrapMapper.ok();            }            List<ArticleCountDto> articleCountDtoList = new ArrayList<>();            strArticleCountList.stream().forEach(x -> {                ArticleCountDto articleCountDto = JSON.parseObject(x, ArticleCountDto.class);                articleCountDtoList.add(articleCountDto);            });            //过滤出本次定时任务之前的缓存中数据,防止死循环            List<ArticleCountDto> beforeArticleCountDtoList = articleCountDtoList.stream().filter(x -> x.getReadTime()                    .before(now)).collect(Collectors.toList());            if (CollectionUtils.isEmpty(beforeArticleCountDtoList)) {            xArticleCountMapper.batchAdd(beforeArticleCountDtoList);            Integer delSize = beforeArticleCountDtoList.size();            strRedisTemplate.opsForList().trim(zhArticleCountRedisKey, delSize, -1L);        }}

测试

模拟用户请求访问后台(多次请求)

Spring Boot如何解决Redis缓存+MySQL批量入库问题

查看缓存中访问数据

Spring Boot如何解决Redis缓存+MySQL批量入库问题

模拟定时任务将缓存中数据同步到DB中

Spring Boot如何解决Redis缓存+MySQL批量入库问题

这时查看缓存中的数据已经没了

Spring Boot如何解决Redis缓存+MySQL批量入库问题

查看数据库表结构

Spring Boot如何解决Redis缓存+MySQL批量入库问题

感谢各位的阅读!关于“Spring Boot如何解决Redis缓存+MySQL批量入库问题”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

您可能感兴趣的文档:

--结束END--

本文标题: Spring Boot如何解决Redis缓存+MySQL批量入库问题

本文链接: https://www.lsjlt.com/news/322163.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring Boot如何解决Redis缓存+MySQL批量入库问题
    这篇文章给大家分享的是有关Spring Boot如何解决Redis缓存+MySQL批量入库问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。架构设计架构图:时序图记录基础数据MySQL表结构CREATE...
    99+
    2023-06-29
  • Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题
    目录前言架构设计代码实现测试总结前言 最近在做阅读类的业务,需要记录用户的PV,UV; 项目状况:前期尝试业务阶段; 特点:快速实现(不需要做太重,满足初期推广运营即可)快速投入市场...
    99+
    2024-04-02
  • 如何解决Redis缓存异常的问题
    这篇文章将为大家详细讲解有关如何解决Redis缓存异常的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。缓存雪崩缓存雪崩是指缓存同一时间大面积的失效,所以,后面的请求都...
    99+
    2024-04-02
  • 如何解决Redis缓存穿透和缓存雪崩问题
    这篇文章主要为大家展示了“如何解决Redis缓存穿透和缓存雪崩问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何解决Redis缓存穿透和缓存雪崩问题”这篇文...
    99+
    2024-04-02
  • redis缓存和数据库一致性问题如何解决
    在使用Redis缓存时,常常会遇到与数据库一致性的问题。当数据发生变更时,需要保证Redis缓存与数据库的数据保持一致。以下是几种常...
    99+
    2023-08-24
    redis
  • 如何解决redis缓存穿透、缓存击穿、缓存雪崩的问题
    这篇文章主要介绍了如何解决redis缓存穿透、缓存击穿、缓存雪崩的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。缓存穿透:key中对应的...
    99+
    2024-04-02
  • Redis如何解决库存超卖问题
    这篇文章主要介绍“Redis如何解决库存超卖问题”,在日常操作中,相信很多人在Redis如何解决库存超卖问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Redis如何解决库存超卖问题”的疑惑有所帮助!接下来...
    99+
    2023-06-06
  • 如何解决MySQL批量插入和唯一索引问题
    这篇文章主要介绍了如何解决MySQL批量插入和唯一索引问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。MySQL批量插入问题在开发项目时,...
    99+
    2024-04-02
  • 解决spring data jpa 批量保存更新的问题
    spring data jpa 批量保存更新问题 使用jpa批量保存时,看日志发现是一条一条打印的,然后去看了下源码,果然是循环调用的单个保存(巨坑啊) 经查询jpa是可以实现批量...
    99+
    2024-04-02
  • 在Spring Boot中使用注解如何实现Redis 缓存
    在Spring Boot中使用注解如何实现Redis 缓存?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、创建 Caching 配置类RedisKeys.Javapackag...
    99+
    2023-05-31
    springboot redis 注解
  • ajax如何解决缓存问题
    这篇文章主要介绍ajax如何解决缓存问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 这样是为了减少频繁访问服务器对其造成不必要的负担,但是同时也带来...
    99+
    2024-04-02
  • 如何解决Ajax缓存问题
    这篇文章主要介绍“如何解决Ajax缓存问题”,在日常操作中,相信很多人在如何解决Ajax缓存问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何解决Ajax缓存问题”的疑惑...
    99+
    2024-04-02
  • 详解redis缓存与数据库一致性问题解决
    数据库与缓存读写模式策略 写完数据库后是否需要马上更新缓存还是直接删除缓存? (1)、如果写数据库的值与更新到缓存值是一样的,不需要经过任何的计算,可以马上更新缓存,但是如果对于那...
    99+
    2024-04-02
  • Mysql批量插入数据时该如何解决重复问题详解
    目录前言一、三种方法二、细节2.1、insert ignore into2.2 、insert into ... on duplicate key update2.3、replace into三、总结前言 当数据库中存量...
    99+
    2024-04-02
  • Vue入口文件index.html缓存问题如何解决
    这篇文章主要介绍“Vue入口文件index.html缓存问题如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue入口文件index.html缓存问题如何解决”文章能帮助大家解决问题。Vue入...
    99+
    2023-07-05
  • 如何解决spring-boot使用logback的问题
    这篇文章主要介绍了如何解决spring-boot使用logback的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。用ConsoleAppender.java来举例,假设在...
    99+
    2023-06-20
  • jpa entitymanager缓存问题如何解决
    JPA EntityManager的缓存问题可以通过以下几种方式解决:1. 清除缓存:可以使用EntityManager的clear...
    99+
    2023-10-18
    jpa
  • AJAX中如何解决缓存问题
    这篇文章将为大家详细讲解有关AJAX中如何解决缓存问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。做一个项目用到Ajax,开始觉得挺好,后来发现一个问题,例如删除一项,...
    99+
    2024-04-02
  • 基于Redis缓存数据常见的问题如何解决
    这篇文章主要介绍“基于Redis缓存数据常见的问题如何解决”,在日常操作中,相信很多人在基于Redis缓存数据常见的问题如何解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”基于Redis缓存数据常见的问题如...
    99+
    2023-07-02
  • Springboot的spring-boot-maven-plugin导入失败的问题如何解决
    本篇内容介绍了“Springboot的spring-boot-maven-plugin导入失败的问题如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作