Redis安装与调试
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并沒有自己實現內存池,沒有在標準的系統內存分配器上再加上自己的東西。
redis-2.4以上自帶jemalloc,你不需要加任何參數,通過zmalloc.c源碼中我們可以看到,Redis在編譯時,會先判斷是否使用tcmalloc,如果是,會用tcmalloc對應的函數替換掉標準的libc中的函數實現。其次會判斷jemalloc是否使得,最后如果都沒有使用才會用標準的libc中的內存管理函數。所以用tcmalloc優化請謹慎使用,這兩著分配器碎片率相差不大,建議用自帶jemalloc。
# 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內存分配器
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常用命令參考
總結
以上是生活随笔為你收集整理的Redis安装与调试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MyEclipse2014配置Tomca
- 下一篇: 从Nginx源码谈大小写字符转化的最高效