Redis緩存與NodeJS的初學教程

2020-12-10 程序起點

近年來,Redis已經成為Node.js應用堆棧中常見的現象。雖然它最流行的用例是緩存,Redis還有很多其他用例,你可以利用它的快閃記憶體資料庫的快得驚人。

在這個教程中,我們將給你一個快速介紹Redis。我們還將使用Redis為節點應用程式創建一個簡單的緩存,看看它是如何影響其性能的。

什麼是Redis

Redis是一個開源的(BSD許可),內存中的數據結構存儲用作資料庫、緩存和消息代理。

您可以將其看作是一個非sql資料庫,它將數據以鍵-值對的形式存儲在系統內存中。如果需要,Redis也支持磁碟持久數據存儲。

Redis支持存儲多種數據結構和數據類型,包括字符串、列表、散列、集合和排序集合。受支持的數據結構為Redis提供了多種用例的通用性。

Redis是最好的情況,在最短的時間需要數據檢索和交付給客戶端。

Redis用例

Redis做緩存

Redis最流行的使用案例之一是緩存。

緩存是什麼

緩存是在緩存中存儲數據副本的過程,以允許應用程式更快地訪問和檢索數據。緩存的目標是比資料庫或遠程伺服器更好地加速數據訪問操作。對於昂貴的(及時的)操作尤其如此。

作為一個後端開發人員,我們的任務是儘快完成客戶的請求。有時候,查詢需要一些操作,比如從資料庫中檢索數據、執行計算、從其他服務中檢索額外數據等等,這些操作會降低我們的性能。

這正是緩存的優勢所在,因為我們可以一次性處理數據,將其存儲在緩存中,然後稍後直接從緩存中檢索數據,而無需執行所有那些昂貴的操作。然後,我們會定期更新緩存,以便用戶可以看到更新的信息。

緩存 & Redis

由於Redis是一個內存資料庫,它的數據訪問操作比任何其他磁碟綁定資料庫可以提供的更快。這使得Redis成為緩存的最佳選擇。它的鍵-值數據存儲是另一個優點,因為它使數據存儲和檢索更加簡單。

在本教程中,我們將看到如何使用Redis和Node.js進行緩存。

Redis實時分析

Redis提供亞毫秒長的數據處理操作。這使得Redis成為依賴於實時數據分析的應用程式的完美候選。

例如,在實施實時欺詐檢測服務時,你可以使用Redis來存儲用戶身份和他們的交易細節。Redis甚至提供了一個ai支持的更快的交易評分系統和更快的統計模型來更好地執行這個用例。

實時分析的其他用例包括實時庫存管理系統和遊戲排行榜。

Redis會話管理

如果您的應用程式使用會話來跟蹤經過身份驗證的用戶並管理用戶特定的數據,那麼Redis非常適合用作會話存儲。使用Redis可以顯著提高系統的性能,同時使其更容易處理用戶的數據,包括憑證,最近的活動,甚至一個類似購物車的系統。

Redis作為一個隊列

你可以使用Redis來對需要很長時間才能完成的應用程式任務進行排隊。您可以實現FIDO(先入先出)隊列或創建延遲隊列,以將任務實現延遲到預定的時間。

緩存節點和Redis

現在,讓我們從本教程的主要重點開始:在NodeJS應用程式中使用Redis進行緩存。

緩存Redis的過程相當簡單。當我們收到用戶對啟用緩存的路由的請求時,我們首先檢查所請求的數據是否已經存儲在緩存中。如果是,我們可以快速檢索數據從Redis和發送響應。

但是,如果數據沒有存儲在緩存中,我們稱之為緩存缺失,我們必須首先從資料庫或外部API檢索數據並將其發送給客戶機。我們還確保將檢索到的數據存儲在緩存中,以便下次收到相同的請求時,可以更快地將緩存的數據發送給用戶。

現在您已經清楚我們要做什麼了,讓我們開始實現。

安裝Redis

如果你還沒有,你需要安裝Redis為本教程。

您可以下載二進位文件並使用以下命令輕鬆地編譯它們。

wget https://download.redis.io/releases/redis-6.0.9.tar.gz

tar xzf redis-6.0.9.tar.gz

cd redis-6.0.9

make

make install

為了確保Redis伺服器沒有問題運行,使用Redis -cli向伺服器發送一個ping。

redis-cli ping

如果你接收到ping作為響應,說明Redis伺服器運行成功。

閱讀官方的快速入門指南,以便更好地了解是否出現了問題。

構建NodeJS應用程式

基本設置

為節點應用程式設置初始樣板,如下所示。

const express = require("express");

const axios = require("axios");

const redis = require("redis");

const app = express();

app.listen(process.env.PORT || 3000, () => {

console.log("Node server started");

});

注意我們是如何使用另外兩個名為axios和redis的包的。redis是標準的redis客戶端為節點。在本教程中,我們使用axios從外部API檢索數據。

在繼續之前,請確保使用npm安裝這兩個包。

npm install axios redis --save

從外部API檢索數據

我們將使用GitHub Jobs API來獲取與世界上不同位置可用的編程任務相關的數據。

您可以將與正在查找的作業相關的搜索詞傳遞給API,並檢索json格式的可用作業數組。對API的示例請求如下所示。

https://jobs.github.com/positions.json?search=node.js

POSTMAN- GitHubAPI結果

在我們的節點應用程式中,我們定義了一個名為/jobs的路由,它從上面的API檢索作業數據並將其發送回客戶機。

const express = require("express");

const axios = require("axios");

const redis = require("redis");

const app = express();

app.get("/jobs", async (req, res) => {

const searchTerm = req.query.search;

try {

const jobs = await axios.get(`https://jobs.github.com/positions.json?search=${searchTerm}`);

res.status(200).send({

jobs: jobs.data,

});

} catch(err) {

res.status(500).send({message: err.message});

}

});

app.listen(process.env.PORT || 3000, () => {

console.log("Node server started");

});

在這裡,我們使用axios用用戶提供的搜索詞向GitHub Jobs API發送GET請求。

讓我們看看現在郵遞員是如何工作的。

POSTMAN-我們的API結果

緩存結果

現在,讓我們看看如何通過緩存來提高應用程式的性能。

首先,我們需要通過應用程式連接到Redis伺服器。我們使用已安裝的redis包來完成這個任務。

const redisPort = 6379

const client = redis.createClient(redisPort);

//log error to the console if any occurs

client.on("error", (err) => {

console.log(err);

});

Redis伺服器監聽埠6379在默認。因此,我們傳遞埠號來連接到Redis並創建一個客戶端。

然後,實現從緩存中存儲和檢索數據的邏輯。

app.get("/jobs", (req, res) => {

const searchTerm = req.query.search;

try {

client.get(searchTerm, async (err, jobs) => {

if (err) throw err;

if (jobs) {

res.status(200).send({

jobs: JSON.parse(jobs),

message: "data retrieved from the cache"

});

} else {

const jobs = await axios.get(`https://jobs.github.com/positions.json?search=${searchTerm}`);

client.setex(searchTerm, 600, JSON.stringify(jobs.data));

res.status(200).send({

jobs: jobs.data,

message: "cache miss"

});

}

});

} catch(err) {

res.status(500).send({message: err.message});

}

});

這是怎麼回事?

當我們接收到客戶機對/jobs路由的請求時,首先,我們將獲得帶有請求的查詢參數的搜索項。

const searchTerm = req.query.search;

然後,我們嘗試通過傳遞搜索項從緩存中檢索請求的數據,我們將搜索項用作在緩存中存儲數據時的鍵。由於Redis包不支持承諾,我們必須通過一個回調來處理檢索到的數據。

client.get(searchTerm, async (err, jobs) => {

if (err) throw err;

});

如果Redis返回的值不是null,這意味著相關數據存在於緩存中,所以很容易在響應中返回該數據。只要確保將字符串轉換回JSON即可。

if (jobs) {

res.status(200).send({

jobs: JSON.parse(jobs),

message: "data retrieved from the cache"

});

}

如果返回值為null,我們必須向外部API發送請求以檢索相關數據。

else {

const jobs = await axios.get(`https://jobs.github.com/positions.json?search=${searchTerm}`);

client.setex(searchTerm, 600, JSON.stringify(jobs.data));

res.status(200).send({

jobs: jobs.data,

message: "cache miss"

});

}

當我們從API獲取數據時,在發送回之前,我們將其存儲在Redis中,這樣下次同樣的請求被發送到節點伺服器時,它就可以用存儲在緩存中的數據來響應,而不是從API中請求數據。

注意我們是如何使用setex函數在緩存中存儲數據的。具體地使用setex函數而不是常規的set函數,我們可以為存儲的鍵值對設置過期時間。因為我們為過期時間設置了一個值,所以當過期時,Redis會自動從緩存中刪除該鍵值對。

完整原始碼

const express = require("express");

const axios = require("axios");

const redis = require("redis");

const app = express();

const redisPort = 6379

const client = redis.createClient(redisPort);

client.on("error", (err) => {

console.log(err);

})

app.get("/jobs", (req, res) => {

const searchTerm = req.query.search;

try {

client.get(searchTerm, async (err, jobs) => {

if (err) throw err;

if (jobs) {

res.status(200).send({

jobs: JSON.parse(jobs),

message: "data retrieved from the cache"

});

}

else {

const jobs = await axios.get(`https://jobs.github.com/positions.json?search=${searchTerm}`);

client.setex(searchTerm, 600, JSON.stringify(jobs.data));

res.status(200).send({

jobs: jobs.data,

message: "cache miss"

});

}

});

} catch(err) {

res.status(500).send({message: err.message});

}

});

app.listen(process.env.PORT || 3000, () => {

console.log("Node server started");

});

就是這樣。我們已經為應用程式創建了一個簡單的緩存。這並不難,對吧?

真相時刻:時間比較

我們將看到緩存的使用如何影響我們的應用程式的性能。我使用了Postman來發送請求到伺服器並測量請求完成時間。

第一次向伺服器發送帶有新搜索詞的請求時,應用程式需要更長的響應時間(超過7秒),因為它必須從外部API獲取數據。第二次發出相同請求時,伺服器的響應速度更快,因為結果已經存在於緩存中。

請求在10毫秒內完成。與我們之前看到的沒有緩存的應用程式相比,這是一個巨大的性能提升。

總結

在本教程中,我們給你一個快速介紹Redis和創建一個簡單的緩存與Node.js應用。現在你可以使用Redis來緩存你的應用程式中經常被查詢的數據來獲得一個相當大的性能提升。

你也可以看看如何在其他用例中利用最好的功能。

相關焦點

  • 記錄一下使用redis緩存導致WordPress無法登錄後臺的情況
    放置於香港的雲伺服器上,環境為centos6.8 64bit,伺服器軟體為lnmp1.5之前啟用了全站https 即SSL加密發現對SEO有很大影響,並且部分地區用戶由於牆的作用無法訪問https網站故打算去除https並做了伺服器遷移,在過渡期同時保留了https和http同時,將對象緩存軟體由
  • 程式設計師:一步一步輕鬆實現SpringBoot整合Redis緩存,看了不後悔
    一、基本概況為什麼使用緩存緩存是在內存中存儲的數據備份,當數據沒有發生本質變化時就可以直接從內存中查詢數據,而不用去資料庫查詢(在磁碟中)CPU讀取內存的速度要比讀取磁碟快,可以提高效率Redis緩存Remote Dictionnary Server(遠程數據服務),是一款內存高速緩存資料庫。
  • 如何在Ubuntu 18.04上安裝和配置Redis
    這就是在本教程中,我們將向您展示如何在Ubuntu 18.04上安裝Redis。為什麼要使用Redis?如上所述,Redis的性能和卓越功能使其比傳統資料庫更好。Redis的典型用法是:  緩存–其增強的數據持久存儲到磁碟的能力使其成為傳統緩存解決方案的一個更好的選擇  隊列– Redis可用於在後臺對作業進行排隊。  數器-Redis允許簡單地創建和實現計數器,而無需讀取數據或更新資料庫的方案。
  • Caffeine 和 Redis 居然可以這麼搭,想不到吧!
    Caffeine 來做緩存,那麼肯定會有人問,我用了 redis 已經很快了,為什麼還要結合使用其他的緩存呢,緩存最大的作用確實是提高效率,但是隨著業務需求的發展,業務體量的增大,多級緩存的作用就凸顯了出來,接下來讓我們盯緊了哦!
  • redis +aop+註解優雅的寫代碼,挑戰百萬年薪
    在我們以前寫代碼 ,會把緩存代碼和業務代碼寫在一個方法裡。帥傑是我們公司的一個高級開發人員,我交給他的活他都按時完成,但是他有一個毛病,就是槓精。「我就這麼寫了,怎麼了。我不給你抬槓,你那麼寫我不會說你錯。」 帥傑原話。
  • redis異步接口與nginx事件機制的對接
    redis是伺服器端常用的No-SQL資料庫,它的客戶端接口庫叫hiredis,有同步和異步(async)兩種API。同步API可以用於對高並發不作要求的場合,例如redis的客戶端工具redis-cli,它是用戶與資料庫交互的命令行工具,不存在高並發需求。
  • Redis是如何實現點讚、取消點讚的?
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫redis相關文章:分布式系統關注點——先寫DB還是「緩存」?一個牛逼的多級緩存實現方案基於redis分布式鎖實現「秒殺」(含代碼)百億數據量下,掌握這些Redis技巧你就能Hold全場9個提升逼格的redis命令
  • 來自未來的緩存 Caffeine,帶你揭開它的神秘面紗
    作者 | Garnett頭圖 | CSDN 下載自東方ICcaffeine是什麼,它和redis什麼區別,有哪些作用,那麼讓我們帶著疑問讓Garnett來告訴你這個來自未來的緩存-Caffeine!Caffeine和Redis的區別是什麼?
  • 微軟與 Redis Labs 達成合作,以改善 Redis 的 Azure 緩存
    在 RedisConf 2020 Takeaway 上,Redis Labs 宣布與微軟達成新的戰略協議,以將 Redis Enterprise 作為 Microsoft Azure 緩存上的集成託管服務交付。
  • 基於NodeJS從零構建線上自動化打包工作流
    你將收穫設計一款在線工作流的基本思路nodejs常用API的使用nodejs如何使用父子進程使用child_process的exec實現解析並執行命令行指令但是我們仔細思考之後就能發現, 這些產物的背後都是靠nodejs和babel做底層支持。我們無非就是設計一種架構模式,通過babel的加載器和nodejs的服務能力,將代碼由JS - AST - JS的過程(這裡忽略css和插件處理)。在吹完牛逼之後,我們開始介紹如何設計一款在線工作流。1.
  • Prometheus + Grafana 構建 Redis 實時監控平臺
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫Redis作為緩存系統,在整個後端體系中是較為重要的一環,需要實時監控運行狀態。
  • 新入職的妹子問我Redis是如何實現點讚、取消點讚的?
    點讚、取消點讚是高頻次的操作,若每次都讀寫資料庫,大量的操作會影響資料庫性能,所以需要做緩存。至於多久從 Redis 取一次數據存到資料庫中,根據項目的實際情況定吧,我是暫時設了兩個小時。項目需求需要查看都誰點讚了,所以要存儲每個點讚的點讚人、被點讚人,不能簡單地做計數。
  • 程式設計師必備|面試中常被問到的redis持久化的問題
    「請老先生考我」少年興奮地說道「我問你,redis是內存資料庫,既然數據都在內存中,一旦redis宕機,數據豈不是沒了?」「rdb是redis持久化的方案之一,原理是將redis在某個時刻的所有內存數據全部寫到一個文件裡面去」"redis是單線程處理命令的,如果redis內存數據很大,將數據全部寫入到文件會很耗時,線程會一直阻塞在寫入文件上,那其他命令不就無法執行了?"
  • Spring Boot+Redis+攔截器+自定義Annotation實現接口自動冪等
    redis實現自動冪等的原理圖:一:搭建redis的服務Api1:首先是搭建redis伺服器。2:引入springboot中到的redis的stater,或者Spring封裝的jedis也可以,後面主要用到的api就是它的set方法和exists方法,這裡我們使用springboot的封裝好的redisTemplate/*** redis工具類 */
  • 看完這部緩存進化史,還不懂緩存,請給我差評
    先簡單介紹一下愛奇藝的java緩存道路的發展吧。可以看見圖中分為幾個階段:通過消息隊列進行數據同步至redis,然後Java應用直接去取緩存 這個階段優點是:由於是使用的分布式緩存,所以數據更新快。缺點也比較明顯:依賴Redis的穩定性,一旦redis掛了,整個緩存系統不可用,造成緩存雪崩,所有請求打到DB。
  • 連redis這些概念都不知道,誰敢相信您曾搞過軟體開發?
    01使用redis有哪些好處?解決方案:1)、加速緩存生成,不要讓生成緩存耗費太長時間,儘量縮小無緩存空窗期。或是必須生成緩存後,才能對外提供服務。4)、多級緩存策略 , 建立多級緩存,如本地緩存作為一級緩存,外部存儲作為二級緩存。二級緩存掛了,可以先去一級緩存讀取。
  • Redis:從應用到底層,都在這兒了!
    雪崩解決方案:緩存數據的過期時間加上個隨機值,防止同一時間大量數據過期現象發生;如果緩存資料庫是分布式部署,將熱點數據均勻分布在不同搞得緩存資料庫中;設置熱點數據永遠不過期。4.4、雙寫一致性雙寫:緩存跟資料庫均更新數據,如何保證數據一致性?先更新資料庫,再更新緩存安全問題:線程 A 更新資料庫->線程 B 更新資料庫->線程 B 更新緩存->線程 A 更新緩存。導致髒讀。
  • 距離大廠之門只差成功掌握這40道Redis面試題,(附答案解析)
    所以 redis 具有快速和數據持久化的特徵。如果不將數據放在內存中,磁碟 I/O 速度為嚴重影響 redis 的性能。在內存越來越便宜的今天,redis 將會越來越受歡迎。如果設置了最大使用的內存,則數據已有記錄數達到內存限值後不能繼續插入新值。
  • Redisson 3.14.1 發布,官方推薦的 Redis 客戶端
    本次更新內容包括:新功能 增加了LocalCachedMapOptions.storeCacheMiss選項,用於在本地緩存中存儲緩存遺漏。 修復redisRepository.opsForSet().distinctRandomMembers()方法可能拋出 ClassCastException 的問題。
  • 官方推薦的 Redis 客戶端 Redisson 3.14.1 發布
    本次更新內容包括:新功能增加了LocalCachedMapOptions.storeCacheMiss選項,用於在本地緩存中存儲緩存遺漏。修復redisRepository.opsForSet().distinctRandomMembers()方法可能拋出 ClassCastException 的問題。詳細查看更新信息。