Redis(Remote Dictionary Server ),即遠(yuǎn)程字典服務(wù),是一個(gè)開源的使用ANSI C語(yǔ)言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫(kù),并提供多種語(yǔ)言的API
成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),無(wú)錫企業(yè)網(wǎng)站建設(shè),無(wú)錫品牌網(wǎng)站建設(shè),網(wǎng)站定制,無(wú)錫網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,無(wú)錫網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。mysql與redis的區(qū)別:
類型上mysql是關(guān)系型數(shù)據(jù)庫(kù),而redis是緩存數(shù)據(jù)庫(kù);
作用上mysql用于持久化的存儲(chǔ)數(shù)據(jù)到硬盤,功能強(qiáng)大,但速度較慢;而redis用于存儲(chǔ)使用較為頻繁的數(shù)據(jù)到緩存中,讀取速度快
mysql和redis因?yàn)樾枨蟮牟煌?,一般都是配合使?/p>
后端除了用Mysql/Oracle還要用Redis的原因
內(nèi)存和磁盤的時(shí)延差
Mysql數(shù)據(jù)庫(kù)高性能成本高,同樣機(jī)器配置下,Redis性能比Mysql數(shù)據(jù)明顯更快
互聯(lián)網(wǎng)公司 100%必用現(xiàn)在 很多項(xiàng)目都在用
緩存技術(shù)在后端架構(gòu)中的應(yīng)用
數(shù)據(jù)存儲(chǔ)方式:出于數(shù)據(jù)持久化考慮,數(shù)據(jù)會(huì)保存一份在 關(guān)系型數(shù)據(jù)庫(kù);出于高性能角度考慮,數(shù)據(jù)還會(huì)存儲(chǔ)一份在 Redis這中內(nèi)存型數(shù)據(jù)庫(kù)中
緩存應(yīng)用流程:
數(shù)據(jù)寫入:一般使用關(guān)系型 數(shù)據(jù)庫(kù)
數(shù)據(jù)查詢: 先查 Redis緩存, 沒(méi)查到再去查詢數(shù)據(jù)庫(kù)
高并發(fā)系統(tǒng)架構(gòu):讀多寫少 用緩存
如果程序初次運(yùn)行,此時(shí)由于數(shù)據(jù)尚未加載到緩存,則程序的響應(yīng)時(shí)間會(huì)明顯變長(zhǎng)。對(duì)應(yīng)到性能測(cè)試的現(xiàn)象--程序剛啟動(dòng),非常不穩(wěn)定,它的性能 明顯 低于 已經(jīng)運(yùn)行一段時(shí)間的
注意需要測(cè)試場(chǎng)景:
1). 測(cè)試 緩存沒(méi)有的情況, 系統(tǒng)性能是怎么樣的? 以及 多久才能恢復(fù)到正常的性能(找開發(fā) - 把數(shù)據(jù)清空,模擬干凈的環(huán)境)
2). 測(cè)試 緩存已經(jīng)加載的情況, 系統(tǒng)運(yùn)行了一段時(shí)間,各種業(yè)務(wù)場(chǎng)景都執(zhí)行過(guò)幾輪之后
2.緩存雪崩redis目前架構(gòu)來(lái)水,不能保障100%數(shù)據(jù)不丟失,因此需要檢查系統(tǒng)是否能容忍緩存出問(wèn)題。
模擬redis出現(xiàn)故障的場(chǎng)景,1).檢查多少秒之內(nèi),需要恢復(fù)redis緩存服務(wù);2). 如果緩存失效,導(dǎo)致高并發(fā)請(qǐng)求懟到數(shù)據(jù)庫(kù),是否會(huì)出現(xiàn)異常
3.緩存擊穿如果查詢的目標(biāo)是不存在于系統(tǒng)中的數(shù)據(jù),則緩存必然失效,緩存大量Miss,高并發(fā)請(qǐng)求同樣大量懟到數(shù)據(jù)庫(kù),可能會(huì)導(dǎo)致系統(tǒng)崩潰
四、Redis瓶頸分析 1.服務(wù)器資源1)機(jī)器資源不夠,存不下太多數(shù)據(jù):可考慮搭建redis集群
2)檢查redis自己是否占用了服務(wù)器這么多資源,可使用內(nèi)置的info命令,查看到如下多個(gè)小節(jié)信息:
server :獲取 server 信息
屬性名 屬性值 說(shuō)明
redis_version 5.0.3 Redis 服務(wù)版本號(hào)
redisgitsha1 00000000 Git SGA1
redisgitdirty 0 Git dirty flag
redisbuildid 89e87c8197752890 Redis build ID
redis_mode standalone 運(yùn)行模式,分為:standalone、sentinel、cluster
os Darwin 18.2.0 x86_64 Redis 所在機(jī)器的操作系統(tǒng)
arch_bits 64 架構(gòu)(32位或者64位)
multiplexing_api kqueue Redis 所使用的事件處理機(jī)制
atomicvar_api atomic-builtin Atomicvar API
gcc_version 4.2.1 編譯 Redis 時(shí)所使用的 GCC 版本
process_id 40163 服務(wù)進(jìn)程 ID
run_id c4f8bb49f8214f406725136e6f589b46502a0e00 run_id
tcp_port 6379 監(jiān)聽端口
uptimeinseconds 496059 自 Redis 服務(wù)器啟動(dòng)已來(lái),運(yùn)行的秒數(shù)
uptimeindays 5 自 Redis 服務(wù)啟動(dòng)已來(lái),運(yùn)行的天數(shù)
hz 10 serverCron 每秒運(yùn)行次數(shù)
configured_hz 10
lru_clock 5452491 以分鐘為單位進(jìn)行自增的時(shí)鐘,用于 LRU 管理
executable /../redis-5.0.3/src/./redis-server 運(yùn)行文件
config_file /../redis-5.0.3/redis.conf 配置文件
clients :獲取 clients 信息,如客戶端連接數(shù)等
connected_clients 1: 當(dāng)前客戶端連接數(shù)
clientrecentmaxinputbuffer 2: 當(dāng)前連接的客戶端當(dāng)中,大輸入緩存
clientrecentmaxoutputbuffer 0: 當(dāng)前連接的客戶端當(dāng)中,最長(zhǎng)的輸出列表
blocked_clients 0 正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH):的客戶端的數(shù)量
memory :獲取 server 的內(nèi)存信息,包括當(dāng)前內(nèi)存消耗、內(nèi)存使用峰值
used_memory 18813680:由 redis 分配器(標(biāo)準(zhǔn)libc,jemalloc或其他分配器,例如tcmalloc)分配的內(nèi)存總量,以字節(jié)(byte)為單位
usedmemoryhuman 17.94M:redis 分配的內(nèi)存總量
usedmemoryrss 1945600 從操作系統(tǒng)的角度,Redis 已分配的內(nèi)存總量(俗稱常駐集大?。_@個(gè)值和 top、ps 等命令的輸出一致。
usedmemoryrss_human 1.86M:操作系統(tǒng)角度,返回 redis 分配的內(nèi)存總量
usedmemorypeak 18900752:redis 的內(nèi)存消耗峰值(以字節(jié)為單位)
usedmemorypeak_human 18.03M:Redis 的內(nèi)存消耗峰值
usedmemorypeak_perc 99.54%:usedmemorypeak在used_memory中所占的百分比
usedmemoryoverhead 11135798:分配用于管理其內(nèi)部數(shù)據(jù)結(jié)構(gòu)的所有開銷的總字節(jié)數(shù)
usedmemorystartup 988448:?jiǎn)?dòng)時(shí)消耗的初始內(nèi)存量(以字節(jié)為單位)
usedmemorydataset 7677882:數(shù)據(jù)集的大?。ㄒ宰止?jié)為單位,usedmemory - usedmemory_overhead)
usedmemorydataset_perc 43.07%:usedmemorydataset在凈內(nèi)存(usedmemory-usedmemory_startup)使用量中所占的百分比
allocator_allocated 18780336:分配器分配的內(nèi)存
allocator_active 1907712:分配器活躍的內(nèi)存
allocator_resident 1907712:分配器常駐的內(nèi)存
totalsystemmemory 34359738368:主機(jī)擁有的內(nèi)存總量
totalsystemmemory_human 32.00G:主機(jī)擁有的內(nèi)存總量
usedmemorylua 37888:Lua引擎使用的字節(jié)數(shù)
usedmemorylua_human 37.00K:以可讀的格式返回Lua引擎使用內(nèi)存
usedmemoryscripts 0 usedmemoryscripts_human 0B numberofcached_scripts 0 maxmemory 0 配置設(shè)置的大可使用內(nèi)存值,默認(rèn)0,不限制
maxmemory_human 0B:以可讀的格式返回大可使用內(nèi)存值
maxmemory_policy noeviction:內(nèi)存容量超過(guò)maxmemory后的處理策略,noeviction當(dāng)內(nèi)存使用達(dá)到閾值的時(shí)候,所有引起申請(qǐng)內(nèi)存的命令會(huì)報(bào)錯(cuò)
allocatorfragratio 0.10:分配器的碎片率
allocatorfragbytes 18446744073692678992:分配器的碎片大?。ㄒ宰止?jié)為單位)
allocatorrssratio 1.00:分配器常駐內(nèi)存比例
allocatorrssbytes 0:分配器的常駐內(nèi)存大小(以字節(jié)為單位)
rssoverheadratio 1.02:常駐內(nèi)存開銷比例
rssoverheadbytes 37888:常駐內(nèi)存開銷大小(以字節(jié)為單位)
memfragmentationratio 0.10:內(nèi)存碎片率,usedmemoryrss 和 used_memory 之間的比率
memfragmentationbytes -16834736:內(nèi)存碎片的大?。ㄒ宰止?jié)為單位)
memnotcountedforevict 112:被驅(qū)逐的大小
memreplicationbacklog 0 repl_backlogmemclientsslaves 0 clients_slavesmemclientsnormal 49694 clients_normalmemaofbuffer 112 aof時(shí),占用的緩沖mem_allocator libc 內(nèi)存分配器(在編譯時(shí)選擇)
activedefragrunning 0:碎片整理是否處于活動(dòng)狀態(tài)
lazyfreependingobjects 0:等待釋放的對(duì)象數(shù)(由于使用ASYNC選項(xiàng)調(diào)用UNLINK或FLUSHDB和FLUSHALL)
persistence :獲取 server 的持久化配置信息
loading 0 記錄服務(wù)器是否正在載入持久化文件
rdbchangessincelastsave 0 最近一次成功創(chuàng)建持久化文件之后,經(jīng)過(guò)了多少秒
rdbbgsavein_progress 0 記錄了服務(wù)器是否正在創(chuàng)建 RDB 文件
rdblastsave_time 1582508875 最近一次成功創(chuàng)建 RDB 文件的 UNIX 時(shí)間戳
rdblastbgsave_status ok 記錄最近一次創(chuàng)建 RDB 文件的狀態(tài),是成功還是失敗
rdblastbgsavetimesec 1 記錄了最近一次創(chuàng)建 RDB 文件耗費(fèi)的秒數(shù)
rdbcurrentbgsavetimesec -1 如果正在創(chuàng)建 RDB 文件,記錄當(dāng)前的創(chuàng)建操作已經(jīng)耗費(fèi)的秒數(shù)
rdblastcow_size 0 上一次RBD保存操作期間寫時(shí)復(fù)制的大?。ㄒ宰止?jié)為單位)
aof_enabled 1 AOF是否開啟
aofrewritein_progress 0 記錄了是否正在創(chuàng)建 AOF 文件
aofrewritescheduled 0 記錄了 RDB 文件創(chuàng)建完畢之后,是否需要執(zhí)行 AOF 重寫操作
aoflastrewritetimesec -1 最近一次創(chuàng)建 AOF 文件耗費(fèi)的秒數(shù)
aofcurrentrewritetimesec -1 如果正在創(chuàng)建 AOF 文件,那么記錄當(dāng)前的創(chuàng)建操作耗費(fèi)的秒數(shù)
aoflastbgrewrite_status ok 記錄了最近一次創(chuàng)建 AOF 文件的狀態(tài),是成功還是失敗
aoflastwrite_status ok AOF的最后寫入操作的狀態(tài),是成功還是失敗
aoflastcow_size 0 上一次AOF保存操作期間寫時(shí)復(fù)制的大?。ㄒ宰止?jié)為單位)
aofcurrentsize 4747340 AOF 文件當(dāng)前的大小
aofbasesize 4746996 最近一次啟動(dòng)或重寫時(shí)的AOF文件大小
aofpendingrewrite 0 記錄了是否有 AOF 重寫操作在等待 RDB 文件創(chuàng)建完畢之后執(zhí)行
aofbufferlength 0 AOF緩沖區(qū)的大小
aofrewritebuffer_length 0 AOF 重寫緩沖區(qū)的大小
aofpendingbio_fsync 0 后臺(tái) I/O 隊(duì)列里面,等待執(zhí)行的 fsync 數(shù)量
aofdelayedfsync 0 被延遲的 fsync 調(diào)用數(shù)量,如果該值比較大,可以開啟參數(shù):no-appendfsync-on-rewrite=yes
stats :獲取 server 的一些基本統(tǒng)計(jì)信息,如處理過(guò)的連接數(shù)量等# 緩存命中次數(shù)越高,代表緩存起到了很大的作用。如:keyspace_hits:9808 命中 keyspace_misses:1 miss
totalconnectionsreceived 11 服務(wù)器接受的連接總數(shù)totalcommandsprocessed 48 服務(wù)器已執(zhí)行的命令數(shù)量instantaneousopsper_sec 0 服務(wù)器每秒鐘執(zhí)行的命令數(shù)量totalnetinput_bytes 1312 啟動(dòng)以來(lái),流入的字節(jié)總數(shù)totalnetoutput_bytes 114800 啟動(dòng)以來(lái),流出的字節(jié)總數(shù)instantaneousinputkbps 0.00 接收輸入的速率(每秒)instantaneousoutputkbps 0.00 輸出的速率(每秒)rejected_connections 0 由于maxclients限制而被拒絕的連接數(shù)sync_full 0 與slave full sync的次數(shù)syncpartialok 0 接受的部分重新同步(psync)請(qǐng)求的數(shù)量syncpartialerr 0 被拒絕的部分重新同步(psync)請(qǐng)求的數(shù)量expired_keys 0 key過(guò)期事件總數(shù)expiredstaleperc 0.00 過(guò)期的比率expiredtimecapreachedcount 0 過(guò)期計(jì)數(shù)evicted_keys 0 由于大內(nèi)存限制而被驅(qū)逐的key數(shù)量keyspace_hits 6 key命中次數(shù)keyspace_misses 0 key未命中次數(shù)pubsub_channels 0 發(fā)布/訂閱頻道的數(shù)量pubsub_patterns 0 發(fā)布/訂閱的模式數(shù)量latestforkusec 803 最近一次 fork() 操作耗費(fèi)的毫秒數(shù)(以微秒為單位)migratecachedsockets 0 為遷移而打開的套接字?jǐn)?shù)slaveexpirestracked_keys 0 跟蹤過(guò)期key數(shù)量(僅適用于可寫從)activedefraghits 0 活躍碎片執(zhí)行的值重新分配的數(shù)量activedefragmisses 0 活躍碎片執(zhí)行的中止值重新分配的數(shù)量activedefragkey_hits 0 活躍碎片整理的key數(shù)activedefragkey_misses 0 活躍碎片整理過(guò)程跳過(guò)的key數(shù)
replication: 獲取 server 的主從配置信息
role master 角色(master、slave),一個(gè)從服務(wù)器也可能是另一個(gè)服務(wù)器的主服務(wù)器
connected_slaves 1 連接slave實(shí)例的個(gè)數(shù)
slave0 ip=127.0.0.1,port=6380,state=online,offset=14,lag=1 連接的slave的信息
master_replid 899b9814f2e841ca194dcc2620c83aa5df0abc10 服務(wù)器的復(fù)制ID
master_replid2 0000000000000000000000000000000000000000 第二服務(wù)器復(fù)制ID,用于故障轉(zhuǎn)移后的PSYNC,用于集群等高可用之后主從節(jié)點(diǎn)的互換
masterreploffset 14 復(fù)制偏移量1
secondreploffset -1 第二服務(wù)器復(fù)制偏移量2
replbacklogactive 1 復(fù)制緩沖區(qū)狀態(tài)
replbacklogsize 1048576 復(fù)制緩沖區(qū)的大?。ㄒ宰止?jié)為單位)
replbacklogfirstbyteoffset 1 復(fù)制緩沖區(qū)的偏移量,標(biāo)識(shí)當(dāng)前緩沖區(qū)可用范圍
replbackloghistlen 14 復(fù)制緩沖區(qū)中數(shù)據(jù)的大?。ㄒ宰止?jié)為單位)
cpu: 獲取 server 的 CPU 使用信息。
usedcpusys 2.559564 消耗的系統(tǒng)CPU
usedcpuuser 0.878593 消耗的用戶CPU
usedcpusys_children 0.001414 后臺(tái)進(jìn)程占用的系統(tǒng)CPU
usedcpuuser_children 0.000510 后臺(tái)進(jìn)程占用的用戶CPU
keyspace: 獲取 server 中各個(gè) DB 的 key 的數(shù)量
cluster: 獲取集群節(jié)點(diǎn)信息,僅在開啟集群后可見
通過(guò) info 查看連接數(shù)量,redis連接數(shù)過(guò)多會(huì)影響性能
3.響應(yīng)時(shí)間1)info commandstats 獲取每種命令的統(tǒng)計(jì)信息,查看Redis 哪些命令操作 比較耗時(shí)間
calls: 次數(shù)
usec: 總時(shí)間
usec_per_call:平均時(shí)間
2)Redis 慢查詢?nèi)罩?/p>
配置文件里面可進(jìn)行設(shè)置如下兩個(gè)參數(shù):
slowlog-log-slower-than 10000:?jiǎn)挝?微秒指定執(zhí)行時(shí)間超過(guò)多少微秒的命令會(huì)被記錄到日志上
slowlog-max-len 128:服務(wù)器上最多保存慢查詢?nèi)罩镜臈l數(shù)
查看慢查詢?nèi)罩荆簊lowlog get
影響相應(yīng)時(shí)間的因素:
持久化:持久化對(duì)于性能有直接的影響,因?yàn)椴粌H要操作內(nèi)存,還要操作磁盤 【會(huì)直接影響命令的處理時(shí)間】
有大量的數(shù)據(jù)過(guò)期失效:內(nèi)部 數(shù)據(jù)過(guò)期機(jī)制,Redis 自動(dòng)刪除 ,同樣 需要消耗資源
1)官網(wǎng)下載redis_exporter:https://github.com/oliver006/redis_exporter
2)下載后進(jìn)行解壓
3)啟動(dòng)(在解壓后的路徑操作)
前臺(tái)啟動(dòng):./redis_exporter -redis.addr 127.0.0.1:6379
后臺(tái)啟動(dòng):nohup ./redis_exporter -redis.addr 127.0.0.1:6379 >nginx_exporter.log 2>&1 &
啟動(dòng)后,默認(rèn)端口 9121,通過(guò)采集服務(wù)所在的IP+端口可以訪問(wèn)到采集的數(shù)據(jù)內(nèi)容
參數(shù)說(shuō)明:
-redis.addr:指明一個(gè)或多個(gè) Redis 節(jié)點(diǎn)的地址,多個(gè)節(jié)點(diǎn)使用逗號(hào)分隔,默認(rèn)為 redis://localhost:6379
-redis.password:驗(yàn)證 Redis 時(shí)使用的密碼;
-redis.file:包含一個(gè)或多個(gè)redis 節(jié)點(diǎn)的文件路徑,每行一個(gè)節(jié)點(diǎn),此選項(xiàng)與 -redis.addr 互斥。
-web.listen-address:監(jiān)聽的地址和端口,默認(rèn)為 0.0.0.0:9121
修改配置文件prometheus.yml,新增如下內(nèi)容,修改后重啟prometheus服務(wù);
# 以下為新增內(nèi)容
- job_name: "redis"
static_configs:
- targets: ['redis機(jī)器ip:9121'] # 這個(gè)就是你的redis_exporter啟動(dòng)的端口
3.grafana配置導(dǎo)入grafana_prometheus_redis_dashboard.json看板模板
https://download.csdn.net/download/qq_38571773/87387394
六、Redis 調(diào)優(yōu)建議Redis本身的性能足夠逆天,大部分的問(wèn)題在于 開發(fā)人員沒(méi)有用好Redis
pipelining 管道批處理:比如 將大量數(shù)據(jù) 加載到 redis就可以用 管道
Redis處理命令時(shí)采取的單線程,所以不需要大量 Redis連接
Redis的應(yīng)用場(chǎng)景對(duì)速度要求很高,采用合理的數(shù)據(jù)類型,更快速的操作
例如,采用字符串 string 類型,每一次查詢 必須從redis 查詢所有的內(nèi)容,會(huì)增加 網(wǎng)絡(luò)消耗,增加處理的資源占用;采用 hash,可以 將 用戶信息 分為多個(gè)key進(jìn)行存放,查詢效率高
盡量避免讓開發(fā)使用復(fù)雜的命令
例如 keys,Redis 里面,標(biāo)記為 O(1) 命令,代表速度快 ,O(n)、 O(logn) 速度較慢。如果你看到慢查詢?nèi)罩?里邊大量的命令,都是 非 O(1),則需要開發(fā)優(yōu)化命令
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
分享標(biāo)題:redis性能測(cè)試及瓶頸分析調(diào)優(yōu)-創(chuàng)新互聯(lián)
本文URL:http://chinadenli.net/article24/dchdje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、全網(wǎng)營(yíng)銷推廣、定制網(wǎng)站、網(wǎng)站設(shè)計(jì)、品牌網(wǎng)站建設(shè)、小程序開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容