redis 學習指南

hoojo發表於2015-04-29

一、介紹

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編譯可以使用不同的記憶體分配器,這可能有不同的行為在原始速度,內部和外部的碎片方面

相關文章