如何处理前端开发中的并发查询

背景

JS 代码的执行过程中,同一事件循环中可能存在多个同样的请求,这些请求得到的都是同样的结果。 通常我们可以通过 的机制来限制多个事件循环中的查询,但在同一个循环里,这些请求在没有得到返回结果之前,我们是没法加的,因为请求可能会失败。


如果请求量很大,那么就可能导致查询量过大,造成第三方(端、后台)承受一定的压力,影响性能。 这种情况类似于"缓存雪崩" 缓存雪崩是指在某一个时间段内,Cache缓存集中过期失效,如果这个时间段内有大量请求,那么所有的请求都会打到db数据库,导致数据库的访问量暴增,引起数据库崩溃

解决方案

这种情况的处理方法也很简单,需要用到缓存队列 ,在没有获取到查询结果前,我们将所有的请求回调函数都放进缓存队列 里,当唯一的请求得到结果后,再取出所有的回调函数进行执行,类似于Promisethen机制。

注意⚠️:这种方案仅适用于所查询的数据为静态数据,在短时间内多次查询的结果均相同的情况

ts 复制代码
let res // 响应结果
let lock = false // 请求锁
const queue = [] // 请求队列
const doReq = () => { // 请求方法
    console.log('正在请求...')
    return new Promise(resolve => {
        setTimeout(() => resolve(Math.random()), Math.random() * 3000) // 3s内响应
    })
}
// 请求缓存
function request(callback) {
    if (!res && !lock) {
        lock = true
        doReq().then((data) => {
            res = data
            let cb
            while(cb = queue.shift()) {
                cb(res)
            }
            lock = false
        })
    }
    if (res) {
        callback(res)
    } else {
        queue.push(callback)
    }
}

测试代码 & 打印结果

ts 复制代码
request(() => { console.log('查询1:', res) })
request(() => { console.log('查询2:', res) })
request(() => { console.log('查询3:', res) })

应用场景

相关推荐
HjhIron几秒前
React Router 通关指南:从入门到鉴权,一个项目全搞定
前端
kyson_2 分钟前
如何做一款自适应的数据大屏:`vw/vh`、`rem`、`scale` 应该怎么选?
前端
雪隐7 分钟前
WPF + MVVM 实战系列02-告别 INPC 手写时代,做个体面的现代 WPF 人
前端·后端·c#
肉肉不吃 肉12 分钟前
无渲染组件和组合式函数
前端·javascript·vue.js
其美杰布-富贵-李13 分钟前
01 从项目结构开始认识 Vue 3
javascript·vue.js·ecmascript
未来智慧谷16 分钟前
从 Atlas 关停复盘:AI 应用的三种载体形态怎么选(独立应用 / 浏览器扩展 / 桌面宿主)
前端·人工智能·ai·架构·浏览器
sugar__salt20 分钟前
前端路由技术详解:从传统多页到 React SPA 的完整进化之路
前端·javascript·react.js·前端框架
Canace36 分钟前
Harness Engineering 到底在做什么
前端·人工智能·ai编程
用户842981424181039 分钟前
JS代码压缩实测:可减小体积、提高执行效率!
前端·javascript·后端
snow@li41 分钟前
Vue Axios封装与SpringBoot Payload封装全景关联分析(前后端数据交互底层闭环)
前端·vue.js·spring boot