java springboot将接口查询数据放在系统中 一小时系统更新一次 避免用户访问接口查询数据库缓慢
2023-12-30 18:41:53
真到了公司 很多数据库表 特别是常用的功能业务对应的 都是几百万条起步的数据 查询会比较缓慢
那么 我们就可以不用每次都真的查询数据库
例如 我这里有一个接口 通过 封装的 IBookService.list 函数去查询数据库
接口返回是这样的
我们先在启动类 条件装配上 这个接口所在的 controller 类
然后 整个启动类改成这样
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改一下
我们可以 将代码改成这样
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 有没有 一个道理
文章来源:https://blog.csdn.net/weixin_45966674/article/details/135306411
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!