redis 學習指南



redis 學習指南

一、介紹

Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基於內存亦可持久化的日誌型、一個高性能的key-value數據庫。並提供多種語言的API。說到Key-Value數據庫NoSQL數據庫可以想到MongoDB。

和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,爲了保證效率,數據都是緩存在內存中。區別的是redis會週期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。

 

二、 基於windows 64bit安裝

安裝之前請務必確定你是Administrator管理員賬號的windows用戶!如果不是 Administrator用戶,則可能需要以管理員身份運行. 或者參考 Windows 7 啓用超級管理員administrator賬戶的N種方法

在redis的下載頁面有這樣的一段話,說的意思是指redis項目未有提供對windows系統的支持,而Microsoft Open Tech提供了一個基於win64的redis實現。那就是說只支持64位系統了,32位的windows系統的同學就老老實實的換系統去吧。(*^__^*)

The Redis project does not officially support Windows. However, the Microsoft Open Tech group develops and maintains this Windows port targeting Win64.
 

1、 下載與安裝

下載地址:https://github.com/MSOpenTech/redis/releases/download/win-2.8.19/redis-2.8.19.zip

下載成功後解壓可以看到如下文件

clip_image002

Windows下的安裝幾乎沒有什麼過程,解壓後就可以使用。簡單介紹下着幾個exe文件的用途:

redis.windows.conf redis的配置文件

redis-benchmark.exe 測試工具,測試redis的讀寫性能情況

redis-check-aof.exe aof 修復檢查日誌

redis-check-dump.exe dump 檢查數據庫文件

redis-cli.exe redis客戶端程序

redis-server.exe redis服務器程序

 
三、 使用redis工具

1、 redis-server 雙擊運行或者用dos命令打開都可以,成功運行後可以看到界面內容如下:

clip_image004

會帶有版本號、運行進程號、運行端口信息。並且會提醒使用redis.windows.conf配置文件。如果你啓動失敗的話,提醒內存問題。那就需要修改下配置文件的maxheap配置(默認情況下該配置沒有賦值的,且沒有開啓),修改如下:

# maxheap <bytes>

maxheap 1024000000

還有一種啓動方式就是帶指定redis.conf配置文件的啓動方式,如下:

clip_image006

當你想使用不同的配置文件來設置不同服務器參數的時候就需要這樣,默認會使用根目錄下的配置文件。

redis-server /biran/conf/redis.conf 啓動並加裝指定配置文件

redis-server - (read config from stdin) 使用標準輸入讀取配置爲啓動參數

redis-server --test-memory 256 檢測256MB內存

redis-server –version 查版本號

如果準備長期使用,則需要註冊爲系統服務.

進入CMD,切換到redis所在目錄:

註冊服務,可以保存爲 service-install.bat 文件:

redis-server.exe --service-install redis.windows.conf --loglevel verbose

redis-server --service-start

卸載服務, 可以保存爲 uninstall-service.bat 文件:

redis-server --service-stop

redis-server --service-uninstall

可以在註冊服務時,通過 –service-name redisService1 參數直接指定服務名,適合安裝多個實例的情況,卸載也是同樣的道理.

啓動redis服務器時也可以直接指定配置文件,可以保存爲 startup.bat 文件:

redis-server.exe redis.windows.conf

 

2、 redis.windows.conf各項配置參數介紹

# 默認情況下,redis不是在後臺模式運行的,如果需要在後臺進程運行,把該項的值更改爲yes,默認爲no

daemonize:是否以後臺daemon方式運行

# 如redis服務以後臺進程運行的時候,Redis默認會把pid寫入/run/redis.pid文件組,你可以配置到其他文件路徑。

# 當運行多個redis服務時,需要指定不同的pid文件和端口

pidfile:pid文件位置

# 指定redis監聽端口,默認爲6379

# 如果端口設置爲0,Redis就不會監聽TCP套接字。

port:監聽的端口號

# 指定redis只接收來自於該IP地址的請求,如果不進行設置,默認將處理所有請求,

# 在生產環境中最好設置該項

bind 127.0.0.1

# 設置客戶端連接時的超時時間,單位爲秒。當客戶端在這段時間內沒有發出任何指令,那麼關閉該連接

# 默認值:0代表禁用,永不關閉

timeout:請求超時時間

# 指定用來監聽連接的unxi套接字的路徑。這個沒有默認值,所以如果不指定的話,Redis就不會通過unix套接字來監聽。

# unixsocket /tmp/redis.sock

# unixsocketperm 755

# 指定日誌記錄級別

# Redis總共支持四個級別:debug、verbose、notice、warning,默認爲verbose

# debug 記錄很多信息,用於開發和測試

# varbose 很多精簡的有用信息,不像debug會記錄那麼多

# notice 普通的verbose,常用於生產環境

# warning 只有非常重要或者嚴重的信息會記錄到日誌

loglevel:log信息級別

# 配置log文件名稱和全路徑地址

# 默認值爲stdout,使用“標準輸出”,默認後臺模式會輸出到/dev/null

logfile:log文件位置

# 可用數據庫數,默認值爲16,默認數據庫存儲在DB 0號ID庫中,無特殊需求,建議僅設置一個數據庫 databases 1

# 查詢數據庫使用 SELECT <dbid>

# dbid介於 0 到 'databases'-1 之間

databases:開啓數據庫的數量

save * *:保存快照的頻率,第一個*表示多長時間,第三個*表示執行多少次寫操作。在一定時間內執行一定數量的寫操作時,自動保存快照。可設置多個條件。

rdbcompression:是否使用壓縮

dbfilename:數據快照文件名(只是文件名,不包括目錄)

dir:數據快照的保存目錄(這個是目錄)

appendonly:是否開啓appendonlylog,開啓的話每次寫操作會記一條log,這會提高數據抗風險能力,但影響效率。

appendfsync:appendonlylog如何同步到磁盤(三個選項,分別是每次寫都強制調用fsync、每秒啓用一次fsync、不調用fsync等待系統自己同步)

########## REPLICATION 同步 ##########

#

# 主從同步。通過 slaveof 配置來實現Redis實例的備份。

# 注意,這裏是本地從遠端複製數據。也就是說,本地可以有不同的數據庫文件、綁定不同的IP、監聽不同的端口。

# 當本機爲從服務時,設置主服務的IP及端口,在Redis啓動時,它會自動從主服務進行數據同步

# slaveof <masterip> <masterport>

# 如果主服務master設置了密碼(通過下面的 "requirepass" 選項來配置),slave服務連接master的密碼,那麼slave在開始同步之前必須進行身份驗證,否則它的同步請求會被拒絕。

#當本機爲從服務時,設置主服務的連接密碼

# masterauth <master-password>

# 當一個slave失去和master的連接,或者同步正在進行中,slave的行爲有兩種可能:

# 1) 如果 slave-serve-stale-data 設置爲 "yes" (默認值),slave會繼續響應客戶端請求,可能是正常數據,也可能是還沒獲得值的空數據。

# 2) 如果 slave-serve-stale-data 設置爲 "no",slave會回覆"正在從master同步(SYNC with master in progress)"來處理各種請求,除了 INFO 和 SLAVEOF 命令。

slave-serve-stale-data yes

# slave根據指定的時間間隔向服務器發送ping請求。

# 時間間隔可以通過 repl_ping_slave_period 來設置。

# 默認10秒

# repl-ping-slave-period 10

# 下面的選項設置了大塊數據I/O、向master請求數據和ping響應的過期時間。

# 默認值60秒。

# 一個很重要的事情是:確保這個值比 repl-ping-slave-period 大,否則master和slave之間的傳輸過期時間比預想的要短。

# repl-timeout 60

########## SECURITY 安全 ##########

# 要求客戶端在處理任何命令時都要驗證身份和設置密碼。

# 如果你不相信請求者,這個功能很有用。

# 爲了向後兼容的話,這段應該註釋掉。而且大多數人不需要身份驗證(例如:它們運行在自己的服務器上。)

# 警告:外部使用者可以每秒嘗試150k的密碼來試圖破解密碼,這意味着你需要一個高強度的密碼,否則破解太容易了。

# 設置連接密碼

# requirepass foobared

# 命令重命名,可設置多個

# 在共享環境下,可以爲危險命令改變名字。比如,你可以爲 CONFIG 改個其他不太容易猜到的名字,這樣你自己仍然可以使用,而別人卻沒法知道它。

# 例如:

# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52

# rename-command info info_biran

# rename-command set set_biran

# 甚至也可以通過給命令賦值一個空字符串來完全禁用這條命令:

# rename-command CONFIG ""

########## LIMITS 限制 ##########

# 設置最大同時連接客戶端數量。

# 默認沒有限制,這個關係到Redis進程能夠打開的文件描述符數量。

# 特殊值"0"表示沒有限制。

# 一旦達到這個限制,Redis會關閉所有新連接併發送錯誤"達到最大用戶數上限(max number of clients reached)"

# maxclients 128

# 不要用比設置的上限更多的內存。一旦內存使用達到上限,Redis會根據選定的回收策略(參見:maxmemmory-policy:內存策略設置)刪除key。

# 如果因爲刪除策略問題Redis無法刪除key,或者策略設置爲 "noeviction",Redis會回覆需要更多內存的錯誤信息給命令。

# 例如,SET,LPUSH等等。但是會繼續合理響應只讀命令,比如:GET。

# 在使用Redis作爲LRU緩存,或者爲實例設置了硬性內存限制的時候(使用 "noeviction" 策略)的時候,這個選項還是滿有用的。

# 警告:當一堆slave連上達到內存上限的實例的時候,響應slave需要的輸出緩存所需內存不計算在使用內存當中。

# 這樣當請求一個刪除掉的key的時候就不會觸發網絡問題/重新同步的事件,然後slave就會收到一堆刪除指令,直到數據庫空了爲止。

# 簡而言之,如果你有slave連上一個master的話,那建議你把master內存限制設小點兒,確保有足夠的系統內存用作輸出緩存。

# (如果策略設置爲"noeviction"的話就不無所謂了)

# 設置最大內存,達到最大內存設置後,Redis會先嚐試清除已到期或即將到期的Key,當此方法處理後,任到達最大內存設置,將無法再進行寫入操作。

# maxmemory 256000000分配256M內存

# maxmemory <bytes>

# 內存策略:如果達到內存限制了,Redis如何刪除key。你可以在下面五個策略裏面選:

#

# volatile-lru -> 根據LRU算法生成的過期時間來刪除。

# allkeys-lru -> 根據LRU算法刪除任何key。

# volatile-random -> 根據過期設置來隨機刪除key。

# allkeys->random -> 無差別隨機刪。

# volatile-ttl -> 根據最近過期時間來刪除(輔以TTL)

# noeviction -> 誰也不刪,直接在寫操作時返回錯誤。

#

# 注意:對所有策略來說,如果Redis找不到合適的可以刪除的key都會在寫操作時返回一個錯誤。

#

# 這裏涉及的命令:set setnx setex append

# incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd

# sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby

# zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby

# getset mset msetnx exec sort

#

# 默認值如下:

# maxmemory-policy volatile-lru

# LRU和最小TTL算法的實現都不是很精確,但是很接近(爲了省內存),所以你可以用樣例做測試。

# 例如:默認Redis會檢查三個key然後取最舊的那個,你可以通過下面的配置項來設置樣本的個數。

# maxmemory-samples 3

########## APPEND ONLY MODE 純累加模式 ##########

# 默認情況下,Redis是異步的把數據導出到磁盤上。因爲redis本身同步數據文件是按上面save條件來同步的,所以有的數據會在一段時間內只存在於內存中,這種情況下,當Redis宕機的時候,最新的數據就丟了。

# 如果不希望丟掉任何一條數據的話就該用純累加模式:一旦開啓這個模式,Redis會把每次寫入的數據在接收後都寫入 appendonly.aof 文件。

# 每次啓動時Redis都會把這個文件的數據讀入內存裏。

#

# 注意,異步導出的數據庫文件和純累加文件可以並存(此時需要把上面所有"save"設置都註釋掉,關掉導出機制)。

# 如果純累加模式開啓了,那麼Redis會在啓動時載入日誌文件而忽略導出的 dump.rdb 文件。

#

# 重要:查看 BGREWRITEAOF 來了解當累加日誌文件太大了之後,怎麼在後臺重新處理這個日誌文件。

# 設置:yes爲純累加模式

appendonly no

# 設置純累加文件名字及保存路徑,默認:"appendonly.aof"

# appendfilename appendonly.aof

# fsync() 請求操作系統馬上把數據寫到磁盤上,不要再等了。

# 有些操作系統會真的把數據馬上刷到磁盤上;有些則要磨蹭一下,但是會盡快去做。

# Redis支持三種不同的模式:

#

# no:不要立刻刷,只有在操作系統需要刷的時候再刷。比較快。

# always:每次寫操作都立刻寫入到aof文件。慢,但是最安全。

# everysec:每秒寫一次。折衷方案。

# 默認的 "everysec" 通常來說能在速度和數據安全性之間取得比較好的平衡。

# 如果你真的理解了這個意味着什麼,那麼設置"no"可以獲得更好的性能表現(如果丟數據的話,則只能拿到一個不是很新的快照);

# 或者相反的,你選擇 "always" 來犧牲速度確保數據安全、完整。

#

# 如果不確定這些模式的使用,建議使用 "everysec"

#

# appendfsync always

appendfsync everysec

# appendfsync no

# 如果AOF的同步策略設置成 "always" 或者 "everysec",那麼後臺的存儲進程(後臺存儲或寫入AOF日誌)會產生很多磁盤I/O開銷。

# 某些Linux的配置下會使Redis因爲 fsync() 而阻塞很久。

# 注意,目前對這個情況還沒有完美修正,甚至不同線程的 fsync() 會阻塞我們的 write(2) 請求。

#

# 爲了緩解這個問題,可以用下面這個選項。它可以在 BGSAVE 或 BGREWRITEAOF 處理時阻止 fsync()。

#

# 這就意味着如果有子進程在進行保存操作,那麼Redis就處於"不可同步"的狀態。

# 這實際上是說,在最差的情況下可能會丟掉30秒鐘的日誌數據。(默認Linux設定)

#

# 如果你有延遲的問題那就把這個設爲 "yes",否則就保持 "no",這是保存持久數據的最安全的方式。

no-appendfsync-on-rewrite no

# 自動重寫AOF文件

# 如果AOF日誌文件大到指定百分比,Redis能夠通過 BGREWRITEAOF 自動重寫AOF日誌文件。

#

# 工作原理:Redis記住上次重寫時AOF日誌的大小(或者重啓後沒有寫操作的話,那就直接用此時的AOF文件),

# 基準尺寸和當前尺寸做比較。如果當前尺寸超過指定比例,就會觸發重寫操作。

#

# 你還需要指定被重寫日誌的最小尺寸,這樣避免了達到約定百分比但尺寸仍然很小的情況還要重寫。

#

# 指定百分比爲0會禁用AOF自動重寫特性。

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

########## SLOW LOG 慢查詢日誌 ##########

# Redis慢查詢日誌可以記錄超過指定時間的查詢。運行時間不包括各種I/O時間。

# 例如:連接客戶端,發送響應數據等。只計算命令運行的實際時間(這是唯一一種命令運行線程阻塞而無法同時爲其他請求服務的場景)

#

# 你可以爲慢查詢日誌配置兩個參數:一個是超標時間,單位爲微妙,記錄超過個時間的命令。

# 另一個是慢查詢日誌長度。當一個新的命令被寫進日誌的時候,最老的那個記錄會被刪掉。

#

# 下面的時間單位是微秒,所以1000000就是1秒。注意,負數時間會禁用慢查詢日誌,而0則會強制記錄所有命令。

slowlog-log-slower-than 10000

# 這個長度沒有限制。只要有足夠的內存就行。你可以通過 SLOWLOG RESET 來釋放內存。

slowlog-max-len 128

########## VIRTUAL MEMORY 虛擬內存 ##########

### 警告!虛擬內存在Redis 2.4是反對的,因性能問題,2.4版本 VM機制徹底廢棄,不建議使用此配置!!!!!!!!!!!

# 虛擬內存可以使Redis在內存不夠的情況下仍然可以將所有數據序列保存在內存裏。

# 爲了做到這一點,高頻key會調到內存裏,而低頻key會轉到交換文件裏,就像操作系統使用內存頁一樣。

# 要使用虛擬內存,只要把 "vm-enabled" 設置爲 "yes",並根據需要設置下面三個虛擬內存參數就可以了。

vm-enabled no

# 這是交換文件的路徑。估計你猜到了,交換文件不能在多個Redis實例之間共享,所以確保每個Redis實例使用一個獨立交換文件。

# 最好的保存交換文件(被隨機訪問)的介質是固態硬盤(SSD)。

# *** 警告 *** 如果你使用共享主機,那麼默認的交換文件放到 /tmp 下是不安全的。

# 創建一個Redis用戶可寫的目錄,並配置Redis在這裏創建交換文件。

vm-swap-file /tmp/redis.swap

# "vm-max-memory" 配置虛擬內存可用的最大內存容量。

# 如果交換文件還有空間的話,所有超標部分都會放到交換文件裏。

# "vm-max-memory" 設置爲0表示系統會用掉所有可用內存,建議設置爲剩餘內存的60%-80%。

# 將所有大於vm-max-memory的數據存入虛擬內存,無論vm-max-memory設置多小,所有索引數據都是內存存儲的(Redis的索引數據就是keys),也就是說,當vm-max-memory設置爲0的時候,其實是所有value都存在於磁盤。默認值爲0。

vm-max-memory 0

# Redis交換文件是分成多個數據頁的。

# 一個可存儲對象可以被保存在多個連續頁裏,但是一個數據頁無法被多個對象共享。

# 所以,如果你的數據頁太大,那麼小對象就會浪費掉很多空間。

# 如果數據頁太小,那用於存儲的交換空間就會更少(假定你設置相同的數據頁數量)

# 如果你使用很多小對象,建議分頁尺寸爲64或32個字節。

# 如果你使用很多大對象,那就用大一些的尺寸。

# 如果不確定,那就用默認值 :)

vm-page-size 32

# 交換文件裏數據頁總數。

# 根據內存中分頁表(已用/未用的數據頁分佈情況),磁盤上每8個數據頁會消耗內存裏1個字節。

# 交換區容量 = vm-page-size * vm-pages

# 根據默認的32字節的數據頁尺寸和134217728的數據頁數來算,Redis的數據頁文件會佔4GB,而內存裏的分頁表會消耗16MB內存。

# 爲你的應驗程序設置最小且夠用的數字比較好,下面這個默認值在大多數情況下都是偏大的。

vm-pages 134217728

# 同時可運行的虛擬內存I/O線程數,即訪問swap文件的線程數。

# 這些線程可以完成從交換文件進行數據讀寫的操作,也可以處理數據在內存與磁盤間的交互和編碼/解碼處理。

# 多一些線程可以一定程度上提高處理效率,雖然I/O操作本身依賴於物理設備的限制,不會因爲更多的線程而提高單次讀寫操作的效率。

# 特殊值0會關閉線程級I/O,並會開啓阻塞虛擬內存機制。

# 設置最好不要超過機器的核數,如果設置爲0,那麼所有對swap文件的操作都是串行的.可能會造成比較長時間的延遲,但是對數據完整性有很好的保證.

vm-max-threads 4

########## ADVANCED CONFIG 高級配置 ##########

# 當有大量數據時,適合用哈希編碼(這會需要更多的內存),元素數量上限不能超過給定限制。

# Redis Hash是value內部爲一個HashMap,如果該Map的成員數比較少,則會採用類似一維線性的緊湊格式來存儲該Map, 即省去了大量指針的內存開銷,如下2個條件任意一個條件超過設置值都會轉換成真正的HashMap,

# 當value這個Map內部不超過多少個成員時會採用線性緊湊格式存儲,默認是64,即value內部有64個以下的成員就是使用線性緊湊存儲,超過該值自動轉成真正的HashMap。

hash-max-zipmap-entries 512

# 當 value這個Map內部的每個成員值長度不超過多少字節就會採用線性緊湊存儲來節省空間。

hash-max-zipmap-value 64

# 與hash-max-zipmap-entries哈希相類似,數據元素較少的情況下,可以用另一種方式來編碼從而節省大量空間。

# list數據類型多少節點以下會採用去指針的緊湊存儲格式

list-max-ziplist-entries 512

# list數據類型節點值大小小於多少字節會採用緊湊存儲格式

list-max-ziplist-value 64

# 還有這樣一種特殊編碼的情況:數據全是64位無符號整型數字構成的字符串。

# 下面這個配置項就是用來限制這種情況下使用這種編碼的最大上限的。

set-max-intset-entries 512

# 與第一、第二種情況相似,有序序列也可以用一種特別的編碼方式來處理,可節省大量空間。

# 這種編碼只適合長度和元素都符合下面限制的有序序列:

zset-max-ziplist-entries 128

zset-max-ziplist-value 64

# 哈希刷新,每100個CPU毫秒會拿出1個毫秒來刷新Redis的主哈希表(頂級鍵值映射表)。

# redis所用的哈希表實現(見dict.c)採用延遲哈希刷新機制:你對一個哈希表操作越多,哈希刷新操作就越頻繁;

# 反之,如果服務器非常不活躍那麼也就是用點內存保存哈希表而已。

# 默認是每秒鐘進行10次哈希表刷新,用來刷新字典,然後儘快釋放內存。

# 建議:

# 如果你對延遲比較在意的話就用 "activerehashing no",每個請求延遲2毫秒不太好嘛。

# 如果你不太在意延遲而希望儘快釋放內存的話就設置 "activerehashing yes"。

activerehashing yes

########## INCLUDES 包含 ##########

# 包含一個或多個其他配置文件。

# 這在你有標準配置模板但是每個redis服務器又需要個性設置的時候很有用。

# 包含文件特性允許你引人其他配置文件,所以好好利用吧。

# include /path/to/local.conf

# include /path/to/other.conf

修改配置後,如果配置文件涉及到中文內容記得將文件存爲UTF-8編碼。

 

3、 redis-cli 客戶端使用

測試服務器啓動連接情況

127.0.0.1:6379> ping

PONG

查看服務器級別信息(測試服務器)

127.0.0.1:6379> info

# Server

redis_version:2.8.19

redis_git_sha1:00000000

redis_git_dirty:0

redis_build_id:9968db13395be4aa

redis_mode:standalone

os:Windows

arch_bits:64

multiplexing_api:winsock_IOCP

gcc_version:0.0.0

process_id:9204

run_id:fc4a126eaed1572b6855c9af511d3451eb358c85

tcp_port:6379

uptime_in_seconds:2365

uptime_in_days:0

hz:10

lru_clock:3087964

config_file:G:\software\redis\redis.windows.conf

# Clients

connected_clients:1

client_longest_output_list:0

client_biggest_input_buf:0

blocked_clients:0

# Memory

used_memory:11568456

used_memory_human:11.03M

used_memory_rss:11534800

used_memory_peak:11568456

used_memory_peak_human:11.03M

used_memory_lua:35840

mem_fragmentation_ratio:1.00

mem_allocator:dlmalloc-2.8

# Persistence

loading:0

rdb_changes_since_last_save:0

rdb_bgsave_in_progress:0

rdb_last_save_time:1429148959

rdb_last_bgsave_status:ok

rdb_last_bgsave_time_sec:-1

rdb_current_bgsave_time_sec:-1

aof_enabled:0

添加數據

127.0.0.1:6379> set user hoojo

OK

127.0.0.1:6379> get user

"hoojo"

查看所有的key信息

127.0.0.1:6379> keys *

1) "key:000000000308"

2) "key:000000000900"

3) "key:__rand_int__"

4) "key:000000000809"

5) "key:000000000164"

6) "key:000000000887"

基本參數介紹

-h

設置檢測主機IP地址,默認爲127.0.0.1

-p

設置檢測主機的端口號,默認爲6379

-s<socket>

服務器套接字(壓倒主機和端口)

-a

連接到Master服務器時使用的密碼

-r

執行指定的N次命令

-i

執行命令後等待N秒,如–i 0.1 info(執行後等0.1秒)

-n

指定連接N號ID數據庫,如 –n 3(連接3號數據庫)

-x

從控制檯輸入的信息中讀取最後一個參數

-d

定義多個定界符爲默認輸出格式(默認: \n)

--raw

使用原數據格式返回輸出內容

--latency

進入一個不斷延時採樣的特殊模式

--slave

模擬一個從服務器到主服務器的命令顯示反饋

--pipe

使用管道協議模式

--bigkeys

監聽顯示數據量大的key值,--bigkeys -i 0.1

--help

顯示命令行幫助信息

--version

顯示版本號

 

4、 redis-benchmark 性能測試工具

默認雙擊打開是按照默認的測試參數進行測試。

clip_image008

輸入如上命令後會看到如下信息,表明同時併發10個連接,總共100次操作。通俗易懂的說就是10個用戶同時操作,總共每人操作10次的意思。

100 requests completed in 0.01 seconds (100個請求完成於0.01秒)

10 parallel clients (10個客戶端併發)

3 bytes payload (每次寫入3個字節)

keep alive: 1 (保存一個鏈接數)

100.00% <= 1 milliseconds (100%的操作小於1秒完成)

16666.67 requests per second (每秒完成16666.67次查詢)

命令參數說明

redis-benchmark [-h <host>] [-p <port>] [-c <clients>] [-n <requests]> [-k <boolean>]

-h <hostname> 主機名 (默認 127.0.0.1)

-p <port> 主機端口 (默認 6379)

-s <socket> 主機套接字 (覆蓋主機和端口)

-c <clients> 併發連接的數量 (默認 50)

-n <requests> 請求總數 (默認 10000)

-d <size> SET/GET數據的字節大小(默認 2)

-k <boolean> 1=keep alive 0=reconnect (默認 1)

-r <keyspacelen> SET/GET/INCR使用隨機產生的key, SADD使用隨機值使用這個選項 get/set keys時會用mykey_rand:000000012456代替常量key, <keyspacelen>參數決定了隨機數產生的最大值,比如,設置參數爲10,那麼產生的隨機數範圍是rand:000000000000 -rand:000000000009

-P <numreq> Pipeline請求的數量. 默認 1 (不使用pipeline).

-q 展示query/sec值

--csv 以CSV格式輸出

-l 本地循環. 一直運行測試

-t <tests> 在運行逗號分割列表的測試. 測試的名字與產生輸出的名字一樣。

-I 空閒模式. 打開 N 個空閒連接,然後等待.

運行示例

對指定服務器、端口進行20個同時併發操作,總共操作100000次

redis-benchmark -h 192.168.1.136 -p 6379 -n 100000 -c 20

測試set寫入操作1000000次,隨機數範圍在100000000

redis-benchmark -t set -n 1000000 -r 100000000

測試ping、set、get操作100000次,結果輸出用csv格式

redis-benchmark -t ping,set,get -n 100000 –-csv

redis-benchmark -r 10000 -n 10000 lpush mylist ele:rand:000000000000

 

5、 redis-check-aof 基本用法

檢查本地日誌信息,加--fix參數爲修復log文件

redis-check-aof.exe log.aof

 

6、 redis-check-dump 檢查數據庫文件

redis-check-dump.exe dump.rdb 會輸出該文件大小、使用情況。

 

四、影響Redis性能的因素

* 網絡帶寬和延遲。在執行基準測試前使用ping快速檢測客戶端和服務器端的延遲是一個良好的做法。對於帶寬,比較好的做法是估計Gbits/s 的吞吐量和網絡的理論帶寬值比較。在很多實際的情況,Redis的吞吐量在網絡之前會受限於CPU。

* CPU也會是一個重要因素。由於單線程的,Redis受益於快速的含有巨大緩存的CPU。

* 內存的速度和容量對於小的對象影響不大。但對於大於10KB的對象,可能對需要注意。通常購買昂貴的快速內存模塊並不是真正的很有效。

* Redis在虛擬機上運行慢。虛擬化對很多普通操作來說代價太高了,Redis並沒有增加多少開銷在所需的系統調用和網絡中斷上。

* 客戶端和服務器在一臺機器運行,對於基準測試TCP/IP回送和UNIX域套接字都可以使用。取決於平臺,但UNIX域套接字比TCP/IP回送增加50%的吞吐量。

* 當大量使用 pipelining時,UNIX域套接字獲得的性能好處會減少。

* 當以太網訪問Redis時,在數據大小小於以太網數據包的大小(大約1500字節)時,聚集命令使用 pipelining會非常有效。

* 在多CPU套接字服務器,Redis的表現變得依賴於NUMA配置和處理位置。

* 在高端配置,客戶端連接的數量也是一個重要的因素。基於epool/kqueue模型,Redis的事件循環是相當可伸縮的。

* 在高端的配置,通過調優NIC(s)配置和相關中斷可能取得高吞吐量。






* 根據平臺,Redis編譯可以使用不同的內存分配器,這可能有不同的行爲在原始速度,內部和外部的碎片方面


資料來源於  博客hoojo    http://www.cnblogs.com/hoojo/p/4466024.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章