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⑵.8.17.tar.gz
# tar xzf redis⑵.8.17.tar.gz
# cd redis⑵.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⑵.6.2/src'
make: *** [all] Error 2
解決辦法是:
make MALLOC=libc
注意:Redis并沒有自己實現內存池,沒有在標準的系統內存分配器上再加上自己的東西。
redis⑵.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:Redishttp://www.vxbq.cn/server/的daemon啟動程序
redis-cli:Redis命令行操作工具。固然,你也能夠用telnet根據其純文本協議來操作
redis-benchmark:Redis性能測試工具,測試Redis在你的系統及你的配置下的讀寫性能
redis-check-aof:更新日志檢查
redis-check-dump:用于本地http://www.vxbq.cn/db/檢查
為何沒用標準的Linux安裝3板斧呢?官方維基是這樣說的: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以后,會出現1句提示:
Hint: To run 'make test' is a good idea ;)
-----------------------------------------------------------------
其實不測試,1般都可以用。但是既然人家建議了,我們就走1下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
注:固然,也能夠簡單1點,用 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⑵.8.17/src/redis-server
如果沒有更改daemonize no配置,會看見運行的信息。
注釋:
▲redis的默許端口號是6379,(據redis的作者antirez的博文說,6379在是手機按鍵上MERZ對應的號碼,而MERZ取自意大利歌女Alessia Merz的名字。而MERZ長時間以來被antirez及其朋友當作笨拙的代名詞。)
▲Redis有兩種存儲方式,默許是snapshot方式,實現方法是定時將內存的快照(snapshot)持久化到硬盤,這類方法缺點是持久化以后如果出現crash則會丟失1段數據。因此在完善主義者的推動下作者增加了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⑵.8.17/src/redis-server /usr/redis⑵.8.17/redis.conf
查看redis進程
#ps aux |grep redis
啟動多個redis實例
拷貝默許的redis.conf改成redis6383.conf,打開redis6383.conf配置文件,找到port 6379這行,把6379改成6383
# /usr/redis⑵.8.17/src/redis-server
# /usr/redis⑵.8.17/src/redis-server /usr/redis⑵.8.17/redis6383.conf
調用服務:
# /usr/redis⑵.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內存分配器
redis的配置文件在你的安裝目錄里。名為:redis.conf。
簡單說幾點redis.conf:
redis默許不是用守護進程的,如果需要更改,把daemonize no改成daemonize yes。(測試的時候可以不改,看看打印信息。)
如果對redis默許6379端口不爽的,可以更改port 6379
如果想把數據文件放到1個指定文件夾,更改dir /opt/data/
默許是dir ./ 也就是默許放到安裝目錄下。
連接超時時間,timeout 300,沒甚么改頭……
dir 是數據文件路徑。默許在安裝目錄下。
*下面的配置2選1,詳見本文注釋部份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
#是不是作為守護進程運行
daemonize yes
#如以后臺進程運行,則需指定1個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
#可用http://www.vxbq.cn/db/數,默許值為16,默許http://www.vxbq.cn/db/為0
databases 16
#保存數據到disk的策略
#當有1條Keys數據被改變是,900秒刷新到disk1次
save 900 1
#當有10條Keys數據被改變時,300秒刷新到disk1次
save 300 10
#當有1w條keys數據被改變時,60秒刷新到disk1次
save 60 10000
#當dump .rdbhttp://www.vxbq.cn/db/的時候是不是緊縮數據對象
rdbcompression yes
#本地http://www.vxbq.cn/db/文件名,默許值為dump.rdb
dbfilename dump.rdb
#本地http://www.vxbq.cn/db/寄存路徑,默許值為 ./
dir /var/lib/redis/
########### Replication #####################
#Redis的復制配置
# slaveof <masterip> <masterport> 當本機為從服務時,設置主服務的IP及端口
# masterauth <master-password> 當本機為從服務時,設置主服務的連接密碼
#連接密碼
# requirepass foobared
#最大客戶端連接數,默許不限制
# maxclients 128
#最大內存使用設置,到達最大內存設置后,Redis會先嘗試清除已到期或行將到期的Key,當此方法處理后,任到達最大內存設置,將沒法再進行寫入操作。
# maxmemory <bytes>
#是不是在每次更新操作落后行日志記錄,如果不開啟,可能會在斷電時致使1段時間內的數據丟失。由于redis本身同步數據文件是按上面save條件來同步的,所以有的數據會在1段時間內只存在于內存中。默許值為no
appendonly no
#更新日志文件名,默許值為appendonly.aof
#appendfilename
#更新日志條件,共有3個可選值。no表示等操作系統進行數據緩存同步到磁盤,always表示每次更新操作后手動調用fsync()將數據寫到磁盤,everysec表示每秒同步1次(默許值)。
# 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的使用提出了1些建議:
如果內存情況比較緊張的話,需要設定內核參數:
echo 1 > /proc/sys/vm/overcommit_memory
這里說1下這個配置的含義:/proc/sys/vm/overcommit_memory
該文件指定了內核針對內存分配的策略,其值可以是0、1、2。
0,表示內核將檢查是不是有足夠的可用內存供利用進程使用;如果有足夠的可用內存,內存申請允許;否則,內存申請失敗,并把毛病返回給利用進程。
1,表示內核允許分配所有的物理內存,而不管當前的內存狀態如何。
2,表示內核允許分配超過所有物理內存和交換空間總和的內存
Redis在dump數據的時候,會fork出1個子進程,理論上child進程所占用的內存和parent是1樣的,比如parent占用的內存為 8G,這個時候也要一樣分配8G的內存給child, 如果內存沒法負擔,常常會造成redishttp://www.vxbq.cn/server/的down機或IO負載太高,效力降落。所以這里比較優化的內存分配策略應當設置為 1(表示內核允許分配所有的物理內存,而不管當前的內存狀態如何)
4.調試debug
注意由于redis默許是啟用了內存優化的,所以必須修改編譯選項。不然,在gdb內打印變量時提示"<value optimized out>",這多半是由于gcc的優化致使,我們可以加上-O0選項來強迫禁用gcc的編譯優化。
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這個函數處循環處理事件:
# /usr/redis⑵.6.14/src/redis-cli
redis> set foo bar
OK
redis> get foo"bar"
aeMain函數會截獲來自redis-cli的要求,也只有aeMain函數處理好該要求,redis-cli才會返回OK,不然就會1直等待
5.基準測試
第1先用啟動命令啟動redis
然后在任意目錄使用命令:
# redis-benchmark-h localhost -p 6379 -c 100 -n 100000
摹擬100個并發連接,100000個要求,檢測host為localhost 端口為6379的redishttp://www.vxbq.cn/server/性能
原文地址:http://blog.csdn.net/unix21/article/details/9526295
------------------------------------------------------------------------
更多參考
配置參考:CentOS下Redis 2.2.14安裝配置詳解
安裝參考:Redis (1) 安裝
調試參考:http://redis.io/topics/debugging 利用gdb調試redis-server
benchmark參數: Redis安裝部署
另外需要在PHP中使用redis需要安裝PHP擴大可以參考:
Redis和Redis的php擴大安裝無錯版
phpredis使用方法
redis經常使用命令參考