java springboot将接口查询数据放在系统中 一小时系统更新一次 避免用户访问接口查询数据库缓慢

真到了公司 很多数据库表 特别是常用的功能业务对应的 都是几百万条起步的数据 查询会比较缓慢

那么 我们就可以不用每次都真的查询数据库

例如 我这里有一个接口 通过 封装的 IBookService.list 函数去查询数据库

接口返回是这样的

我们先在启动类 条件装配上 这个接口所在的 controller 类

然后 整个启动类改成这样

java 复制代码
package com.example.webdom;

import com.example.webdom.controller.BookController;
import com.example.webdom.domain.textData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import java.util.Timer;
import java.util.TimerTask;

@SpringBootApplication
@EnableConfigurationProperties({textData.class})
public class WebDomApplication implements ApplicationRunner {

    @Autowired
    private BookController bookController;

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

    @Override
    public void run(ApplicationArguments args) throws Exception {
        Timer timer = new Timer();

        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                bookController.getAll();
            }
        }, 0, 60 * 60 * 1000);
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

主要的代码写在了 run函数中 项目启动后会立刻执行

然后 我们定义了一个定时任务 一小时执行一次 调用 bookController.getAll();

然后 我们将 getAll改一下

我们可以 将代码改成这样

java 复制代码
private Map<String, ResultUtil> cache = new HashMap<>();

@GetMapping
public ResultUtil getAll() {
    ResultUtil ResultUtil = cache.get("ResultUtil");
    if(ResultUtil == null){
        List<book> BookList = IBookService.list();
        int state = BookList.isEmpty() ? 500 : 200;
        String message = BookList.isEmpty() ? "未获取到对应记录" : "操作成功";
        cache.put("ResultUtil", new ResultUtil(state, BookList, message));
    }
    return ResultUtil;
}
public void removeResultUtil() {
    cache.remove("ResultUtil");
}

这里 我们定义了一个HashMap 键值对集合

然后 getAll的逻辑改为 先去cache中找出ResultUtil字段 如果值不是null 说明 我们这是存储了数据的 直接返回回去就好了

否则 重新走查询逻辑

查询到最后调用 cache.put 将数据再存进去

然后定义了一个removeResultUtil 用来清空ResultUtil的值

然后 我们将启动类的定时器改一下

在每次要调用 getAll 前 先用 removeResultUtil将原来的数据清楚调

这样 就达到了 按定时任务 一小时更新一次系统数据

将数据存在系统中 不去查数据库 提高查询效率的目的了

当然 还是建议大家使用 Redis

将这种数据放在 Redis 中 然后去查Redis 有没有 一个道理

相关推荐
码士集团小青4 小时前
SpringBoot 集成缓存性能之王 Caffeine
spring boot·后端·缓存
凤凰院凶涛QAQ5 小时前
《Java版数据结构 & 集合类剖析》Map & Set & 反射:“从哈希碰撞到红黑树转换,反射帮你扒开 HashMap 的桶数组看个究竟”
java·数据结构·算法
H.莓飛5 小时前
【数据结构】排序_OJ题(一):计数、桶与排序后的处理
java·开发语言·数据结构
wangchunyu1146 小时前
JAVA AQS与Lock实现原理(含CAS)
java·开发语言·word
爱喝水的鱼丶6 小时前
SAP-ABAP:ECC→S/4HANA ABAP 迁移升级指南——程序改造、语法兼容与性能优化 导语
运维·开发语言·性能优化·sap·abap·经验交流·开发交流
w_zero_one7 小时前
算法--模拟
java·数据结构·算法
小灰灰搞电子7 小时前
Rust+Slint 实现FTP客户端调试助手源码分享
开发语言·后端·rust
外收内放7 小时前
面向对象高级(实战案例)
开发语言·python·学习
Javatutouhouduan7 小时前
阿里1658页Java面试题总结(含答案)
java·高并发·java面试·java面试题·后端开发·java程序员·java八股文
秋天的怀念_David7 小时前
算法一千零一夜 · 第十三夜 幻方,武侠世界里的数学迷宫
java·程序人生·算法