詳解nodejs如何實(shí)現(xiàn)查詢緩存
我相信你肯定在不同場(chǎng)景下吐槽過某個(gè)搜索響應(yīng)慢,列表展示遲,詳情頁(yè)白屏久等問題。對(duì)于頻繁查詢、數(shù)據(jù)穩(wěn)定性高、讀取代價(jià)高的場(chǎng)景,查詢緩存可以發(fā)揮重要的作用,提高系統(tǒng)的性能和用戶體驗(yàn)。
實(shí)現(xiàn)緩存的關(guān)鍵
在實(shí)現(xiàn)查詢緩存時(shí),以下是一些需要考慮的關(guān)鍵方面:
1. 緩存策略
需要選擇合適的緩存策略,例如LRU(最近最少使用)、LFU(最不經(jīng)常使用)等。緩存策略決定了緩存中的數(shù)據(jù)何時(shí)被淘汰或更新。以下是一個(gè)示例代碼,展示了如何使用 lru-cache 庫(kù)實(shí)現(xiàn) LRU 緩存策略:
const LRU = require('lru-cache');
// 創(chuàng)建一個(gè) LRU 緩存實(shí)例
const cache = new LRU({
max: 100, // 最大緩存條目數(shù)
maxAge: 60000, // 條目在緩存中的最長(zhǎng)存活時(shí)間(毫秒)
});
function getDataFromCache(key) {
const data = cache.get(key);
if (data) {
console.log('Fetching data from cache for key:', key);
return data;
}
return null;
}
function setDataToCache(key, data) {
console.log('Setting data to cache for key:', key);
cache.set(key, data);
}
2. 緩存失效
當(dāng)后端數(shù)據(jù)發(fā)生變化時(shí),需要及時(shí)使緩存失效,以避免返回過期或不一致的數(shù)據(jù)??梢愿鶕?jù)業(yè)務(wù)需求設(shè)置緩存的失效時(shí)間(例如根據(jù)數(shù)據(jù)更新頻率),或者在數(shù)據(jù)發(fā)生變化時(shí)手動(dòng)使緩存失效。以下是一個(gè)示例代碼,展示了如何手動(dòng)使緩存失效:
function updateDataInDatabase(key, newData) {
// 更新數(shù)據(jù)庫(kù)中的數(shù)據(jù)
// ...
// 使緩存失效
cache.del(key);
}
3. 并發(fā)訪問
并發(fā)訪問可能導(dǎo)致緩存的競(jìng)態(tài)條件和不一致性??梢允褂没コ怄i或其他并發(fā)控制機(jī)制來保證對(duì)緩存的訪問的原子性和一致性。以下是一個(gè)示例代碼,展示了如何使用 async-mutex 庫(kù)實(shí)現(xiàn)互斥鎖:
const { Mutex } = require('async-mutex');
const mutex = new Mutex();
async function getDataWithCache(key) {
const release = await mutex.acquire();
try {
let data = getDataFromCache(key);
if (!data) {
// 從數(shù)據(jù)庫(kù)獲取數(shù)據(jù)
data = fetchFromDatabase(key);
// 將數(shù)據(jù)設(shè)置到緩存
setDataToCache(key, data);
}
return data;
} finally {
release();
}
}
4. 緩存命中率和效果評(píng)估
需要監(jiān)控和評(píng)估緩存的命中率和效果,以便調(diào)優(yōu)和改進(jìn)緩存策略。可以通過記錄緩存命中和未命中的次數(shù),以及緩存的數(shù)據(jù)大小和存儲(chǔ)效率來評(píng)估緩存的效果。
實(shí)現(xiàn)查詢緩存的手段和工具
在 Node.js 服務(wù)端實(shí)現(xiàn)查詢緩存時(shí),結(jié)合之前提到的關(guān)鍵方面進(jìn)行說明,我們可以使用以下手段和工具:
1. 內(nèi)存緩存庫(kù)
Node.js 中有一些流行的內(nèi)存緩存庫(kù),例如 node-cache、memory-cache 和 lru-cache。這些庫(kù)提供了方便的 API 來實(shí)現(xiàn)基于內(nèi)存的查詢緩存。以下是一個(gè)示例代碼,展示了如何使用 node-cache 庫(kù)實(shí)現(xiàn)查詢緩存:
const NodeCache = require('node-cache');
const cache = new NodeCache();
function getDataFromCache(key) {
const data = cache.get(key);
if (data) {
console.log('Fetching data from cache for key:', key);
return data;
}
return null;
}
function setDataToCache(key, data) {
console.log('Setting data to cache for key:', key);
cache.set(key, data);
}
2. 數(shù)據(jù)庫(kù)緩存
將查詢結(jié)果存儲(chǔ)在數(shù)據(jù)庫(kù)中,可以使用鍵值存儲(chǔ)數(shù)據(jù)庫(kù)(例如 Redis)或關(guān)系數(shù)據(jù)庫(kù)來實(shí)現(xiàn)查詢緩存。這種方式可以提供更持久的緩存,并且適用于多個(gè)服務(wù)節(jié)點(diǎn)共享緩存的情況。以下是一個(gè)示例代碼,展示了如何使用 Redis 實(shí)現(xiàn)查詢緩存:
const redis = require('redis');
const client = redis.createClient();
function getDataFromCache(key) {
return new Promise((resolve, reject) => {
client.get(key, (err, data) => {
if (err) {
reject(err);
} else {
console.log('Fetching data from cache for key:', key);
resolve(data);
}
});
});
}
function setDataToCache(key, data) {
console.log('Setting data to cache for key:', key);
client.set(key, data);
}
3. 緩存失效機(jī)制
可以通過設(shè)置緩存的過期時(shí)間或手動(dòng)使緩存失效來處理緩存的失效。以下是一個(gè)示例代碼,展示了如何設(shè)置緩存的過期時(shí)間:
function setDataToCacheWithExpiration(key, data, expirationSeconds) {
console.log('Setting data to cache for key:', key, 'with expiration:', expirationSeconds, 'seconds');
cache.set(key, data, expirationSeconds);
}
4. 并發(fā)控制
可以使用互斥鎖或分布式鎖來處理并發(fā)訪問緩存時(shí)的競(jìng)態(tài)條件。以下是一個(gè)示例代碼,展示了如何使用 redis 庫(kù)實(shí)現(xiàn)分布式鎖來保證對(duì)緩存的原子性訪問:
const redis = require('redis');
const client = redis.createClient();
function acquireLock(key, expirationSeconds) {
return new Promise((resolve, reject) => {
client.set(key, 'locked', 'EX', expirationSeconds, 'NX', (err, result) => {
if (err) {
reject(err);
} else if (result === 'OK') {
resolve();
} else {
reject(new Error('Failed to acquire lock'));
}
});
});
}
function releaseLock(key) {
return new Promise((resolve, reject) => {
client.del(key, (err, result) => {
if (err) {
reject(err);
} else {
resolve();
}
});
});
}
async function getDataWithCacheAndLock(key) {
const lockKey = key + ':lock';
try {
await acquireLock(lockKey, 10); // 10 秒鎖的過期時(shí)間
let data = getDataFromCache(key);
if (!data) {
// 從數(shù)據(jù)庫(kù)獲取數(shù)據(jù)
data = fetchFromDatabase(key);
// 將數(shù)據(jù)設(shè)置到緩存
setDataToCache(key, data);
}
return data;
} finally {
await releaseLock(lockKey);
}
}
5. CDN緩存
如果查詢的數(shù)據(jù)是靜態(tài)文件或資源,例如圖片、CSS文件、JavaScript文件等,可以利用CDN(內(nèi)容分發(fā)網(wǎng)絡(luò))來實(shí)現(xiàn)緩存。CDN在全球分布的邊緣節(jié)點(diǎn)上緩存靜態(tài)資源,并根據(jù)用戶的地理位置選擇最近的節(jié)點(diǎn)進(jìn)行訪問,從而提高訪問速度和性能。
CDN緩存的實(shí)現(xiàn)通常是通過在HTTP響應(yīng)頭中設(shè)置緩存相關(guān)的頭部信息,例如Cache-Control、Expires、Last-Modified等,來指示客戶端或CDN節(jié)點(diǎn)緩存資源的時(shí)間和機(jī)制。
這種方式適用于靜態(tài)資源的緩存需求,可以減輕服務(wù)器的負(fù)載壓力,并提供更快速的訪問體驗(yàn)。
需要注意的是,CDN緩存通常需要與緩存刷新機(jī)制結(jié)合使用,以保證數(shù)據(jù)的更新和一致性。
6. 緩存命中率和效果評(píng)估
可以通過日志記錄緩存命中和未命中的次數(shù),并使用監(jiān)控工具(如 Prometheus)來收集和分析數(shù)據(jù),評(píng)估緩存的命中率和效果。
總結(jié)
總的來說,服務(wù)端實(shí)現(xiàn)緩存在Web應(yīng)用程序中具有重要的作用和價(jià)值。對(duì)于提高性能、減輕負(fù)載、提高可擴(kuò)展性、改善用戶體驗(yàn)以及降低對(duì)外部資源的依賴都非常重要。合理地使用緩存機(jī)制可以使Web應(yīng)用程序更加高效、可靠和可擴(kuò)展,從而提供更好的用戶體驗(yàn)和業(yè)務(wù)價(jià)值。
到此這篇關(guān)于詳解nodejs如何實(shí)現(xiàn)查詢緩存的文章就介紹到這了,更多相關(guān)nodejs查詢緩存內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決淘寶cnpm 安裝后cnpm不是內(nèi)部或外部命令的問題
今天小編就為大家分享一篇解決淘寶cnpm 安裝后cnpm不是內(nèi)部或外部命令的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05
Node.js實(shí)現(xiàn)用戶身份驗(yàn)證和授權(quán)的示例代碼
在web開發(fā)中,我們常常需要對(duì)一些敏感的url進(jìn)行訪問權(quán)限控制,本文主要介紹了Node.js實(shí)現(xiàn)用戶身份驗(yàn)證和授權(quán)的示例代碼,具有一定的參考價(jià)值,感興趣的了解一下2024-02-02
詳解NodeJs項(xiàng)目 CentOs linux服務(wù)器線上部署
這篇文章主要介紹了NodeJs項(xiàng)目 CentOs linux服務(wù)器線上部署,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09
使用Phantomjs和Node完成網(wǎng)頁(yè)的截屏快照的方法
這篇文章主要介紹了使用Phantomjs和Node完成網(wǎng)頁(yè)的截屏快照的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
用Nodejs實(shí)現(xiàn)在終端中炒股的實(shí)現(xiàn)
這篇文章主要介紹了用Nodejs實(shí)現(xiàn)在終端中炒股的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
node.JS md5加密中文與php結(jié)果不一致的解決方法
本篇文章主要介紹了node.JS md5加密中文與php結(jié)果不一致的解決方法,具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-05-05

