首页 > 数据库 >Springboot缓存+定时提交优化频繁数据库表修改

Springboot缓存+定时提交优化频繁数据库表修改

时间:2024-10-17 12:33:02浏览次数:8  
标签:缓存 Springboot 数据库 cache userId 提交 entry userGroupProgressMap

缘起

最近在弄一个答题小程序,当用户选择的时候需要把用户选择的选项提交到服务器上,然后整个字段是个json格式的,更新的方法也就是解析json后添加选项进入json中。
于是其中就涉及到频繁的数据库修改,因为用户答题速度根据题目不同嘛,所以我就寻思这样频繁的修改,数据量上来速度就会受到较大的影响。
于是我打算在服务端做一个缓存机制,保存从数据库中读取到的记录用户选项的字段,这样修改就会快一些,然后利用spring的@Scheduled进行定时提交到数据库

springboot后端写法

缓存机制

利用一个ConcurrentHashMap,记录userId和对象,当获取这个字段时,判断是否存在有效的对象,如果存在,直接从map中返回,并且更新缓存的过期时间


public Map<String, UserGroupProgress> getUserGroupProgress(Integer userId) {
        if ( !userGroupProgressMap.containsKey(userId) ){
            log.info("get userProgress from database");
            // 对象不存在,从数据库中读取
            User user = userService.lambdaQuery().select(User::getGroupProgress).eq(User::getId, userId).one();
            if ( user == null ){
                return null;
            }
            UserGroupProgressCache cache = new UserGroupProgressCache();

            cache.setMap(user.getGroupProgress());
            cache.setCacheTime(System.currentTimeMillis());


            userGroupProgressMap.put(userId, cache);
            return cache.getMap();
        }
        log.info("get userProgress from map");
        UserGroupProgressCache cache = userGroupProgressMap.get(userId);
        // 更新缓存时间
        cache.setCacheTime(System.currentTimeMillis());

        return cache.getMap();
    }

然后再application启动类中加上 @EnableScheduling 注解

@EnableScheduling
@SpringBootApplication
public class CloudQuestionApplication {

    public static void main(String[] args) {
        SpringApplication.run(CloudQuestionApplication.class, args);
    }

}

定时提交

使用 @Scheduled 注解进行定时提交,并且检查缓存是否过期


    // 这里是测试,所以才定的30s
    @Scheduled(fixedDelay = 30000)
    public void executeProgressSubmit() {
        // 遍历整个map,提交一轮,如果过期,直接抛弃,缓存20分钟

      // 这里主要用于测试,没啥实际作用
        int commitCount = 0, removeCount = 0;

        Long time = System.currentTimeMillis();
        for (Map.Entry<Integer, UserGroupProgressCache> entry : userGroupProgressMap.entrySet()) {
            commitCount ++;
            if ( entry.getValue() == null ){
                continue;
            }

            userService.lambdaUpdate()
                    .set(User::getGroupProgress, JSON.toJSONString(entry.getValue().getMap()))
                    .eq(User::getId, entry.getKey())
                    .update();

            if ( time - entry.getValue().getCacheTime() > 1000 * 60 * 20 ){
                // 抛弃对象
                removeCount ++;
                userGroupProgressMap.remove(entry.getKey());
            }

        }

    }

前端写法


前端还考虑集贸,直接提交即可

标签:缓存,Springboot,数据库,cache,userId,提交,entry,userGroupProgressMap
From: https://www.cnblogs.com/molu-sleep/p/18471813

相关文章

  • 数据库操作步骤
    数据库操作的基本步骤通常分为几个主要阶段,每个阶段都有其特定的目的和操作。以下是常见的数据库操作步骤及其解释:1.创建数据库目的:建立一个新的数据库实例来存储数据。操作:使用SQL命令如CREATEDATABASEdb_name;创建数据库。解释:数据库是数据的容器,创建数据库是使用数......
  • 常见的缓存淘汰算法
    应用场景:缓存淘汰算法可以广泛应用于任何有缓存淘汰需求的场景,并不仅限于某个特定的插件或工具。许多软件和系统,如数据库(Redis、Memcached)、Web服务器(Nginx、Varnish)、内容分发网络(CDN)、浏览器缓存、甚至操作系统的内存管理,都会使用这些算法来决定在缓存空间满时该移除哪些数据......
  • 活动预告 | 10月26日,中国数据库联盟(ACDU)中国行·上海站邀您探讨数据库前沿技术
    在数字化的浪潮中,数据库技术已成为推动行业发展的中坚力量。随着金融、人工智能、开源技术的飞速发展,我们迎来了对专业人才和创新解决方案的迫切需求。由墨天轮数据社区主办的【ACDU中国行·上海站】,将于10月26日盛大开启,来自数据库领域顶尖创始人、CEO和首席技术专家将带来金融行......
  • openGauss数据库部署实践(华为云开发者云实验)
    前言数据库课程上了解到openGuass数据库,做完云实验发现实验指导手册有些地方不够细致或者已经与实际的操作步骤有所偏差,遂写一篇博客为其他同学学习提供参考。什么是openGuass?openGauss是一款开源关系型数据库管理系统,由华为公司结合多年数据库经验打造,以高性能、高可用性和高......
  • jsp东哈驾校管理系统的设计与实现dy35m(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表学员,教练,报名登记,退学登记,练车预约,考试预约,报考信息,报考反馈,成绩信息开题报告内容一、项目背景随着汽车保有量的不断增加,驾驶培训行业迎来了巨大的发......
  • jsp订餐管理系统的设计与实现3v4h1--(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,厢房信息,厢房预约,菜品分类,特色美食,员工信息,营业统计开题报告内容一、项目背景随着餐饮行业的数字化转型,订餐管理系统成为提升餐厅运营效率、优化顾......
  • jsp动物园管理系统的设计与实现zoejc程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表饲养员,后勤人员,动物类型,动物信息,食谱定制,物资信息,物资入库,排班申请,排班申请2,工资信息开题报告内容一、研究背景与意义随着城市化进程的加快和公众对......
  • SpringBoot 快速获取 IP 地址及归属地
    ava中获取IP归属地,主要是分为以下两步:通过 HttpServletRequest 获取 Ip根据 IP 查询获取对应的归属地HttpServletRequest获取IP写一个工具类封装获取IPpublicclassIpUtil{privatestaticfinalStringUNKNOWN="unknown";privatesta......
  • mySql数据库备份与恢复
    MySQL数据库的备份和恢复是保证数据安全的重要操作。以下是关于MySQL数据库备份与恢复的详细步骤和说明。一、MySQL数据库备份1.使用 mysqldumpmysqldump 是MySQL提供的一个实用工具,用于备份数据库。备份单个数据库:mysqldump-uusername-pdbname>backup.sql......
  • springboot的项目如何既要用jar包启动,同时还可以为不同的机房设置不同的配置文件
    作者:京东科技李意文 1、首先先把配置文件从jar中抽离示例代码:<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>3.2.0</version><configuration><exclu......