Redis安裝與調試
Redis安裝與調試linux版本:64位CentOS 6.5
Redis版本:2.8.17 (更新到2014年10月31日)
Redis官網:http://redis.io/
Redis常用命令:http://redis.io/commands
1.安裝Redis
# wget http://download.redis.io/releases/redis-2.8.17.tar.gz
# tar xzf redis-2.8.17.tar.gz
# cd redis-2.8.17
# make
# make install
如果報錯
zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory
zmalloc.h:55:2: error: #error "Newer version of jemalloc required"
make[1]: *** [adlist.o] Error 1
make[1]: Leaving directory `/data0/src/redis-2.6.2/src'
make: *** [all] Error 2
解決辦法是:
make MALLOC=libc
注意:Redis並沒有自己實現記憶體池,沒有在標準的系統記憶體 Clerk上再加上自己的東西。
redis-2.4以上內建jemalloc,你不需要加任何參數,通過zmalloc.c源碼中我們可以看到,Redis在編譯時間,會先判斷是否使用tcmalloc,如果是,會用tcmalloc對應的函數替換掉標準的libc中的函數實現。其次會判斷jemalloc是否使得,最後如果都沒有使用才會用標準的libc中的記憶體管理函數。所以用tcmalloc最佳化請謹慎使用,這兩著分配器片段率相差不大,建議用內建jemalloc。
如果要安裝tcmalloc可以這樣:
# make USE_TCMALLOC=yes
參考:利用TCMalloc替換Nginx和Redis預設glibc庫的malloc記憶體配置
為了調試需要修改CFLAGS參數
# make CFLAGS="-g -O0"
make命令執行完成後,會在src目錄下產生5個可執行檔,分別是redis-server、redis-cli、redis-benchmark、redis-check-aof、redis-check-dump,它們的作用如下:
redis-server:Redis伺服器的daemon啟動程式
redis-cli:Redis命令列操作工具。當然,你也可以用telnet根據其純文字協議來操作
redis-benchmark:Redis效能測試工具,測試Redis在你的系統及你的配置下的讀寫效能
redis-check-aof:更新日誌檢查
redis-check-dump:用於本機資料庫檢查
為什麼沒用標準的Linux安裝三板斧呢。官方維基是這樣說的:Redis can run just fine without a configuration file (when executed without a config file a standard configuration is used). With thedefault configuration Redis will log to the standard output so you can check what happens. Later, you canchange the default settings.
也可以make install,這樣就是把可運行檔案複製到/usr/local/bin裡而已。
make之後,會出現一句提示:
Hint: To run 'make test' is a good idea ;)
-----------------------------------------------------------------
其實不測試,一般都可以用。但是既然人家建議了,咱們就走一下make test吧。
運行#make test
報錯,提示沒有You need 'tclsh8.5' in order to run the Redis test
然後到Tcl的官方網站http://www.tcl.tk/下載8.5版本
然後安裝tcl8.5:
(configure和make的位置比較特殊,在安裝目錄的unix下,所以下面是tcl官方安裝法)
#tar xvzf tcl8.5.12-src.tar.gz
#cd tcl8.5.13/unix/
#./configure
#make
#make test
#make install
註:當然,也可以簡單一點,用 yum install tcl 來安裝。
好了,安裝好tcl之後,可以去redis目錄下運行make test了,這次正常跑通。提示:
\o/ All tests passed without errors!
Cleanup: may take some time... OK
說明redis安裝正常。可以運行。
-----------------------------------------------------------------
安裝
# make install
2.運行Redis
2.8.17版本,redis-server被放到了src檔案夾下。
啟動Redis服務端
# /usr/redis-2.8.17/src/redis-server
如果沒有更改daemonize no配置,會看見啟動並執行資訊。
注釋:
▲redis的預設連接埠號碼是6379,(據redis的作者antirez的博文說,6379在是手機按鍵上MERZ對應的號碼,而MERZ取自意大利歌女Alessia Merz的名字。而MERZ長期以來被antirez及其朋友當作愚蠢的代名詞。)
▲Redis有兩種儲存方式,預設是snapshot方式,實現方法是定時將記憶體的快照(snapshot)持久化到硬碟,這種方法缺點是持久化之後如果出現crash則會丟失一段資料。因此在完美主義者的推動下作者增加了aof方式。aof即append only mode,在寫入記憶體資料的同時將操作命令儲存到記錄檔。
以後台形式運行Redis
需要讀取設定檔方式啟動
注意,預設複製過去的redis.conf檔案的daemonize參數為no,所以redis不會在後台運行,我們可以修改redis.conf檔案,這個檔案就是解壓後的redis根目錄下
daemonize yes
If you want to provide your redis.conf, you have to run it using an additional
parameter (the path of the configuration file):
% cd src
% ./redis-server /path/to/redis.conf
# /usr/redis-2.8.17/src/redis-server /usr/redis-2.8.17/redis.conf
查看redis進程
#ps aux |grep redis
啟動多個redis執行個體
拷貝預設的redis.conf改為redis6383.conf,開啟redis6383.conf設定檔,找到port 6379這行,把6379改為6383
# /usr/redis-2.8.17/src/redis-server
# /usr/redis-2.8.17/src/redis-server /usr/redis-2.8.17/redis6383.conf
調用服務:
# /usr/redis-2.8.17/src/redis-cli
新增
redis> set foo bar
擷取
redis> get foo"bar"
刪除
redis>del foo
模糊尋找
redis>keys f*
redis>keys f?o?
查看info資訊
輸入# info命令,可以看出記憶體片段率:mem_fragmentation_ratio=2.59
預設使用的是jemalloc記憶體 Clerk
3.配置 Redis
redis的設定檔在你的安裝目錄裡。名為:redis.conf。
簡單說幾點redis.conf:
redis預設不是用守護進程的,如果需要更改,把daemonize no改成daemonize yes。(測試的時候可以不改,看看列印資訊。)
如果對redis預設6379連接埠不爽的,可以更改port 6379
如果想把資料檔案放到一個指定檔案夾,更改dir /opt/data/
預設是dir ./ 也就是預設放到安裝目錄下。
連線逾時時間,timeout 300,沒什麼改頭……
dir 是資料檔案路徑。預設在安裝目錄下。
*下面的配置二選一,詳見本文注釋部分2。
###### SNAPSHOTTING ######記憶體快照方式:
預設的記憶體快照策略是,
在900秒(15分鐘)內,至少有1次資料變更;
或者300秒內,有至少10次資料變更;
或者60秒內,有至少1000次資料變更;時間+資料變更次數,共同影響記憶體快照的出現。
###### APPEND ONLY MODE ###### AOF方式
appendfsync everysec 每秒同步。這裡可以注釋掉,開啟下面的選項appendfsync no
其餘的配置,conf裡面的注釋寫的挺清楚,我就不多廢話了。大家看著自己配就行了。
可以拷貝設定檔到etc
mkdir /etc/redis
cp redis.conf /etc/redis/redis.conf
mkdir /var/lib/redis 1. redis.conf 配置參數:
#是否作為守護進程運行
daemonize yes
#如以後台進程運行,則需指定一個pid,預設為/var/run/redis.pid
pidfile redis.pid
#綁定主機IP,預設值為127.0.0.1
#bind 127.0.0.1
#Redis預設監聽連接埠
port 6379
#用戶端閑置多少秒後,中斷連線,預設為300(秒)
timeout 300
#日誌記錄等級,有4個可選值,debug,verbose(預設值),notice,warning
loglevel verbose
#指定日誌輸出的檔案名稱,預設值為stdout,也可設為/dev/null屏蔽日誌
logfile stdout
#可用資料庫數,預設值為16,預設資料庫為0
databases 16
#儲存資料到disk的策略
#當有一條Keys資料被改變是,900秒重新整理到disk一次
save 900 1
#當有10條Keys資料被改變時,300秒重新整理到disk一次
save 300 10
#當有1w條keys資料被改變時,60秒重新整理到disk一次
save 60 10000
#當dump .rdb資料庫的時候是否壓縮資料對象
rdbcompression yes
#本機資料庫檔案名稱,預設值為dump.rdb
dbfilename dump.rdb
#本機資料庫存放路徑,預設值為 ./
dir /var/lib/redis/
########### Replication #####################
#Redis的複製配置
# slaveof <masterip> <masterport> 當本機為從服務時,設定主服務的IP及連接埠
# masterauth <master-password> 當本機為從服務時,設定主服務的串連密碼
#串連密碼
# requirepass foobared
#最大用戶端串連數,預設不限制
# maxclients 128
#最大記憶體使用量設定,達到最大記憶體設定後,Redis會先嘗試清除已到期或即將到期的Key,當此方法處理後,任到達最大記憶體設定,將無法再進行寫入操作。
# maxmemory <bytes>
#是否在每次更新操作後進行日誌記錄,如果不開啟,可能會在斷電時導致一段時間內的資料丟失。因為redis本身同步資料檔案是按上面save條件來同步的,所以有的資料會在一段時間內只存在於記憶體中。預設值為no
appendonly no
#更新記錄檔名,預設值為appendonly.aof
#appendfilename
#更新日誌條件,共有3個可選值。no表示等作業系統進行資料緩衝同步到磁碟,always表示每次更新操作後手動調用fsync()將資料寫到磁碟,everysec表示每秒同步一次(預設值)。
# appendfsync always
appendfsync everysec
# appendfsync no
################ VIRTUAL MEMORY ###########
#是否開啟VM功能,預設值為no
vm-enabled no
# vm-enabled yes
#虛擬記憶體檔案路徑,預設值為/tmp/redis.swap,不可多個Redis執行個體共用
vm-swap-file /tmp/redis.swap
#將所有大於vm-max-memory的資料存入虛擬記憶體,無論vm-max-memory設定多小,所有索引資料都是記憶體儲存的 (Redis的索引資料就是keys),也就是說,當vm-max-memory設定為0的時候,其實是所有value都存在於磁碟。預設值為0。
vm-max-memory 0
vm-page-size 32
vm-pages 134217728
vm-max-threads 4
############# ADVANCED CONFIG ###############
glueoutputbuf yes
hash-max-zipmap-entries 64
hash-max-zipmap-value 512
#是否重設Hash表
activerehashing yes
注意:Redis官方文檔對VM的使用提出了一些建議: 當你的key很小而value很大時,使用VM的效果會比較好.因為這樣節約的記憶體比較大. 當你的key不小時,可以考慮使用一些非常方法將很大的key變成很大的value,比如你可以考慮將key,value組合成一個新的value. 最好使用linux ext3 等對疏鬆檔案支援比較好的檔案系統儲存你的swap檔案. vm-max-threads這個參數,可以設定訪問swap檔案的線程數,設定最好不要超過機器的核心數.如果設定為0,那麼所有對swap檔案的操作都是串列的.可能會造成比較長時間的延遲,但是對資料完整性有很好的保證.
2. 調整系統核心參數
如果記憶體情況比較緊張的話,需要設定核心參數:
echo 1 > /proc/sys/vm/overcommit_memory
這裡說一下這個配置的含義:/proc/sys/vm/overcommit_memory
該檔案指定了核心針對記憶體配置的策略,其值可以是0、1、2。
0,表示核心將檢查是否有足夠的可用記憶體供應用進程使用;如果有足夠的可用記憶體,記憶體申請允許;否則,記憶體申請失敗,並把錯誤返回給應用進程。
1,表示核心允許分配所有的實體記憶體,而不管當前的記憶體狀態如何。
2,表示核心允許分配超過所有實體記憶體和交換空間總和的記憶體
Redis在dump資料的時候,會fork出一個子進程,理論上child進程所佔用的記憶體和parent是一樣的,比如parent佔用的記憶體為 8G,這個時候也要同樣分配8G的記憶體給child, 如果記憶體無法負擔,往往會造成redis伺服器的down機或者IO負載過高,效率下降。所以這裡比較最佳化的記憶體配置策略應該設定為 1(表示核心允許分配所有的實體記憶體,而不管當前的記憶體狀態如何)
4.調試debug
注意由於redis預設是啟用了記憶體最佳化的,所以必須修改編譯選項。不然,在gdb內列印變數時提示"<value optimized out>",這多半是因為gcc的最佳化導致,我們可以加上-O0選項來強制禁用gcc的編譯最佳化。 Compiling Redis without optimizations
By default Redis is compiled with the -O2 switch, this means that compiler optimizations are enabled. This makes the Redis executable faster, but at the same time it makes Redis (like any other program) harder to inspect using GDB.
所以要修改Makefile檔案,該檔案在/src目錄下,修改OPTIMIZATION?=-O2選項即可,修改為O0
OPTIMIZATION?=-O0
刪掉原來的redis重新修改makefile重新make,啟動redis
具體調試技巧,查看指標變數
查看redis進程
# ps aux|grep redis
gdb附加到進程
# gdb -p 進程id
(gdb)r 重新開始不然不會從main函數開始
(gdb)break main 設定斷點
(gdb)list 查看代碼
(gdb)p 變數名 查看變數內容,使用p查看變數,這個時候已經可以查看
redis調試技巧
redis會在ae.c的aeMain這個函數處迴圈處理事件:
// 事件處理器的主迴圈void aeMain(aeEventLoop *eventLoop) { eventLoop->stop = 0; while (!eventLoop->stop) { // 如果有需要在事件處理前執行的函數,那麼運行它 if (eventLoop->beforesleep != NULL) eventLoop->beforesleep(eventLoop); // 開始處理事件 aeProcessEvents(eventLoop, AE_ALL_EVENTS); }}
# /usr/redis-2.6.14/src/redis-cli
redis> set foo bar
OK
redis> get foo"bar"
aeMain函數會截獲來自redis-cli的請求,也只有aeMain函數處理好該請求,redis-cli才會返回OK,不然就會一直等待
5.基準測試
第一先用啟動命令啟動redis
然後在任意目錄使用命令:
# redis-benchmark-h localhost -p 6379 -c 100 -n 100000
類比100個並發串連,100000個請求,檢測host為localhost 連接埠為6379的redis伺服器效能
原文地址:http://blog.csdn.net/unix21/article/details/9526295
------------------------------------------------------------------------
更多參考
配置參考:CentOS下Redis 2.2.14安裝配置詳解
安裝參考:Redis (一) 安裝
調試參考:http://redis.io/topics/debugging 利用gdb調試redis-server
benchmark參數: Redis安裝部署
另外需要在PHP中使用redis需要安裝PHP擴充可以參考:
Redis以及Redis的php擴充安裝無錯版
phpredis使用方法
redis常用命令參考