Redis中的配置與優(yōu)化過程
一、 Redis 介紹
1. 關(guān)系型數(shù)據(jù)庫與非關(guān)系型數(shù)據(jù)庫
數(shù)據(jù)庫按照數(shù)據(jù)庫的結(jié)構(gòu)可以分為關(guān)系型數(shù)據(jù)庫與其他數(shù)據(jù)庫,而這些其他數(shù)據(jù)庫我們將其統(tǒng)稱為非關(guān)系型數(shù)據(jù)庫。
(1) 關(guān)系型數(shù)據(jù)庫
關(guān)系型數(shù)據(jù)庫是一個結(jié)構(gòu)化的數(shù)據(jù)庫,創(chuàng)建在關(guān)系模型基礎(chǔ)上,一般面向于記錄。它借助于集合代數(shù)等數(shù)學(xué)概念和方法來處理數(shù)據(jù)庫中的數(shù)據(jù)。關(guān)系模型就是指二維表格模型,因而一個關(guān)系型數(shù)據(jù)庫就是由二維表及其之間的聯(lián)系組成的一個數(shù)據(jù)組織。現(xiàn)實世界中,各種實體與實體之間的各種聯(lián)系都可以用關(guān)系模型來表示。SQL 語句(標準數(shù)據(jù)查詢語言)就是一種基于關(guān)系型數(shù)據(jù)庫的語言,用于執(zhí)行對關(guān)系型數(shù)據(jù)庫中數(shù)據(jù)的檢索和操作。
(2) 非關(guān)系型數(shù)據(jù)庫
NoSQL(NoSQL = Not 0nly SQL),意思是“不僅僅是 SQL”,是非關(guān)系型數(shù)據(jù)庫的總稱。主流的 NoSQL 數(shù)據(jù)庫有 Redis、MongBD、Hbase、CouhDB 等等。以上這些非關(guān)系型數(shù)據(jù)庫,他們的存儲方式、存儲結(jié)構(gòu)以及使用的場景都是完全不同的。所以我們認為它是一個非關(guān)系型數(shù)據(jù)庫的集合,而不是像關(guān)系型數(shù)據(jù)庫一樣,是一個統(tǒng)稱。換言之,除了主流的關(guān)系型數(shù)據(jù)庫以外的數(shù)據(jù)庫,都可以認為是非關(guān)系型的。NoSQL 數(shù)據(jù)庫憑借著其非關(guān)系型、分布式、開源及橫向擴展等優(yōu)勢,被認為是下一代數(shù)據(jù)庫產(chǎn)品。
2. Redis 基礎(chǔ)
2.1 Redis 簡介
Redis (RemoteDictionaryServer,遠程字典型)是一個開源的、使用C語言編寫的 NoSQL 數(shù)據(jù)庫。Redis 基于內(nèi)存運行并支持持久化,采用 key-value(鍵值對)的存儲形式,是目前分布式架構(gòu)中不可或缺的一環(huán)。
Redis 服務(wù)器程序是單進程模型,也就是再一臺服務(wù)器上可以同時啟動多個 Redis 進程,而 Redis 的時間處理速度則是完全依靠與主進程的執(zhí)行效率。若再服務(wù)器上只運行一個 Redis 進程,當(dāng)多個客戶端訪問的時,服務(wù)器的處理能力是會有一定程度的下降;若再同一太服務(wù)器上開啟多個 Redis 進程,Redis 在提高并發(fā)處理能力的同時會給服務(wù)器的 CPU 造成很大壓力。即:在實際生產(chǎn)環(huán)境中,需要根據(jù)實際的需求來決定開啟多少個Redis 進程。若對高并發(fā)要求更高一些,可能會考慮在同一臺服務(wù)器上開啟多個進程。若 CPU 資源比較緊張,采用單進程即可。
Redis 具有以下幾個優(yōu)點:
- 具有極高的數(shù)據(jù)讀寫速度,數(shù)據(jù)讀取的速度最高可達到 110000 次/s,數(shù)據(jù)寫入速度最高可達到 81000 次/s。
- 支持豐富的數(shù)據(jù)類型,不僅僅支持簡單的 key-value 類型的數(shù)據(jù),還支持Strings,Lists,Hashes,Sets 及 0rdered Sets 等數(shù)據(jù)類型操作。
- 支持數(shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保存在磁盤中,重啟的時候可以再次加載進行使用。
- 原子性,Redis 所有操作都是原子性的
- 支持數(shù)據(jù)備份,即 master-salve 模式的數(shù)據(jù)備份。
Redis 作為基于內(nèi)存運行的數(shù)據(jù)庫,緩存是其最常應(yīng)用的場景之一。除此之外,Redis常見應(yīng)用場景還包括獲取最新 N個數(shù)據(jù)的操作、排行榜類應(yīng)用、計數(shù)器應(yīng)用、存儲關(guān)系、實時分析系統(tǒng)、日志記錄。
2.2 安裝部署
Redis 的安裝相對于其他服務(wù)來說比較簡單 。首先需要到 Redis 官網(wǎng)(https://www.redis.io)下載相應(yīng)的源碼軟件包,然后上傳至 Linux 系統(tǒng)的服務(wù)器中進行解壓、安裝。本文以 redis-4.0.9.tar.gz 為例進行 Redis 服務(wù)的安裝和配置。
通常情況下,在 Linux 系統(tǒng)中進行源碼編譯安裝,需要先執(zhí)行./configure進行環(huán)境檢查與配置,從而生成 Makefile 文件,再執(zhí)行 make && make install命令進行編譯安裝。而 Redis 源碼包中直接提供了 Makefile 文件,所以在解壓完軟件包后,可直接進入解壓后的軟件包目錄,執(zhí)行make與 make insta11命令進行安裝。
dnf -y install tar gcc zlib-devel tar xvzf redis-4.0.9. tar.gz tar xvzf redis-4.0.9. tar.gz cd redis-4.0.9/ make && make PREFIX=/usr/local/redis install ln-s /usr/local/redis/bin/* /usr/local/bin/
make insta11 只是安裝了二進制文件到系統(tǒng)中,并沒有啟動腳本和配置文件。
軟件包中默認提供了一個 install server.sh 腳本文件,通過該腳本文件可以設(shè)置 Redis 服務(wù)所需要的相關(guān)配置文件。
當(dāng)腳本運行完畢,Redis 服務(wù)就已經(jīng)啟動,默認偵聽端口為 6379。
cd utils/ ./install server.sh /etc/init.d/redis 6379 start
2.3 配置參數(shù)
Redis 主配置文件為/etc/redis/6379.conf,由注釋行與設(shè)置行兩部分組成。與大多數(shù) Linux 配置文件一樣,注釋性的文字以“#”開始,包含了對相關(guān)配置內(nèi)容進行的說明和解釋。
除了注釋行與空行以外的內(nèi)容即為設(shè)置行。
可根據(jù)生產(chǎn)環(huán)境的需求調(diào)整相關(guān)參數(shù),如下:
vim /etc/redis/6379.conf bind 127.0.0.1 192.168.10.161 //監(jiān)聽的主機地址 port 6379 //端日 daemonize yes //啟用守護進程 pidfile /var/run/redis 6379.pid //指定 PID 文件 loglevel notice //日志級別 logfile /var/log/redis 6379.1og //指定日志文件
3. Redis 命令工具
Redis 軟件提供了多個命令工具。安裝 Redis 服務(wù)時,所包含的軟件工具會同時被安裝到系統(tǒng)中,在系統(tǒng)中可以直接使用。
這些命令工具的作用分別如下所示:
- redis-server:用于啟動 Redis 的工具
- redis-benchmark:用于檢測 Redis 在本機的運行效率
- redis-check-aof:修復(fù) AOF 持久化文件
- redis-check-rdb:修復(fù) RDB 持久化文件
- redis-cli:Redis 命令行工具
3.1 redis-cli 命令行工具
Redis 數(shù)據(jù)庫系統(tǒng)也是一個典型的 C/S(客戶端/服務(wù)器端)架構(gòu)的應(yīng)用,要訪問 Redis 數(shù)據(jù)庫需要使用專門的客戶端軟件。
Redis 服務(wù)的客戶端軟件就是其自帶的 redis-cli 命令行工具。
使用 redis-cli 連接指定數(shù)據(jù)庫,連接成功后會進入提示符為“遠程主機 IP 地址:端口號>”的數(shù)據(jù)庫操作環(huán)境.
3.2 redis-benchmark 測試工具
redis-benchmark 是官方自帶的 Redis 性能測試工具,可以有效的測試Redis 服務(wù)的性能。
基本的測試語法為 redis-benchmark[option] [optionvalue]。
常用選項如下所示:
- -h:指定服務(wù)器主機名
- P:指定服務(wù)器端口
- -s:指定服務(wù)器 socket
- -c:指定并發(fā)連接數(shù)
- -n:指定請求數(shù)
- -d:以字節(jié)的形式指定 SET/GET 值的數(shù)據(jù)大小
- -k:1=keep alive =reconnect
- -r:SET/GET/INCR 使用隨機 key,SADD 使用隨機值
- -p:通過管道傳輸<numreg>請求
- -q:強制退出 redis。僅顯示 query/sec 值
- --csv:以CSV 格式輸出
- -l:生成循環(huán),永久執(zhí)行測試
- -t:僅運行以逗號分隔的測試命令列表
- -I:Idle 模式。僅打開 N個idle 連接并等待
4. redis 數(shù)據(jù)庫常用命令
前面提到 Redis 數(shù)據(jù)庫采用 key-value(鍵值對)的數(shù)據(jù)存儲形式。
所使用的命令是 set與 get 命令。
- set:存放數(shù)據(jù),基本的命令格式為 set key value。
- get:獲取數(shù)據(jù),基本的命令格式為 get key。
4.1 key 相關(guān)命令
在 Redis 數(shù)據(jù)庫中,與 key 相關(guān)的命令主要包含以下幾種。
(1) keys
用于查找和模式匹配的鍵
KEYS * # 查看所有鍵 KEYS user:* # 查看以user:開頭的鍵
(2) exists
檢查鍵是否存在
SET name "Alice" # 設(shè)置鍵值 EXISTS name # 返回1(存在) EXISTS age # 返回0(不存在)
(3) del
刪除一個或多個鍵
SET a 1 SET b 2 # 設(shè)置兩個鍵 DEL a b # 刪除兩個鍵,返回2(成功刪除的數(shù)量)
(4) type
獲取鍵的數(shù)據(jù)類型
SET num 100 # 設(shè)置字符串 TYPE num # 返回string LPUSH list 1 2 # 創(chuàng)建列表 TYPE list # 返回list
(5) rename
重命名鍵
SET msg "hello" # 設(shè)置鍵值 RENAME msg greeting # 重命名鍵 GET greeting # 返回"hello"
(6) renamenX
僅在新鍵不存在時重命名
SET old "value" # 設(shè)置舊鍵 SET new "other" # 設(shè)置新鍵 RENAMENX old new # 返回0(新鍵已存在) DEL new # 刪除新鍵 RENAMENX old new # 返回1(重命名成功)
(7) dbsize
查看當(dāng)前數(shù)據(jù)庫的鍵總數(shù)
DBSIZE # 返回當(dāng)前數(shù)據(jù)庫的鍵數(shù)量
二、 Redis 持久化
1. RDB 和 AOF 的區(qū)別
| 維度 | RDB(快照持久化) | AOF(日志持久化) |
| 持久化方式 | 定時生成數(shù)據(jù)庫快照文件(.rdb),保存某一時刻的全量數(shù)據(jù)。 | 記錄所有寫操作命令日志,以追加方式寫入文件(.aof)。 |
| 數(shù)據(jù)安全性 | 可能丟失最后一次快照到故障期間的數(shù)據(jù)(取決于快照間隔)。 | 可配置每秒同步(最多丟失 1 秒數(shù)據(jù))或?qū)崟r同步,數(shù)據(jù)更安全。 |
| 文件大小 | 快照文件緊湊,占用空間小。 | 日志文件可能較大(需定期重寫)。 |
| 恢復(fù)速度 | 加載快照速度快,適合大規(guī)模數(shù)據(jù)恢復(fù)。 | 重放日志速度較慢,尤其是日志文件很大時。 |
| 對性能影響 | 快照生成時可能有短暫阻塞(Fork 子進程)。 | 持續(xù)寫入日志對性能影響較小(取決于同步策略)。 |
2. RDB 和 AOF 的優(yōu)缺點
2.1 RDB 優(yōu)缺點
優(yōu)點:
- 文件體積小:適合備份和遠程傳輸,占用磁盤空間少。
- 恢復(fù)速度快:直接加載二進制快照,比重放日志更快。
- 對主進程影響小:快照生成由子進程完成,主進程無需阻塞(除 Fork 瞬間)。
缺點:
- 數(shù)據(jù)丟失風(fēng)險:若快照間隔較長(如 5 分鐘),故障時可能丟失大量數(shù)據(jù)。
- 生成快照時阻塞:Fork 子進程時可能阻塞主進程(取決于數(shù)據(jù)量)。
2.2 AOF 優(yōu)缺點
優(yōu)點:
- 數(shù)據(jù)安全性高:可配置
appendfsync always實時同步,幾乎不丟數(shù)據(jù)。 - 日志可讀性強:AOF 文件本質(zhì)是命令日志,可手動解析或修改(需謹慎)。
- 增量寫入:持續(xù)追加日志,無磁盤隨機寫操作,更適合機械硬盤。
缺點:
- 文件膨脹問題:長期寫入會導(dǎo)致 AOF 文件過大,需定期重寫。
- 恢復(fù)速度慢:重放所有日志命令,數(shù)據(jù)量大時恢復(fù)耗時較長。
- 性能開銷:
appendfsync always會降低寫入性能(每次寫操作都同步磁盤)。
3. Redis 持久化配置
3.1 RDB 持久化配置
RDB 配置在redis.conf中,核心參數(shù):
# 快照觸發(fā)條件:900秒內(nèi)至少1個鍵變更,或300秒內(nèi)至少10個鍵變更,或60秒內(nèi)至少10000個鍵變更 save 900 1 save 300 10 save 60 10000 # 禁用RDB(注釋掉所有save配置) # save "" # RDB文件名和存儲目錄 dbfilename dump.rdb dir /var/lib/redis/
3.2 AOF 持久化配置
開啟 AOF 并配置同步策略:
# 啟用AOF appendonly yes # AOF同步策略: # always:每次寫操作都同步磁盤(性能最低,數(shù)據(jù)最安全) # everysec:每秒同步一次(默認,推薦) # no:由操作系統(tǒng)決定(性能最高,數(shù)據(jù)可能丟失最多) appendfsync everysec # 當(dāng)AOF文件大小超過上次重寫后體積的100%時觸發(fā)自動重寫 auto-aof-rewrite-percentage 100 # 當(dāng)AOF文件至少達到64MB時才觸發(fā)自動重寫 auto-aof-rewrite-min-size 64mb
4. AOF 重寫
- 作用:壓縮 AOF 文件,移除冗余命令(如多次修改同一鍵的歷史操作)。
- 觸發(fā)方式:手動觸發(fā):
BGREWRITEAOF命令。自動觸發(fā):滿足auto-aof-rewrite-percentage和auto-aof-rewrite-min-size配置。 - 原理:Redis 通過子進程遍歷當(dāng)前數(shù)據(jù)庫,生成新的 AOF 日志(僅包含最終數(shù)據(jù)狀態(tài)的命令),并替換舊文件,過程中不阻塞主進程(基于 Copy-On-Write 機制)。
三、 性能管理
1. 內(nèi)存碎片化
- 原因:Redis 使用內(nèi)存分配器(如 jemalloc)管理內(nèi)存,分配和釋放小對象時可能產(chǎn)生碎片。
- 查看方式:通過
INFO memory命令查看mem_fragmentation_ratio(理想值 1.0~1.5)。 - 解決方法:重啟 Redis(重建內(nèi)存布局)。調(diào)整分配器參數(shù)(如 jemalloc 的
malloc_profile)或更換分配器(如 tcmalloc)。
2. 內(nèi)存使用率
2.1 針對緩存數(shù)據(jù)大小選擇
- 避免存儲過大的 value(如大字符串),可拆分為多個小 key 或使用壓縮(如
COMPRESS命令)。 - 示例:存儲 100 萬用戶信息時,用
Hash結(jié)構(gòu)(HSET user:1 name "Alice")比 100 萬個字符串鍵更省空間。
2.2 使用 Hash 數(shù)據(jù)結(jié)構(gòu)
當(dāng)數(shù)據(jù)包含多個字段時,用Hash代替多個獨立字符串鍵:
# 推薦方式(節(jié)省內(nèi)存) HSET user:1 name "Alice" age 25 city "Beijing" # 不推薦方式(每個字段一個鍵) SET user:1:name "Alice" SET user:1:age "25" SET user:1:city "Beijing"
2.3 設(shè)置 key 的過期時間
- 對臨時數(shù)據(jù)設(shè)置過期時間(
EXPIRE key seconds),避免無用數(shù)據(jù)長期占用內(nèi)存。
3. 回收 key
過期策略:
- 惰性刪除:獲取 key 時檢查是否過期,過期則刪除。
- 定期刪除:Redis 定期隨機檢查部分 key,刪除過期鍵。
內(nèi)存淘汰策略(當(dāng)內(nèi)存不足時):
volatile-lru:從設(shè)置過期時間的鍵中刪除最久未使用的。allkeys-lru:從所有鍵中刪除最久未使用的(推薦常用場景)。volatile-random:隨機刪除設(shè)置過期時間的鍵。noeviction:拒絕寫入操作(默認策略,需手動配置為其他策略)。
配置方式:
- 在
redis.conf中設(shè)置maxmemory-policy allkeys-lru。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
一文了解發(fā)現(xiàn)并解決Redis熱key與大key問題
熱key是服務(wù)端的常見問題,本文主要介紹Redis熱key與大key問題的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05
使用Redis快速實現(xiàn)共享Session登錄的詳細步驟
在Web開發(fā)中,Session通常用于存儲用戶的會話信息,允許用戶在多個頁面之間保持登錄狀態(tài),Redis是一個開源的高性能鍵值數(shù)據(jù)庫,廣泛用于緩存、消息隊列、會話存儲等場景,本文給大家介紹了如何使用Redis實現(xiàn)共享Session登錄,需要的朋友可以參考下2025-08-08

