Redis安装与调试
Redis安裝與調(diào)試
Redis安裝與調(diào)試linux版本:64位CentOS 6.5
Redis版本:2.8.17? (更新到2014年10月31日)
Redis官網(wǎng):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并沒有自己實現(xiàn)內(nèi)存池,沒有在標準的系統(tǒng)內(nèi)存分配器上再加上自己的東西。
redis-2.4以上自帶jemalloc,你不需要加任何參數(shù),通過zmalloc.c源碼中我們可以看到,Redis在編譯時,會先判斷是否使用tcmalloc,如果是,會用tcmalloc對應的函數(shù)替換掉標準的libc中的函數(shù)實現(xiàn)。其次會判斷jemalloc是否使得,最后如果都沒有使用才會用標準的libc中的內(nèi)存管理函數(shù)。所以用tcmalloc優(yōu)化請謹慎使用,這兩著分配器碎片率相差不大,建議用自帶jemalloc。
# make USE_TCMALLOC=yes
參考:利用TCMalloc替換Nginx和Redis默認glibc庫的malloc內(nèi)存分配
為了調(diào)試需要修改CFLAGS參數(shù)
# make?CFLAGS="-g?-O0"?
make命令執(zhí)行完成后,會在src目錄下生成5個可執(zhí)行文件,分別是redis-server、redis-cli、redis-benchmark、redis-check-aof、redis-check-dump,它們的作用如下:
redis-server:Redis服務器的daemon啟動程序
redis-cli:Redis命令行操作工具。當然,你也可以用telnet根據(jù)其純文本協(xié)議來操作
redis-benchmark:Redis性能測試工具,測試Redis在你的系統(tǒng)及你的配置下的讀寫性能
redis-check-aof:更新日志檢查?
redis-check-dump:用于本地數(shù)據(jù)庫檢查?
為什么沒用標準的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之后,會出現(xiàn)一句提示:
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的官方網(wǎng)站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,(據(jù)redis的作者antirez的博文說,6379在是手機按鍵上MERZ對應的號碼,而MERZ取自意大利歌女Alessia Merz的名字。而MERZ長期以來被antirez及其朋友當作愚蠢的代名詞。)
▲Redis有兩種存儲方式,默認是snapshot方式,實現(xiàn)方法是定時將內(nèi)存的快照(snapshot)持久化到硬盤,這種方法缺點是持久化之后如果出現(xiàn)crash則會丟失一段數(shù)據(jù)。因此在完美主義者的推動下作者增加了aof方式。aof即append only mode,在寫入內(nèi)存數(shù)據(jù)的同時將操作命令保存到日志文件。
?
以后臺形式運行Redis
需要讀取配置文件方式啟動
注意,默認復制過去的redis.conf文件的daemonize參數(shù)為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
調(diào)用服務:
#?/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命令,可以看出內(nèi)存碎片率:mem_fragmentation_ratio=2.59
默認使用的是jemalloc內(nèi)存分配器
3.配置 Redis
redis的配置文件在你的安裝目錄里。名為:redis.conf。
簡單說幾點redis.conf:
redis默認不是用守護進程的,如果需要更改,把daemonize no改成daemonize yes。(測試的時候可以不改,看看打印信息。)
如果對redis默認6379端口不爽的,可以更改port 6379
如果想把數(shù)據(jù)文件放到一個指定文件夾,更改dir /opt/data/
默認是dir ./ 也就是默認放到安裝目錄下。
連接超時時間,timeout 300,沒什么改頭……
dir 是數(shù)據(jù)文件路徑。默認在安裝目錄下。
*下面的配置二選一,詳見本文注釋部分2。
###### SNAPSHOTTING ######內(nèi)存快照方式:
默認的內(nèi)存快照策略是,
在900秒(15分鐘)內(nèi),至少有1次數(shù)據(jù)變更;
或者300秒內(nèi),有至少10次數(shù)據(jù)變更;
或者60秒內(nèi),有至少1000次數(shù)據(jù)變更;時間+數(shù)據(jù)變更次數(shù),共同影響內(nèi)存快照的出現(xiàn)。
###### 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 配置參數(shù):
#是否作為守護進程運行?
daemonize yes?
#如以后臺進程運行,則需指定一個pid,默認為/var/run/redis.pid?
pidfile redis.pid?
#綁定主機IP,默認值為127.0.0.1?
#bind 127.0.0.1?
#Redis默認監(jiān)聽端口?
port 6379?
#客戶端閑置多少秒后,斷開連接,默認為300(秒)?
timeout 300?
#日志記錄等級,有4個可選值,debug,verbose(默認值),notice,warning?
loglevel verbose?
#指定日志輸出的文件名,默認值為stdout,也可設為/dev/null屏蔽日志?
logfile stdout?
#可用數(shù)據(jù)庫數(shù),默認值為16,默認數(shù)據(jù)庫為0?
databases 16?
#保存數(shù)據(jù)到disk的策略?
#當有一條Keys數(shù)據(jù)被改變是,900秒刷新到disk一次?
save 900 1?
#當有10條Keys數(shù)據(jù)被改變時,300秒刷新到disk一次?
save 300 10?
#當有1w條keys數(shù)據(jù)被改變時,60秒刷新到disk一次?
save 60 10000?
#當dump .rdb數(shù)據(jù)庫的時候是否壓縮數(shù)據(jù)對象?
rdbcompression yes?
#本地數(shù)據(jù)庫文件名,默認值為dump.rdb?
dbfilename dump.rdb?
#本地數(shù)據(jù)庫存放路徑,默認值為 ./?
dir /var/lib/redis/?
########### Replication #####################?
#Redis的復制配置?
# slaveof <masterip> <masterport> 當本機為從服務時,設置主服務的IP及端口?
# masterauth <master-password> 當本機為從服務時,設置主服務的連接密碼?
#連接密碼?
# requirepass foobared?
#最大客戶端連接數(shù),默認不限制?
# maxclients 128?
#最大內(nèi)存使用設置,達到最大內(nèi)存設置后,Redis會先嘗試清除已到期或即將到期的Key,當此方法處理后,任到達最大內(nèi)存設置,將無法再進行寫入操作。?
# maxmemory <bytes>?
#是否在每次更新操作后進行日志記錄,如果不開啟,可能會在斷電時導致一段時間內(nèi)的數(shù)據(jù)丟失。因為redis本身同步數(shù)據(jù)文件是按上面save條件來同步的,所以有的數(shù)據(jù)會在一段時間內(nèi)只存在于內(nèi)存中。默認值為no?
appendonly no?
#更新日志文件名,默認值為appendonly.aof?
#appendfilename?
#更新日志條件,共有3個可選值。no表示等操作系統(tǒng)進行數(shù)據(jù)緩存同步到磁盤,always表示每次更新操作后手動調(diào)用fsync()將數(shù)據(jù)寫到磁盤,everysec表示每秒同步一次(默認值)。?
# appendfsync always?
appendfsync everysec?
# appendfsync no?
################ VIRTUAL MEMORY ###########?
#是否開啟VM功能,默認值為no?
vm-enabled no?
# vm-enabled yes?
#虛擬內(nèi)存文件路徑,默認值為/tmp/redis.swap,不可多個Redis實例共享?
vm-swap-file /tmp/redis.swap?
#將所有大于vm-max-memory的數(shù)據(jù)存入虛擬內(nèi)存,無論vm-max-memory設置多小,所有索引數(shù)據(jù)都是內(nèi)存存儲的 (Redis的索引數(shù)據(jù)就是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的效果會比較好.因為這樣節(jié)約的內(nèi)存比較大.?
- 當你的key不小時,可以考慮使用一些非常方法將很大的key變成很大的value,比如你可以考慮將key,value組合成一個新的value.?
- 最好使用linux ext3 等對稀疏文件支持比較好的文件系統(tǒng)保存你的swap文件.?
- vm-max-threads這個參數(shù),可以設置訪問swap文件的線程數(shù),設置最好不要超過機器的核數(shù).如果設置為0,那么所有對swap文件的操作都是串行的.可能會造成比較長時間的延遲,但是對數(shù)據(jù)完整性有很好的保證.
?
2. 調(diào)整系統(tǒng)內(nèi)核參數(shù)
如果內(nèi)存情況比較緊張的話,需要設定內(nèi)核參數(shù):?
echo 1 > /proc/sys/vm/overcommit_memory?
這里說一下這個配置的含義:/proc/sys/vm/overcommit_memory
該文件指定了內(nèi)核針對內(nèi)存分配的策略,其值可以是0、1、2。
0,表示內(nèi)核將檢查是否有足夠的可用內(nèi)存供應用進程使用;如果有足夠的可用內(nèi)存,內(nèi)存申請允許;否則,內(nèi)存申請失敗,并把錯誤返回給應用進程。
1,表示內(nèi)核允許分配所有的物理內(nèi)存,而不管當前的內(nèi)存狀態(tài)如何。
2,表示內(nèi)核允許分配超過所有物理內(nèi)存和交換空間總和的內(nèi)存
Redis在dump數(shù)據(jù)的時候,會fork出一個子進程,理論上child進程所占用的內(nèi)存和parent是一樣的,比如parent占用的內(nèi)存為 8G,這個時候也要同樣分配8G的內(nèi)存給child, 如果內(nèi)存無法負擔,往往會造成redis服務器的down機或者IO負載過高,效率下降。所以這里比較優(yōu)化的內(nèi)存分配策略應該設置為 1(表示內(nèi)核允許分配所有的物理內(nèi)存,而不管當前的內(nèi)存狀態(tài)如何)
?
4.調(diào)試debug
注意由于redis默認是啟用了內(nèi)存優(yōu)化的,所以必須修改編譯選項。不然,在gdb內(nèi)打印變量時提示"<value optimized out>",這多半是因為gcc的優(yōu)化導致,我們可以加上-O0選項來強制禁用gcc的編譯優(yōu)化。
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
?
具體調(diào)試技巧,查看指針變量
查看redis進程
# ps? aux|grep redis
gdb附加到進程
# gdb -p? 進程id
(gdb)r???? 重新開始不然不會從main函數(shù)開始
(gdb)break main????????????????? 設置斷點
(gdb)list????????????????? 查看代碼
(gdb)p? 變量名?????? 查看變量內(nèi)容,使用p查看變量,這個時候已經(jīng)可以查看
?
redis調(diào)試技巧
redis會在ae.c的aeMain這個函數(shù)處循環(huán)處理事件:
// 事件處理器的主循環(huán)
void aeMain(aeEventLoop *eventLoop) {eventLoop->stop = 0;while (!eventLoop->stop) {// 如果有需要在事件處理前執(zhí)行的函數(shù),那么運行它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函數(shù)會截獲來自redis-cli的請求,也只有aeMain函數(shù)處理好該請求,redis-cli才會返回OK,不然就會一直等待
?
5.基準測試第一先用啟動命令啟動redis
然后在任意目錄使用命令:
# redis-benchmark-h localhost -p 6379 -c 100 -n 100000
模擬100個并發(fā)連接,100000個請求,檢測host為localhost 端口為6379的redis服務器性能
原文地址:http://blog.csdn.net/unix21/article/details/9526295
------------------------------------------------------------------------
更多參考
配置參考:CentOS下Redis 2.2.14安裝配置詳解
安裝參考:Redis (一) 安裝
調(diào)試參考:http://redis.io/topics/debugging?利用gdb調(diào)試redis-server
benchmark參數(shù): Redis安裝部署
另外需要在PHP中使用redis需要安裝PHP擴展可以參考:
Redis以及Redis的php擴展安裝無錯版
phpredis使用方法
redis常用命令參考
總結(jié)
以上是生活随笔為你收集整理的Redis安装与调试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MyEclipse2014配置Tomca
- 下一篇: 从Nginx源码谈大小写字符转化的最高效