redis 效能分析

xuefei發表於2020-12-07

Redis效能剖析

高併發效能瓶頸點:

商品秒殺的業務場景為什麼說跟其他的業務場景不一樣呢?不一樣在哪裡呢?

使用者扎堆現象很嚴重。
大資料時代的3V:

海量(Volume)、多樣(Variety) 、實時(Velocity)

海量:現在的股票,期貨的開盤時間固定的,這樣就有海量的使用者同時登陸
多樣:電商,叫車...
實時:操作軟體的時候,1,2秒鐘沒有響應的活,幾乎就失去使用者了
網際網路需求的3高:

高併發,高效能(高可用),高可擴。

在這裡插入圖片描述

如果用傳統的資料庫來做,IO操作很頻繁。因為mysql是以檔案的形式儲存在硬碟上的
現在redis是快取級別的,一般在專案裡面是單獨部署在一個伺服器上面的。 對記憶體要求比較高。

關於資料庫,有好多種:
在這裡插入圖片描述

一般檔案的話,有檔案伺服器:mongdb

redis是快取的,階段性的高頻資訊適合用redis來做。
在這裡插入圖片描述

高併發一般就是兩種做法:

  • 1.加快取:一般就是redis

  • 2.佇列:rabbitmq(使用者的併發量來了,內部的機制,可以做一個基本的佇列)

在這裡插入圖片描述

輸入驗證的同時,就是把時間拉長了。就是非同步的機制。還有其他的一些策略。排隊啊。倒數計時。。。其實就是在分散好多壓力
如果沒有快取、非同步化這些技術,A所有的請求都直接去訪問DB話,不管你的資料庫是mysql還是oracle,都扛不住。

Redis方案簡介
在這裡插入圖片描述

Redis就是將高頻的資料放在redis的記憶體伺服器上,減輕mysql的IO操作。對磁碟的讀寫的操作
在這裡插入圖片描述

優點:
在這裡插入圖片描述

最重要的就是解決併發的時候,對資料庫的操作

一般tomcat和nginx掛了,是在頁面上面能直接看出來的。都不能訪問的
Redis是存資料的,存頻繁常用的資料。如果直接掛了,存在裡面的token值,就是不能用了

分散式:

不同伺服器一般放不同的模組(訂單就是訂單,購買就是購買)

叢集:

不同伺服器一般放相同的模組

在這裡插入圖片描述

相關操作:
在這裡插入圖片描述

為什麼使用 Redis?
在專案中使用 Redis,主要考慮兩個角度:效能和併發。否則用Redis幹嘛??

  • 效能角度

    傳統:
    在這裡插入圖片描述

    我們在碰到需要執行耗時特別久,且結果不頻繁變動的 SQL,就特別適合將執行結果放入緩
    存。這樣,後面的請求就去快取中讀取,使得請求能夠迅速響應。
    特別是在秒殺系統,在同一時間,幾乎所有人都在點,都在下單。。。執行的是同一操作———向資料庫查資料

  • 併發角度

    在大併發的情況下,所有的請求直接訪問資料庫,資料庫會出現連線異常。這個時候,就需要使用 Redis 做一個緩衝操作,讓請求先訪問到 Redis,而不是直接訪問資料庫。
    傳統:
    在這裡插入圖片描述

1.Redis安裝:

wget http://download.redis.io/releases/redis-5.0.8.tar.gz #下載redis
tar zxvf redis-5.0.8.tar.gz #解壓redis檔案
mv redis-5.0.8 /usr/local #移到local目錄下
cd /usr/local #進入local目錄
mv redis-5.0.8 redis #重新命名為redis目錄
cd redis #進入redis目錄
make #編譯檔案

2、Redis常用工具
redis最主要的工具都在src裡面
在這裡插入圖片描述

綠色的表示可以執行的,

.credisc語言寫的。.c表示原始檔
.h: 表示標頭檔案
.o:out 檔案,編譯後的檔案
redis-benchmark
基準測試工具,相當於一個自檢的東西。
redis-cli
Redis 命令列工具,客戶端
redis-server
啟動 Redis,服務端
redis有服務端和客戶端
redis-check-aof
AOF :持久化檔案檢測工具和修復工具,檢測檔案類的

啟redis就是啟啟動 Redis服務端
(頁面能開啟,不代表tomcat和nginx是正常的,如果有redis的話,不代表redis是正常的)

關閉redis
ps -ef|grep redis kill -9 程式ID
啟動redis
cd /usr/local/redis/src
./redis-server ../redis.conf
./redis-server是直接啟;./redis-server ../redis.conf:從配置引數裡面啟
../:表示上一層目錄

在這裡插入圖片描述

這個頁面,不能關
正常來說是不應該有警告的,
通常會有3個警告:
在這裡插入圖片描述

1.tcp連線數(TCP監聽佇列),預設是128個,一般改成3萬多以上。
2.記憶體分配策略
3.THP
有這些警告,就需要讓開發改

TCP監聽佇列(somaxconn)

該核心引數預設值是128,作用是定義了系統中每一個埠最大的監聽佇列長度。對於負載很大的服務
程式來說大大的不夠。一般會將它修改為32768(最大值65535的一半)。
使用:
cat /proc/sys/net/core/somaxconn 檢視
修改方法:
編輯/etc/sysctl.conf ,改net.core.somaxconn =32768,再sysctl -p 使配置檔案生效(永久有效)
echo 32768 > /proc/sys/net/core/somaxconn(重啟作業系統失效)

記憶體分配策略

overcommit_memory是作業系統核心對記憶體分配的一種策略。取值有012三種。
cat /proc/sys/vm/overcommit_memory 檢視策略設定
grep -i commit /proc/meminfo最大可申請記憶體和已分配記憶體
0:作業系統預設值。核心檢查是否有足夠的記憶體;有則允許申請;無則申請失敗,返回錯誤給程式。
1:不管需要多少記憶體,都允許申請
2:當系統分配的記憶體超過:swap+物理RAM*N%時,會被拒絕(N%vm.overcommit_ratio引數指
定)
優化:
redis在備份資料時,會fork出一個子程式,理論上子程式所佔用的記憶體和父程式是一樣的,如父程式佔
用記憶體為5G,這個時候也要同樣分配5G的記憶體給子程式,如果記憶體無法負擔,往往會造成redis伺服器
的當機或者IO負載過高,效率下降。所以記憶體分配策略應該設定為 1vm.overcommit_ratio引數預設為
50,且當vm.overcommit_memory=2才生效,所以暫時可以不用管。
設定方法有三種:
編輯/etc/sysctl.conf ,改vm.overcommit_memory=1,再sysctl -p 使配置檔案生效(永久有效)
sysctl vm.overcommit_memory=1(臨時有效)
echo 1 > /proc/sys/vm/overcommit_memory(臨時有效)

關閉THP

THPTransparent Huge Pages的縮寫,透明大頁。linux記憶體採用分段分頁機制,預設請求下一頁大小
4096kb1M記憶體被分為256頁。記憶體越大大頁越多,就有大量的記憶體對映表需要去管理,對Oracle
Redis等資料庫,需要操作大量的記憶體,會影響系統效能。Huge Pages是提高記憶體頁的大小來的,對於
G級別的記憶體,記憶體頁大小設定為2M。由於 Huge pages 很難手動管理。於是引入了THP。但是在某些
情況下,THP會導致異常節點重啟,和效能問題。因此建議禁用。
如何檢視HTP是否啟動呢?可以執行:
cat /sys/kernel/mm/redhat_transparent_hugepage/enabled#小紅帽
cat /sys/kernel/mm/transparent_hugepage/enabled #其他Linux下。
結果是:[always]表示已啟用,[never]表示已禁用。
禁用THP的方法如下(先臨時禁用,再加入到配置檔案):

# echo never > /sys/kernel/mm/transparent_hugepage/enabled
# vi /etc/rc.local #新增如下程式碼(重啟伺服器生效)
if test -f /sys/kernel/mm/redhat_transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled
fi

Redis的redis-benchmark工具

進入命令列工具
cd /usr/local/redis/src
./redis-cli
輸入密碼命令:auth 密碼
若顯示OK則登入成功:

Redis常見命令
在這裡插入圖片描述

在這裡插入圖片描述

可以有多個客戶端,退出的話:ctrl+c

檢視redis所有的資訊

info
redis_versionredis版本號
gcc_versionlinux裡面編輯的版本
process_idredis的程式號
uptime_in_secondsredis啟了多長時間(秒)
uptime_in_days:啟了多少天
connected_clients:連線的客戶端數
這個裡面的值通過grafana是可以收集的

redis配置檔案
在這裡插入圖片描述

在這裡插入圖片描述

在redis 的根目錄下,有一個redis.conf檔案,則是redis的配置檔案。
它的引數非常多,主要引數有:

daemonize no #是否後臺執行,一般改為yes
logfile “” #日誌檔案,可設為:logfile /usr/local/redis/redis.log
requirepass sq #啟用Redis密碼,sq是設定的密碼
protected-mode yes #保護模式,外部網路不能使用
bind 127.0.0.1 #哪些ip可以連redis,後面可以帶多個地址
maxmemory #redis作為快取一般需要設定,作為資料庫不需要
maxmemory-policy #key的回收策略。一共有6種策略
maxclients 10000 #允許最大的連線數10000

6種key的回收策略:

1. volatile-lru: 在所有帶有過期時間的 key 中使用 LRU 演算法淘汰資料;
2. alkeys-lru: 在所有的 key 中使用最近最少被使用 LRU 演算法淘汰資料,保證新加入的資料正常;
3. volatile-random: 在所有帶有過期時間的 key 中隨機淘汰資料;
4. allkeys-random: 在所有的 key 中隨機淘汰資料;
5. volatile-ttl: 在所有帶有過期時間的 key 中,淘汰最早會過期的資料;
6. noeviction: 不回收,當達到最大記憶體的時候,在增加新資料的時候會返回 error,不會清除舊數
據,這是 Redis 的預設策略;

redis基準測試
Redis的redis-benchmark工具(不需要裝,可以模擬redis效能)
如果有人問,你這個專案裡面redis的效能怎麼樣?可以通過這個工具來測。好的話,效能QPS能到幾十萬。
這個工具就是測試不同的操作的QPS是多少?

    cd /usr/local/redis/src
./redis-benchmark -h 127.0.0.1 -p 6379 -t set,lpush -n 10000 -q
以上例項中:主機為 127.0.0.1,埠號為 6379(預設),執行的命令為 set,lpushredis不同的操作),請求數為 10000,通過-q 引數讓結果只顯示每秒執行的請求數(QPS

在這裡插入圖片描述

在這裡插入圖片描述

redis是記憶體伺服器,就是把資料放在記憶體裡面的,所以有就是記憶體伺服器
有IO型的伺服器,比如檔案型的伺服器
有cpu型的伺服器等等

redis還有一個叫持久化技術
如果說redis有故障的時候,會主動把資料寫到磁碟裡面去

相關文章