標籤:
Redis是目前眾多NoSQL產品中非常有特點的一款,支援的資料類型和方法都非常豐富,做為一款具備持久化功能的軟體,實際使中更多卻是將其做為cache。 三思在個人的測試環境中安裝使用了兩三天,這期間儘管文檔看了不少,但其實收穫不多,不過對於NoSQL產品的整體看法一直沒變,我覺著各類型NoSQL產品都還只是工具,並且是小工具,稱不上產品。小工具能起大作用這不假(redis目前在國內最知名的案例應該是新浪微博),但前提是為其找到適合的應用情境,深入的瞭解才能用好它。 本文簡要描述了linux環境安裝redis的過程,redis相關參數以及簡單的使用。 1、安裝下載源碼包: # wget http://redis.googlecode.com/files/redis-2.4.10.tar.gz解壓縮: # tar xvfz redis-2.4.10.tar.gz 進入目錄: # cd redis-2.4.10編譯: # make接下來不需要make installSrc目錄下的redis-server和redis-cli兩個命名就是redis服務端和用戶端的應用程式,這兩個命令可以直接調用,建議直接複製到使用者bin目錄下,以方便調用: # cp src/redis-* /usr/local/bin/ 安裝至此完成。 2、配置 直接執行redis-server就可以啟動redis服務,預設監聽連接埠為6379,而後用戶端即可以串連服務端,執行操作。有朋友看到這裡可能按捺不住的驚奇,這也太簡了吧。沒錯,確實可以如此簡單,好的工具都有這樣的特點,上手特別容易,但是想要用好,還是需要深一步研究的。 Redis也是如此,它提供了若干參數,可以用來定製redis服務,以達到更好的效能和匹配業務端的需求。源碼包中有一個名為redis.conf的設定檔,其中包含redis各參數的樣本和功能描述。 daemonize:預設值no,該參數用於定製redis服務是否以守護模式運行。 pidfile:預設值/var/run/redis.pid,指定redis服務的進程號檔案路徑,以守護模式運行時需要配置本參數; port:預設值6379,指定redis服務的連接埠; bind:綁定ip,預設是本機所有網路裝置; timeout:用戶端空閑n秒後中斷連線; loglevel:設定服務端的記錄層級,有下列幾種選擇: debug:記錄詳細資料,用於開發或調試; verbose:提供很多有用的資訊,但是又不像debug那麼詳盡,預設就是這一選項; notice:適度提醒,多用於產品環境; warning:僅顯示重要的警告資訊; logfile:指定日誌的輸出路徑,預設值stdout,表示輸出到螢幕,守護模式時則輸出到/dev/null; 如果要輸出日誌到syslog中,可以啟動syslog-enabled yes,預設該選項值為no。 databases:指定資料庫的數量,預設為16個,預設使用的資料庫是DB 0。 以下為快照相關的設定 save <seconds> <changes>:指定多長時間重新整理快照至磁碟,這個選項有兩個屬性值,只有當兩個屬性值均滿足時才會觸發;可以設定多種層級,例如預設的參數檔案中就設定了: save 900 1:每900秒(15分鐘)至少一次索引值變更時被觸發; save 300 10:每300秒(5分鐘)至少10次索引值變更時被觸發; save 60 10000:每60秒至少10000次索引值變更時被觸發; rdbcompression:預設值yes,當dump資料庫時使用LZF壓縮字串對象,如果CPU資源比較緊張,可以設定為no,選擇不壓縮; dbfilename:預設值dump.rdb,dump到檔案系統中的檔案名稱; dir:預設值./,即目前的目錄,dump出的資料檔案的儲存路徑; 以下為複製相關的設定,複製預設是不啟用的,因此在預設的參數檔案下列表參數均被注釋 # slaveof <masterip> <masterport>:指定主端ip和連接埠,用於建立一個鏡像服務; # masterauth <master-password>:如果master配置了密碼的話,此處也需做設定; slave-serve-stale-data:預設值yes。當slave丟失與master端的串連,或者複製仍在處理,那麼slave會有下列兩種表現: 當本參數值為yes時,slave為繼續響應用戶端請求,儘管資料已不同步甚至沒有資料(出現在初次同步的情況下); 當本參數值為no時,slave會返回"SYNC with master in progreee"的錯誤資訊; # repl-ping-slave-period:預設值10,指定slave定期ping master的周期; # repl-timeout:預設值60,指定逾時時間。注意本參數包括批量傳輸資料和ping響應的時間。 以下為安全相關的設定 # requirepass:指定一個密碼,用戶端串連時也需要通過密碼才能成功串連; # rename-command:重定義命令,例如將CONFIG命令更名為一個很複雜的名字: rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52; rename-command CONFIG "":取消這個命令; 以下為資源限制方面的設定 # maxclients:指定用戶端的最大並發串連數,預設是沒有限制,直到redis無法建立新的進程為止,設定該參數值為0也表示不限制,如果該參數指定了值,當並發串連達到指定值時,redis會關閉所有新串連,並返回‘max number of clients reached‘的錯誤資訊; # maxmemory:設定redis最大可使用記憶體。當達到最大記憶體後,redis會嘗試按照設定的回收策略刪除索引值。如果無法刪除索引值,或者保留原則設定為不清除,那麼redis就會向發出記憶體的請求返回錯誤資訊。當把redis做為一級LRU的緩衝時本參數較為有用。 # maxmemory-policy:預設值volatile-lru,指定清除策略,有下列幾種方法: volatile-lru -> remove the key with an expire set using an LRU algorithm allkeys-lru -> remove any key accordingly to the LRU algorithm volatile-random -> remove a random key with an expire set allkeys->random -> remove a random key, any key volatile-ttl -> remove the key with the nearest expire time (minor TTL) noeviction -> don‘t expire at all, just return an error on write operations # maxmemory-samples:預設值3,LRU和最小TTL策略並非嚴謹的策略,而是大約估算的方式,因此可以選擇取樣值以便檢查。 以下為APPEND ONLY模式的設定,預設情況下redis採用非同步方式dump資料到磁碟上,極端情況下這可能會導致丟失部分資料(比如伺服器突然宕機),如果資料比較重要,不希望丟失,可以啟用直寫的模式,這種模式下redis會將所有接收到的寫操作同步到appendonly.aof檔案中,該檔案會在redis服務啟動時在記憶體中重建所有資料。注意這種模式對效能影響非常之大。 appendonly:預設值no,指定是否啟用直寫入模式; # appendfilename:直寫入模式的預設檔案名稱appendonly.aof; appendfsync:調用fsync()方式讓作業系統寫資料到磁碟上,資料同步方式,有下列幾種模式: always:每次都調用,比如安全,但速度最慢; everysec:每秒同步,這也是預設; no:不調用fsync,由作業系統決定何時同步,比如快的模式; no-appendfsync-on-rewrite:預設值no。當AOF fsync原則設定為always或everysec,後台儲存進程會執行大量的I/O操作。某些linux配置下redis可能會阻塞過多的fsync()調用。 auto-aof-rewrite-percentage:預設值100 auto-aof-rewrite-min-size:預設值64mb 以下為慢日誌相關的設定,用以記錄執行時間超出閥值的查詢。執行時間不包括I/O操作或發送資料到用戶端等佔用的時間,而是真正執行命令所花費的時間(即線程阻塞不能接受其它請求的時間): slowlog-log-slower-than:預設值10000,單位微秒,定義為慢的執行的閥值; slowlog-max-len:預設值1024,慢日誌的最大資料。注意這會佔用內容資源,如果要清空它可以執行SLOWLOG RESET命令; 以下為虛擬記憶體相關的設定,虛擬記憶體在2.4版本廢棄,這裡也略過不提了 vm-enabled no vm-swap-file /tmp/redis.swap vm-max-memory 0 vm-page-size 32 vm-pages 134217728 vm-max-threads 4 以下為進階配置相關的設定 hash-max-zipmap-entries:預設值512,當某個map的元素個數達到最大值,但是其中最大元素的長度沒有達到設定閥值時,其HASH的編碼採用一種特殊的方式(更有效利用記憶體)。本參數與下面的參數組合使用來設定這兩項閥值。設定元素個數; hash-max-zipmap-value:預設值64,設定map中元素的值的最大長度;這兩個 list-max-ziplist-entries:預設值512,與hash類似,滿足條件的list數組也會採用特殊的方式以節省空間的。 list-max-ziplist-value:預設值64 set-max-intset-entries:預設值512,當set類型中的資料都是數實值型別,並且set中整型元素的數量不超過指定值時,使用特殊的編碼方式。 zset-max-ziplist-entries:預設值128,與hash和list類似。 zset-max-ziplist-value:預設值64 activerehashing:預設值yes,用來控制是否自動重建hash。Active rehashing每100微秒使用1微秒cpu時間排序,以重組Redis的hash表。重建是通過一種lazy方式,寫入hash表的操作越多,需要執行rehashing的步驟也越多,如果伺服器當前空閑,那麼rehashing操作會一直執行。如果對即時性要求較高,難以接受redis時不時出現的2微秒的延遲,則可以設定activerehashing為no,否則建議設定為yes,以節省記憶體空間。 以下為包含方面的設定 include:用於指定包含其它參數檔案; 建立一個conf檔案(當然也可以直接使用redis內建的redis.conf)並根據實際情況設定好參數,而後啟動Redis服務時,指定設定檔即可,例如: # more redis.conf daemonize yes pidfile /data/software/redis/redis.pid port 6379 logfile /data/software/redis/redis.log databases 16 save 900 1 save 300 10 save 60 10000 rdbcompression yes dbfilename dump.rdb dir /data/software/redis/ # redis-server /data/software/redis/redis.conf 3、應用 Redis自己也提供了一個命令列的用戶端工具,可用於學習redis中資料操作的各項命令,這裡進行一些簡單的增刪改查測試。 插入資料: redis 127.0.0.1:6379> set name jss OK 查詢資料: redis 127.0.0.1:6379> get name "jss" 改資料,不說了,還是set 刪除資料: redis 127.0.0.1:6379> del name (integer) 1 驗證索引值是否存在: redis 127.0.0.1:6379> exists name (integer) 0 操作結構化資料: redis 127.0.0.1:6379> hset tech:dep sa 10 (integer) 1 redis 127.0.0.1:6379> hset tech:dep dba 3 (integer) 1 redis 127.0.0.1:6379> hset tech:dep arch 6 (integer) 1 redis 127.0.0.1:6379> hgetall tech:dep 1) "sa" 2) "10" 3) "dba" 4) "3" 5) "arch" 6) "6" Redis的命令非常多,詳細可以參考官方文檔:http://redis.io/commands 英文不好的朋友可以參考這個網站,它提供各個命令中文版說明:http://readthedocs.org/docs/redis/en/latest/ Redis支援的用戶端極為廣泛,具體可以參考:http://redis.io/clients。 4、協助遇到錯誤怎麼辦!1、which: no tclsh8.5 ....錯誤 [[email protected] redis-2.4.10]# make test cd src && make test make[1]: Entering directory `/data/software/redis-2.4.10/src‘ which: no tclsh8.5 in (/usr/local/mysql55/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin) You need ‘tclsh8.5‘ in order to run the Redis test make[1]: *** [test] Error 1 make[1]: Leaving directory `/data/software/redis-2.4.10/src‘ make: *** [test] Error 2原因:缺少tcl組件解決方案,安裝即可,詳細可參考http://www.linuxfromscratch.org/blfs/view/cvs/general/tcl.html安裝步驟: # wget http://downloads.sourceforge.net/tcl/tcl8.5.10-src.tar.gz # tar xvfz tcl8.5.10-src.tar.gz # cd tcl8.5.10/unix # ./configure --prefix=/usr \ --enable-threads \ --mandir=/usr/share/man # make # sed -i \ -e "[email protected]^\(TCL_SRC_DIR=‘\).*@\1/usr/include‘@" \ -e "/TCL_B/[email protected]=‘\(-L\)\?.*[email protected]=‘\1/usr/[email protected]" \ tclConfig.sh # make install # make install-private-headers # ln -v -sf tclsh8.5 /usr/bin/tclsh # chmod -v 755 /usr/lib/libtcl8.5.so
Redis安裝和使用樣本