Java開發大型互聯網深入理解Redis性能調優之redis性能測試
引言
Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API。從2010年3月15日起,Redis的開發工作由VMware主持。從2013年5月開始,Redis的開發由Pivotal贊助。
簡介
Redis的優點
性能極高 – Redis能支持超過 100K+ 每秒的讀寫頻率。
豐富的數據類型 – Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操作。
原子 – Redis的所有操作都是原子性的,同時Redis還支持對幾個操作全並後的原子性執行。
豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性。
redis數據結構
redis是一種高級的key:value存儲系統,其中value支持五種數據類型:
字符串(strings)
字符串列表(lists)
字符串集合(sets)
有序字符串集合(sorted sets)
哈希(hashes)
而關於key,有幾個點要提醒大家:
key不要太長,儘量不要超過1024字節,這不僅消耗內存,而且會降低查找的效率;
key也不要太短,太短的話,key的可讀性會降低;
在一個項目中,key最好使用統一的命名模式,例如user:10000:passwd。
安裝redis
從redis.io下載最新版redis-X.Y.Z.tar.gz後解壓,然後進入redis-X.Y.Z文件夾後直接make即可,安裝非常簡單。
make成功後會在src文件夾下產生一些二進制可執行文件,包括redis-server、redis-cli等等:
$ find . -type f -executable
./redis-benchmark //用於進行redis性能測試的工具
./redis-check-dump //用於修復出問題的dump.rdb文件
./redis-cli //redis的客戶端
./redis-server //redis的服務端
./redis-check-aof //用於修復出問題的AOF文件
./redis-sentinel //用於集群管理
啟動redis
啟動redis非常簡單,直接./redis-server就可以啟動服務端了,還可以用下面的方法指定要加載的配置文件:
./redis-server ../redis.conf
默認情況下,redis-server會以非daemon的方式來運行,且默認服務端口為6379。
有關作者為什麼選擇6379作為默認端口,還有一段有趣的典故,英語好的同學可以看看作者這篇博文中的解釋。
使用redis客戶端
我們直接看一個例子:
//這樣來啟動redis客戶端了
$ ./redis-cli
//用set指令來設置key、value
127.0.0.1:6379> set name "roc"
OK
//來獲取name的值
127.0.0.1:6379> get name
"roc"
//通過客戶端來關閉redis服務端
127.0.0.1:6379> shutdown
127.0.0.1:6379>
Redis性能調優
儘管Redis是一個非常快速的內存數據存儲媒介,也並不代表Redis不會產生性能問題。
前文中提到過,Redis採用單線程模型,所有的命令都是由一個線程串行執行的,所以當某個命令執行耗時較長時,會拖慢其後的所有命令,這使得Redis對每個任務的執行效率更加敏感。
針對Redis的性能優化,主要從下面幾個層面入手:
最初的也是最重要的,確保沒有讓Redis執行耗時長的命令
使用pipelining將連續執行的命令組合執行
操作系統的Transparent huge pages功能必須關閉:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
如果在虛擬機中運行Redis,可能天然就有虛擬機環境帶來的固有延遲。可以通過./redis-cli --intrinsic-latency 100命令查看固有延遲。同時如果對Redis的性能有較高要求的話,應儘可能在物理機上直接部署Redis。檢查數據持久化策略,考慮引入讀寫分離機制。
.
Redis性能測試.
基準測試
基準的測試命令:
redis-benchmark -q -n 100000
結果入下:
root@centos1 bin]# redis-benchmark -q -n 100000
-bash: redis-benchmark: command not found
[root@centos1 bin]# ./redis-benchmark -q -n 100000
PING_INLINE: 61576.36 requests per second
PING_BULK: 60277.28 requests per second
SET: 61349.69 requests per second
GET: 60459.49 requests per second
INCR: 58858.15 requests per second
LPUSH: 59066.75 requests per second
RPUSH: 57339.45 requests per second
LPOP: 55586.44 requests per second
RPOP: 56465.27 requests per second
SADD: 57045.07 requests per second
SPOP: 53734.55 requests per second
LPUSH (needed to benchmark LRANGE): 57012.54 requests per second
LRANGE_100 (first 100 elements): 55803.57 requests per second
LRANGE_300 (first 300 elements): 54914.88 requests per second
LRANGE_500 (first 450 elements): 53333.33 requests per second
LRANGE_600 (first 600 elements): 56529.11 requests per second
MSET (10 keys): 59276.82 requests per second
這裡可以看出,單機版的redis每秒可以處理6萬個請求,這已經是一個非常厲害的數據了,不得不佩服
我們再來看下集群情況下是是什麼情況
[root@centos1 bin]# ./redis-benchmark -q -n 100000 -p 7000
PING_INLINE: 64599.48 requests per second
PING_BULK: 64184.85 requests per second
SET: 66800.27 requests per second
GET: 65616.80 requests per second
INCR: 66269.05 requests per second
LPUSH: 40273.86 requests per second
RPUSH: 40355.12 requests per second
LPOP: 43421.62 requests per second
RPOP: 45187.53 requests per second
SADD: 62539.09 requests per second
SPOP: 61538.46 requests per second
LPUSH (needed to benchmark LRANGE): 38182.51 requests per second
LRANGE_100 (first 100 elements): 25555.84 requests per second
LRANGE_300 (first 300 elements): 9571.21 requests per second
LRANGE_500 (first 450 elements): 7214.49 requests per second
LRANGE_600 (first 600 elements): 5478.85 requests per second
MSET (10 keys): 41893.59 requests per second
總結
以 上就是我對Java開發大型互聯網深入理解Redis性能調優之redis性能測試問題及其優化總結,分享給大家,希望大家知道什麼是Java開發大型互聯網深入理解Redis性能調優之redis性能測試問題及其優化。覺得收穫的話可以點個關注收藏轉發一波喔,謝謝大佬們支持!
1、多寫多敲代碼,好的代碼與紮實的基礎知識一定是實踐出來的
2、可以去百度搜索騰訊課堂圖靈學院的視頻來學習一下java架構實戰案例,還挺不錯的。
最後,每一位讀到這裡的網友,感謝你們能耐心地看完。希望在成為一名更優秀的Java程序員的道路上,我們可以一起學習、一起進步!都能贏取白富美,走向架構師的人生巔峰!
3丶想了解學習以上課程內容可加群:469717771 驗證碼頭條(06 必過)歡迎大家的加入喲!