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

