簡介
redis是一個開源的key-value資料庫。它的value不僅包括基本的string類型,還支援list,set,sorted set和hash類型。redis官方網站:Redis官網,redis用戶端有多種語言支援版本,C#版本學習教程:ServiceStack.Redis使用教程。
1、安裝
#wget http://redis.googlecode.com/files/redis-2.6.10.tar.gz#tar xzf redis-2.6.10.tar.gz#cd redis-2.6.10#make#mkdir -p /usr/local/bin#cp src/redis-server /usr/local/bin/#cp src/redis-cli /usr/local/bin/#cp src/redis-check-aof /usr/local/bin/#cp src/redis-check-dump /usr/local/bin/#cp src/redis-benchmark /usr/local/bin/#mkdir -p /etc/redis/#cp redis.conf /etc/redis/
安裝過程可能會遇到的問題:
zmalloc.o: In function `zmalloc_used_memory':
[解決辦法]:在src/Makefile開頭加 CFLAGS= -march=i686,編輯src/.make-settings裡的OPT,改為OPT=-O2 -march=i686
# Redis Makefile# Copyright (C) 2009 Salvatore Sanfilippo <antirez at gmail dot com># This file is released under the BSD license, see the COPYING file## The Makefile composes the final FINAL_CFLAGS and FINAL_LDFLAGS using# what is needed for Redis plus the standard CFLAGS and LDFLAGS passed.# However when building the dependencies (Jemalloc, Lua, Hiredis, ...)# CFLAGS and LDFLAGS are propagated to the dependencies, so to pass# flags only to be used when compiling / linking Redis itself REDIS_CFLAGS# and REDIS_LDFLAGS are used instead (this is the case of 'make gcov').## Dependencies are stored in the Makefile.dep file. To rebuild this file# Just use 'make dep', but this is only needed by developers.CFLAGS=-march=i686release_hdr := $(shell sh -c './mkreleasehdr.sh')uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not')OPTIMIZATION?=-O2DEPENDENCY_TARGETS=hiredis linenoise lua# Default settingsSTD= -std=c99 -pedantic
STD=-std=c99 -pedanticWARN=-WallOPT=-O2 -march=i686MALLOC=jemallocCFLAGS=LDFLAGS=REDIS_CFLAGS=REDIS_LDFLAGS=PREV_FINAL_CFLAGS=-std=c99 -pedantic -Wall -O2 -g -rdynamic -ggdb -I../deps/hiredis -I../deps/linenoise -I../deps/lua/src -DUSE_JEMALLOC -I../deps/jemalloc/includePREV_FINAL_LDFLAGS= -g -rdynamic -ggdb
You need ‘tclsh8.5′ in order to run the Redis test
[解決辦法]:是因為沒有安裝tcl或安裝的版本不對,按http://www.linuxfromscratch.org/blfs/view/cvs/general/tcl.html上的說明安裝最新版本。
2、設定檔
先建立使用者和記錄檔目錄,然後修改設定檔。
#useradd redis#mkdir -p /var/lib/redis#mkdir -p /var/log/redis#chown redis.redis /var/lib/redis#chown redis.redis /var/log/redis
修改設定檔,設定進程在後台運行,綁定主機IP地址,設定監聽連接埠,設定資料庫存放路徑等。
#是否作為守護進程運行,預設為nodaemonize yes#如以後台進程運行,則需指定一個pid,預設為/var/run/redis.pidpidfile /var/run/redis.pid#綁定主機IP,預設值為127.0.0.1bind 127.0.0.1#Redis預設監聽連接埠port 6379#用戶端閑置多少秒後,中斷連線,預設為300(秒)timeout 300#日誌記錄等級,有4個可選值,debug,verbose(預設值),notice,warningloglevel verbose#指定日誌輸出的檔案名稱,預設值為stdout,也可設為/dev/null屏蔽日誌logfile /var/log/redis/redislog#可用資料庫數,預設值為16,預設資料庫為0databases 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.rdbdbfilename dump.rdb#本機資料庫存放路徑,預設值為 ./dir /usr/lib/redis###########Replication######################Redis的複製配置# slaveof <masterip> <masterport> 當本機為從服務時,設定主服務的IP及連接埠# masterauth <master-password> 當本機為從服務時,設定主服務的串連密碼#串連密碼# requirepass foobared#最大用戶端串連數,預設不限制# maxclients 128#最大記憶體使用量設定,達到最大記憶體設定後,Redis會先嘗試清除已到期或即將到期的Key,當此方法處理後,任到達最大記憶體設定,將無法再進行寫入操作。# maxmemory <bytes>
maxmemory 1024000000#是否在每次更新操作後進行日誌記錄,如果不開啟,可能會在斷電時導致一段時間內的資料丟失。因為redis本身同步資料檔案是按上面save條件來同步的,所以有的資料會在一段時間內只存在於記憶體中。預設值為noappendonly no#更新記錄檔名,預設值為appendonly.aof#appendfilename#更新日誌條件,共有3個可選值。no表示等作業系統進行資料緩衝同步到磁碟,always表示每次更新操作後手動調用fsync()將資料寫到磁碟,everysec表示每秒同步一次(預設值)。# appendfsync alwaysappendfsync everysec# appendfsync no################ VIRTUAL MEMORY############是否開啟VM功能,預設值為novm-enabled no# vm-enabled yes#虛擬記憶體檔案路徑,預設值為/tmp/redis.swap,不可多個Redis執行個體共用vm-swap-file logs/redis.swap#將所有大於vm-max-memory的資料存入虛擬記憶體,無論vm-max-memory設定多小,所有索引資料都是記憶體儲存的 (Redis的索引資料就是keys),也就是說,當vm-max-memory設定為0的時候,其實是所有value都存在於磁碟。預設值為0。vm-max-memory 0vm-page-size 32vm-pages 134217728vm-max-threads 4############# ADVANCED CONFIG###############glueoutputbuf yeshash-max-zipmap-entries 64hash-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檔案的操作都是串列的.可能會造成比較長時間的延遲,但是對資料完整性有很好的保證.
修改完設定檔後,就可以啟動redis了,#/usr/local/bin/redis-server /etc/redis/redis.conf,可能會遇到的問題:
WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
[解決辦法]:鍵入 sysctl vm.overcommit_memory=1
該檔案指定了核心針對記憶體配置的策略,其值可以是0、1、2。
0,表示核心將檢查是否有足夠的可用記憶體供應用進程使用;如果有足夠的可用記憶體,記憶體申請允許;否則,記憶體申請失敗,並把錯誤返回給應用進程。
1,表示核心允許分配所有的實體記憶體,而不管當前的記憶體狀態如何。
2,表示核心允許分配超過所有實體記憶體和交換空間總和的記憶體
Warning: 32 bit instance detected but no memory limit set. Setting 3.5 GB maxmemory limit with 'noeviction' policy now.
[解決辦法]:修改設定檔 redis.conf,將 maxmemory 設定為 maxmemory 1024000000 #分配256M記憶體
3、配置init指令碼,開機自動運行
建立redis啟動指令碼前,要先配置核心參數,否則在重啟或停止redis時,將會報錯,並且不能自動在停止服務前同步資料到磁碟上:
# vi /etc/sysctl.conf,增加一行vm.overcommit_memory = 1,儲存退出:wq,使設定應用生效,# sysctl –p
建立redis啟動指令碼:
# vi /etc/init.d/redis
#!/bin/bash # # Init file for redis # # chkconfig: - 80 12 # description: redis daemon # # processname: redis # config: /etc/redis/redis.conf # pidfile: /var/run/redis.pid source /etc/init.d/functions #BIN="/usr/local/bin" BIN="/usr/local/bin" CONFIG="/etc/redis/redis.conf" PIDFILE="/var/run/redis.pid" ### Read configuration [ -r "$SYSCONFIG" ] && source "$SYSCONFIG" RETVAL=0 prog="redis-server" desc="Redis Server" start() { if [ -e $PIDFILE ];then echo "$desc already running...." exit 1 fi echo -n $"Starting $desc: " daemon $BIN/$prog $CONFIG RETVAL=$? echo [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog return $RETVAL } stop() { echo -n $"Stop $desc: " killproc $prog RETVAL=$? echo [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog $PIDFILE return $RETVAL } restart() { stop start } case "$1" in start) start ;; stop) stop ;; restart) restart ;; condrestart) [ -e /var/lock/subsys/$prog ] && restart RETVAL=$? ;; status) status $prog RETVAL=$? ;; *) echo $"Usage: $0 {start|stop|restart|condrestart|status}" RETVAL=1 esac exit $RETVAL
設定服務開機時自啟動:
#chmod 755 /etc/init.d/redis #chkconfig --add redis #chkconfig --level 345 redis on #chkconfig --list redis
可能會遇到的問題:
用用戶端工具(redis-cli)在本地串連測試沒有問題,但遠程就是串連不上。找了半天原因,發現原來是被selinux和防火牆的給阻止了,如果只是用於開發測試,建議關掉這兩個東西,免得引起一些莫名其妙的問題。