如何管理 Redis 數據庫和密鑰

介紹

Redis是一個開源的,內存鍵值數據存儲庫。一個鍵值數據存儲是一種NoSQL數據庫,其中用作其相應的唯一標識符。任何給定的Redis實例都包括多個數據庫,每個數據庫都可以包含多個不同類型的數據類型的鍵。

在本教程中,您將學習如何選擇數據庫,在不同數據庫之間移動鍵,以及管理和刪除鍵。

如何使用本指南

本指南以速查表的形式編寫,其中包含獨立的示例。我們鼓勵您跳到與您正在嘗試完成的任務相關的任何部分。

這份指南中顯示的命令已在運行Redis版本6.0.16的Ubuntu 22.04伺服器上進行了測試。要建立類似的環境,您可以按照我們的指南《如何在Ubuntu 22.04上安裝和保護Redis》的第1步。我們將通過使用redis-cli,即Redis命令行界面,運行這些命令來演示它們的行為。請注意,如果您使用不同的Redis界面,例如Redli,某些命令的確切輸出可能會有所不同。

或者,您可以提供一個托管的Redis數據庫實例來測試這些命令,但根據您的數據庫提供商允許的控制級別,本指南中的某些命令可能無法按照描述的方式工作。要提供DigitalOcean托管的數據庫,請參閱我們的托管數據庫產品文檔。然後,您必須安裝Redli設置TLS隧道以便通過TLS連接到托管的數據庫。

管理數據庫

開箱即用,Redis 實例支援 16 個邏輯資料庫。這些資料庫彼此有效地隔離,當您在一個資料庫中執行命令時,不會影響 Redis 實例中其他資料庫中的任何資料。

Redis 資料庫的編號從 015,預設情況下,當您連接到 Redis 實例時,會連接到資料庫 0。但是,您可以在連接後使用 select 命令切換您正在使用的資料庫:

  1. select 15

如果您選擇了非 0 的資料庫,它將反映在 redis-cli 提示中:

要將一個資料庫中保存的所有資料與另一個資料庫中保存的資料互換,請使用 swapdb 命令。以下示例將交換資料庫 6 中保存的資料與資料庫 8 中保存的資料,任何連接到這兩個資料庫的客戶端都將立即實現這些變更:

  1. swapdb 6 8

swapdb 如果互換成功將返回 OK

如果您想將一個鍵移動到不同的 Redis 實例,可以運行 migrate。此命令在從來源實例刪除鍵之前確保鍵存在於目標實例上。執行 migrate 命令時,必須按照以下順序包含以下元素:

  • 目標資料庫的主機名或 IP 地址
  • 目標資料庫的埠號
  • 要遷移的鍵的名稱
  • 要在目標實例上存儲該鍵的資料庫編號
  • A timeout, in milliseconds, which defines the maximum amount of idle communication time between the two machines. Note that this isn’t a time limit for the operation, but means that the operation should always make some level of progress within the defined length of time

為了舉例說明,這裡有一個例子:

  1. migrate 203.0.113.0 6379 key_1 7 8000

此外,migrate 允許在 timeout 參數之後添加以下選項:

  • COPY:指定該鍵不應從來源實例中刪除
  • REPLACE:指定如果目標上已存在該鍵,則 migrate 操作應該刪除並替換它
  • KEYS:不提供要遷移的特定鍵,您可以輸入空字符串("")然後使用從 keys 命令遷移匹配模式的任何鍵的語法。有關 keys 如何工作的更多信息,請閱讀我們的教程:如何在 Redis 中解決問題

管理鍵

有許多 Redis 命令可用於管理鍵,無論它們保存的是什麼類型的數據。以下部分將介紹其中一些命令。

rename 將重命名指定的鍵。如果成功,它將返回 OK

  1. rename old_key new_key

您可以使用 randomkey 從當前選定的數據庫返回一個隨機鍵:

  1. randomkey
Output
"any_key"

使用type來確定給定鍵持有的數據類型。該命令的輸出可以是stringlisthashsetzsetstream:

  1. type key_1
Output
"string"

如果指定的鍵不存在,type將返回none

您可以使用move命令將單個鍵移動到Redis實例中的另一個數據庫。 move接受一個鍵的名稱和您想要將鍵移動到的數據庫作為參數。例如,要將鍵key_1移動到數據庫8,您可以運行以下命令:

  1. move key_1 8

如果移動鍵成功,move將返回OK

刪除鍵

要刪除任何數據類型的一個或多個鍵,請使用del命令,然後跟隨一個或多個要刪除的鍵:

  1. del key_1 key_2

如果此命令成功刪除鍵,它將返回(integer) 1。否則,它將返回(integer) 0

unlink命令執行與del類似的功能,不同之處在於del會阻塞客戶端,因為服務器會回收鍵占用的內存。如果要刪除的鍵與一個小對象關聯,則del回收內存所需的時間非常短,甚至可能不會注意到阻塞時間。

然而,如果要刪除的鍵與許多對象關聯,例如具有數千或數百萬個字段的哈希,則可能會變得不方便。刪除這樣的鍵可能需要相當長的時間,並且在完全從服務器的內存中刪除之前,您將被阻止執行任何其他操作。

unlink,但首先確定釋放佔用鍵的內存的成本。如果很小,那麼unlink將與del相同地立即刪除鍵,同時阻塞客戶端。但是,如果釋放鍵的內存的成本很高,unlink將通過創建另一個線程並在後台逐步回收內存而非阻塞客戶端地刪除鍵:

  1. unlink key_1

由於它在後台運行,通常建議您使用unlink從您的服務器中刪除鍵,以減少客戶端的錯誤,儘管在許多情況下del也足夠。

警告:以下兩個命令被認為是危險的flushdbflushall命令將分別不可逆地刪除單個數據庫中的所有鍵以及Redis服務器上每個數據庫中的所有鍵。建議僅在您絕對確定要刪除數據庫或服務器中的所有鍵時才運行這些命令。

或許將這些命令重新命名為具有較低意外運行機率的名稱,對您有利。

要刪除所選擇的資料庫中的所有鍵,請使用flushdb命令:

  1. flushdb

要刪除 Redis 伺服器上每個資料庫中的所有鍵(包括目前選擇的資料庫),請運行flushall

  1. flushall

flushdbflushall都接受async選項,該選項允許您異步刪除單個資料庫或叢集中的每個資料庫中的所有鍵。這使它們可以類似於unlink命令運作,並且將創建一個新線程來在後台逐步釋放內存。

備份您的資料庫

要創建目前選擇的資料庫的備份,您可以使用save命令:

  1. save

這將導出當前數據集的快照為一個.rdb文件,這是一個資料庫轉儲文件,以內部壓縮序列化格式保存數據。

save 命令是同步运行的,会阻塞连接到数据库的其他客户端。因此,save 命令的文档建议在生产环境中几乎不要运行该命令。相反,建议使用 bgsave 命令。这会告诉 Redis 分叉数据库:父进程将继续为客户端提供服务,而子进程在退出之前保存数据库:

  1. bgsave

请注意,在进行 bgsave 操作时,如果客户端添加或修改数据,这些更改不会被捕获在快照中。

您还可以编辑 Redis 配置文件,设置 Redis 在一定时间内自动保存快照(称为快照RDB模式),如果数据库发生了最小数量的更改。这被称为保存点。以下保存点设置在 redis.conf 文件中默认启用:

/etc/redis/redis.conf
. . .
save 900 1
save 300 10
save 60 10000
. . .
dbfilename "nextfile.rdb"
. . .

使用这些设置,Redis 将根据 dbfilename 参数将数据库的快照导出到文件中,如果至少更改了一个键,则每 900 秒导出一次,如果至少更改了 10 个键,则每 300 秒导出一次,如果至少更改了 10000 个键,则每 60 秒导出一次。

您可以使用 shutdown 命令备份 Redis 数据,然后关闭连接。该命令将阻塞连接到数据库的每个客户端,然后执行 save 操作(如果配置了至少一个保存点),这意味着它将以当前状态将数据库导出到一个 .rdb 文件中,同时阻止客户端进行任何更改。

此外,如果已啟用追加模式,則shutdown命令將在退出之前刷新對Redis追加模式的所有更改。 追加模式文件模式(AOF)涉及在每次快照之后的服务器上創建一個以.aof結尾的文件中的每個寫操作的日誌。可以在同一台服務器上啟用AOF和RDB模式,並使用這兩種持久化方法是備份數據的有效方法。

簡而言之,shutdown命令本質上是一個阻塞save命令,還會刷新所有最近對追加模式文件的更改並關閉到Redis實例的連接:

警告:shutdown命令被認為是危險的。通過阻塞Redis服務器的客戶端,您可能會使依賴於它的用戶和應用程序無法訪問您的數據。建議只有在測試Redis行為或絕對確定要阻塞所有Redis服務器的客戶端時才運行此命令。

實際上,將這個命令重新命名為一個更不太可能意外運行的名稱可能符合您的利益。

  1. shutdown

如果您尚未配置任何保存點但仍希望Redis執行save操作,請將save選項附加到shutdown命令中:

  1. shutdown save

如果您至少配置了一個保存點,但想要關閉 Redis 伺服器而不進行保存,您可以將 nosave 參數添加到命令中:

  1. shutdown nosave

請注意,隨著時間的推移,附加只讀文件可能會變得非常長,但您可以通過編輯 redis.conf 文件,根據某些變量來配置 Redis 重新編寫文件。您還可以通過運行 bgrewriteaof 命令來指示 Redis 重新編寫附加只讀文件:

  1. bgrewriteaof

bgrewriteaof 將創建一組最短的命令,以將數據庫恢復到其當前狀態。正如此命令的名稱所示,它將在後台運行。但是,如果另一個持久性命令已經在後台進程中運行,則必須在 Redis 執行 bgrewriteaof 命令之前完成該命令。

結論

本指南詳細介紹了用於管理數據庫和鍵的一些命令。如果您在本指南中想了解其他相關命令、參數或程序,請在評論中提出請求或建議。

有關 Redis 命令的更多信息,請查看我們的教程系列 如何管理 Redis 數據庫

Source:
https://www.digitalocean.com/community/cheatsheets/how-to-manage-redis-databases-and-keys