使用 Redis 與 docker 和 docker-compose 進行本地開發分步教程


Redis 是一個開源的內存數據存儲,用作數據庫、緩存甚至消息代理。 Redis 可以輕鬆地與 docker 和 docker-compose 一起用於本地開發,作為 Web 應用程序的緩存。 在這篇文章中,我們將使用 docker 和 docker-compose 設置 Redis,其中 Redis 將用作 Node.js/Express.js REST API 的緩存,其中 PostgreSQL 作為主數據庫,讓我們開始吧!


目錄 #

  • 先決條件
  • Redis 和 Docker
  • Redis 與 Docker-compose
  • 將 Redis 添加到現有的 Node.js 應用程序
  • 結論

先決條件 #

在我們開始查看代碼之前,以下是一些好的前提條件:

  1. 了解 Docker 如何工作的一般知識將是有利的。
  2. 預計將遵循帶有引號 API 的 Node.js Postgres 教程。
  3. 閱讀 Node.js Redis 帖子將非常有益。
  4. 任何有關 Redis 的工作知識、它的命令行以及一些基本命令(如 KEYS、MGET)都會有所幫助。

考慮到這一點,現在我們可以先只使用 Docker 運行 Redis。

Redis 和 Docker #

如前所述,Redis 也可以用作緩存。 在這篇文章中,我們將使用 Redis 作為內存緩存,而不是從 Postgres 數據庫中獲取數據。 為此,我們將使用 官方 Redis docker 鏡像 來自 Dockerhub。 要在 Alpine 容器上運行 Redis 6.2 版本,我們將運行以下命令:

docker run --rm --name test-redis redis:6.2-alpine redis-server --loglevel warning

上面的命令將啟動一個名為 test-redis 對於 6.2-alpine` 的給定圖像版本,日誌級別為警告。 它將給出以下輸出:

僅使用 Docker 運行 Redis

要在容器內運行一些 Redis 命令,我們可以運行 docker exec -it test-redis redis-cli 這將在正在運行的容器中運行 redis-cli。 我們可以嘗試一些如下的 redis 命令來查看是否正常:

在 Redis Docker 容器中執行 Redis CLI

如上所示,我們可以使用鍵設置一些值 test 並取回它。 由於沒有設置卷或給出任何命令來持久化,因此當容器停止時,鍵和值將丟失。 接下來,我們將研究使用 docker-compose 運行相同版本的 Redis。

Redis 與 Docker-compose #

要使用 Docker-compose 運行 Redis,包括持久性和身份驗證,我們將使用名為 docker-compose 的文件 docker-compose-redis-only.yml 如下所示:

version: '3.8'
services:
cache:
image: redis:6.2-alpine
restart: always
ports:
- '6379:6379'
command: redis-server --save 20 1 --loglevel warning --requirepass eYVX7EwVmmxKPCDmwMtyKVge8oLd2t81
volumes:
- cache:/data
volumes:
cache:
driver: local

在上面的 docker-compose 文件中,我們定義了一個名為 cache 的服務。 緩存服務將拉取 redis:6.2.alpine 來自 Dockerhub 的圖像。 它設置為總是重新啟動,如果 docker 容器由於某種原因失敗,它將重新啟動。 然後,我們映射容器端口 6379 到本地港口 6379. 如果我們的目標是運行多個版本的 Redis,我們可以選擇一個隨機端口。

因此,我們使用自定義 redis-server 命令與 --save 20 1 它指示服務器每 20 秒將 1 次或更多寫入保存到磁盤,以防服務器重新啟動。 我們正在使用 --requirepass 參數添加使用密碼進行身份驗證以在 Redis 服務器上讀取/寫入數據。 正如我們所知,如果這是一個生產級應用程序,密碼將不會洩露。 這是在這裡完成的,因為它僅用於開發目的。

隨後,我們使用一個卷 /data 任何寫入都將被持久化的地方。 它被映射到一個名為 cache. 此卷作為本地驅動程序進行管理,您可以閱讀更多關於 Docker 卷驅動程序 如果你想。

如果我們使用上述文件運行 docker-compose up ​​docker-compose -f docker-compose-redis-only.yml up 它將給出如下輸出:

僅使用 docker-compose 運行 Redis - 輸出

該容器的運行方式與上述容器類似。 這裡的兩個主要區別是正在安裝卷以在容器重新啟動時保留保存的數據,並且提供密碼用於身份驗證。 在下一節中,我們會將 Redis 添加到現有應用程序中,該應用程序具有 PostgreSQL 數據庫和使用該數據庫的 Node.js API。

將 Redis 添加到現有的 Node.js 應用程序

作為本指南的示例,我們使用 報價 API 使用 Node.js 和 Postgres 構建的應用程序。 我們將在現有的docker-compose文件中引入Redis服務如下:

version: '3.8'
services:
db:
image: postgres:14.1-alpine
restart: always
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
ports:
- '5432:5432'
volumes:
- db:/var/lib/postgresql/data
- ./db/init.sql:/docker-entrypoint-initdb.d/create_tables.sql
cache:
image: redis:6.2-alpine
restart: always
ports:
- '6379:6379'
command: redis-server --save 20 1 --loglevel warning --requirepass eYVX7EwVmmxKPCDmwMtyKVge8oLd2t81
volumes:
- cache:/data
api:
container_name: quotes-api
build:
context: ./
target: production
image: quotes-api
depends_on:
- db
- cache
ports:
- 3000:3000
environment:
NODE_ENV: production
DB_HOST: db
DB_PORT: 5432
DB_USER: postgres
DB_PASSWORD: postgres
DB_NAME: postgres
REDIS_HOST: cache
REDIS_PORT: 6379
REDIS_PASSWORD: eYVX7EwVmmxKPCDmwMtyKVge8oLd2t81
links:
- db
- cache
volumes:
- ./:/src
volumes:
db:
driver: local
cache:
driver: local

這個文件類似於上面的 docker-compose 文件。 這裡的主要變化是 api 現在的服務還取決於 cache 服務是我們的 Redis 服務器。 除此之外,在 API 服務中,我們將 Redis 相關憑證作為額外的環境變量傳遞,例如 REDIS_HOST, REDIS_PORT, 和 REDIS_PASSWORD. 這些部分已在上述文件中突出顯示。

當我們做一個常規的 docker-compose up 使用這個 docker-compose.yml 文件,它將產生類似於以下的輸出:

使用 docker-compose 運行 Redis,包括 Node.js 和 Postgres - 輸出

根據 Postgres 容器是否有數據,它的行為會有所不同。 現在如果我們打 它將顯示以下輸出:

使用 docker Redis 輸出 Node.js 和 Postgres API

刷新此頁面 2-3 次並返回 docker-compose 控制台選項卡,我們應該會看到類似於以下內容:

使用 Redis Docker 更快的響應時間

正如我們在上面看到的,第一次點擊進入數據庫,花了 328.118 毫秒來獲取作者的報價 Chris. 所有後續請求都從 Redis 緩存中獲取請求,並且速度超快,響應時間在 5.7 到 3.48 毫秒之間。 由於緩存內容存在 10 分鐘,如果我們運行 redis-cli 使用以下命令在容器內:

docker exec -it nodejs-posgresql_cache_1 redis-cli -a eYVX7EwVmmxKPCDmwMtyKVge8oLd2t81

然後我們可以看到緩存鍵的內容和它的值: KEYS * 列出所有鍵。 要列出找到的鍵的值,我們可以使用 MGET quotes_author_chris_1 它將向我們顯示該特定鍵的內容,如下所示:

Redis Docker 緩存 API 響應的內容

PostgreSQL 查詢緩存將使後續調用的處理速度更快,但如果數據庫上有很多(數千或數百萬)行,那麼查詢緩存就不會那麼好用。 正如您在上面看到的,這就是存儲在 Redis 等內存中的鍵值緩存將極大地提升性能的地方。 為本教程所做的更改可作為 拉取請求 供你參考。

結論 #

我們看到瞭如何將 Redis 與 docker 和 docker-compose 一起使用。 我們還將 Redis 作為緩存添加到現有的 Node.js API 中,並見證了性能優勢。

我希望這可以幫助您了解如何在任何帶有 docker 和 docker-compose 的應用程序中輕鬆使用 Redis。

繼續緩存!

發佈留言