【Redis】Redis 初探

楊奇龍發表於2016-05-13
一 簡介
  Redis 是一款完全開源免費的高效能的key-value資料庫,可以作為快取,kv結構儲存和佇列,目前在網際網路行業比較廣泛使用。
  Redis作為Key-value型資料庫,它提供了Key-Value 對映關係。除了常規的數值或字串,Redis的鍵值能夠提供 Lists,Sets,Sorted sets (有序集合),Hashes (雜湊表) 多種結構。其中有序集合值得大家去關注。Redis支援諸如列表、集合或有序集合的交集、並集、差集等高階原子操作;同時,如果鍵值的型別是普通數字,Redis則提供自增等原子操作。
  Redis將資料儲存於記憶體中,或被配置為使用虛擬記憶體。透過兩種方式可以實現資料持久化:使用快照的方式,將記憶體中的資料不斷寫入磁碟;或使用類似MySQL的日誌方式,記錄每次更新的日誌。前者效能較高,但是可能會引起一定程度的資料丟失;後者相反,效能較低,但是能保證資料儘量不丟失。

二 安裝
安裝依賴包
yum install gcc-c++
yum install -y tcl
獲取redis軟體
  1. wget http://download.redis.io/releases/redis-2.8.13.tar.gz
  2. tar -xzvf redis-2.8.13.tar.gz
  3. mv redis-2.8.13 /usr/local/redis
  4. cd /usr/local/redis
  5. make
修改配置檔案
mkdir -p /etc/redis
cp redis.conf /etc/redis
注意修改
daemonize yes (no-->yes)設定後臺啟動。
啟動redis
root@rac4:~# >/usr/local/bin/redis-server /etc/redis/redis.conf
如果啟動失敗會有如下報錯:
  1. root@rac4:~# >redis-cli
  2. Could not connect to Redis at 127.0.0.1:6379: Connection refused
  3. not connected> exit
解決問題之後 重新啟動
  1. root@rac4:~# >/usr/local/bin/redis-server /etc/redis/redis.conf
  2. root@rac4:~# >redis-cli
  3. 127.0.0.1:6379>
  4. 127.0.0.1:6379>
  5. 127.0.0.1:6379>
  6. 127.0.0.1:6379> set company youzan.com
  7. OK
  8. 127.0.0.1:6379> get company
  9. "youzan.com"
  10. 127.0.0.1:6379>
三 Redis配置檔案介紹
  1. ####基本配置####
  2. daemonize yes #預設值no,該引數用於定製redis服務是否以守護模式執行。---
  3. pidfile /srv/redis/run/redis.pid #預設值/var/run/redis.pid,指定redis服務的程式號檔案路徑,以守護模式執行時需要配置本引數;
  4. port 6379 #預設值6379,指定redis服務的埠
  5. bind 127.0.0.1 #繫結ip,預設是本機所有網路裝置
  6. timeout 0 #客戶端空閒n秒後斷開連線;預設是 0 表示不斷開。
  7. loglevel notice ###設定服務端的日誌級別,2.8版本預設是notice。有下列幾種選擇:
  8.     debug:記錄詳細資訊,用於開發或除錯;
  9.     verbose:提供很多有用的資訊,但是又不像debug那麼詳盡,預設就是這一選項;
  10.     notice:適度提醒,多用於產品環境;
  11.     warning:僅顯示重要的警告資訊;
  12. logfile stdout #指定日誌的輸出路徑,預設值stdout,表示輸出到螢幕,守護模式時則輸出到/dev/null;
  13. syslog-enabled no #如果要輸出日誌到syslog中,可以啟動syslog-enabled yes,預設該選項值為no。
  14. databases 16 #指定資料庫的數量,預設為16個,預設使用的資料庫是DB 0。
  15. ####持久化相關配置###
  16. #save <seconds> <changes> ##指定多長時間重新整理快照至磁碟,這個選項有兩個屬性值,只有當兩個屬性值均滿足時才會觸發;可以設定多種級別,例如預設的引數檔案中就設定了:
  17. save 900 1 #每900秒(15分鐘)至少一次鍵值變更時被觸發;
  18. save 300 10 #每300秒(5分鐘)至少10次鍵值變更時被觸發;
  19. save 60 10000 #每60秒至少10000次鍵值變更時被觸發;
  20. rdbcompression yes ##預設值yes,當dump資料庫時使用LZF壓縮字串物件,如果CPU資源比較緊張,可以設定為no,選擇不壓縮;
  21. rdbchecksum yes
  22. # The filename where to dump the DB 資料庫檔名
  23. dbfilename dump.rdb ##預設值dump.rdb,dump到檔案系統中的檔名,注意只能是名稱,不能是路徑。
  24. dir /usr/local/webserver/redis/db ##預設值./,即當前目錄,dump出的資料檔案的儲存路徑;

  25. ####以下為複製相關的設定#####
  26. ####複製預設是不啟用的,因此在預設的引數檔案下列表引數均被註釋####
  27. # slaveof <masterip> <masterport> ##指定主端ip和埠,用於建立一個映象服務
  28. # masterauth <master-password> ##如果master配置了密碼的話,此處也需做設定;
  29. slave-serve-stale-data yes ##預設值yes。當slave丟失與master端的連線,或者複製仍在處理,那麼slave會有下列兩種表現:
  30. #當本引數值為yes時,slave為繼續響應客戶端請求,儘管資料已不同步甚至沒有資料(出現在初次同步的情況下)
  31. #當本引數值為no時,slave會返回"SYNC with master in progreee"的錯誤資訊;
  32. slave-read-only yes ##預設從Redis是隻讀模式
  33. # repl-ping-slave-period 10 ###預設值10,指定slave定期ping master的週期;
  34. # repl-timeout 60 ##預設值60,指定超時時間。注意本引數包括批次傳輸資料和ping響應的時間。
  35. ####安全相關的設定####
  36. # requirepass foobared ###指定一個密碼,客戶端連線時也需要透過密碼才能成功連線;
  37. # rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52 ###重定義命令,例如將CONFIG命令更名為一個很複雜的名字:
  38. # rename-command CONFIG "" 取消這個命令;
  39. ####資源限制方面的設定###
  40. # maxclients 10000 #指定客戶端的最大併發連線數,預設是沒有限制,直到redis無法建立新的程式為止,設定該引數值為0也表示不限制,如果該引數指定了值,當併發連線達到指定值時,redis會關閉所有新連線,並返回'max number of clients reached'的錯誤資訊;
  41. # maxmemory <bytes> #設定redis最大可使用記憶體。當達到最大記憶體後,redis會嘗試按照設定的回收策略刪除鍵值。如果無法刪除鍵值,或者保留策略設定為不清除,那麼redis就會向發出記憶體的請求返回錯誤資訊。當把redis做為一級LRU的快取時本引數較為有用。
  42. # maxmemory-policy volatile-lru ###預設值volatile-lru,指定清除策略,有下列幾種方法:
  43. volatile-lru -> remove the key with an expire set using an LRU algorithm
  44. allkeys-lru -> remove any key accordingly to the LRU algorithm
  45. volatile-random -> remove a random key with an expire set
  46. allkeys->random -> remove a random key, any key
  47. volatile-ttl -> remove the key with the nearest expire time (minor TTL)
  48. noeviction -> don not expire at all, just return an error on write operations
  49. # maxmemory-samples 3 #預設值3,LRU和最小TTL策略並非嚴謹的策略,而是大約估算的方式,因此可以選擇取樣值以便檢查。
  50. ####APPEND的配置-####
  51. ONLY模式的設定,預設情況下redis採用非同步方式dump資料到磁碟上,極端情況下這可能會導致丟失部分資料(比如伺服器突然當機),如果資料比較重要,不希望丟失,可以啟用直寫的模式,這種模式下redis會將所有接收到的寫操作同步到appendonly.aof檔案中,該檔案會在redis服務啟動時在記憶體中重建所有資料。注意這種模式對效能影響非常之大。
  52. appendonly no ##預設值no,指定是否啟用直寫模式;
  53. # appendfilename appendonly.aof ###直寫模式的預設檔名appendonly.aof
  54. appendfsync:呼叫fsync()方式讓作業系統寫資料到磁碟上,資料同步方式,有下列幾種模式:
  55.     always:每次都呼叫,比如安全,但速度最慢;
  56.     everysec:每秒同步,這也是預設方式;
  57.     no:不呼叫fsync,由作業系統決定何時同步,比如快的模式;
  58.     no-appendfsync-on-rewrite:預設值no。當AOF fsync策略設定為always或everysec,後臺儲存程式會執行大量的I/O操作。某些linux配置下redis可能會阻塞過多的fsync()呼叫。
  59.     auto-aof-rewrite-percentage:預設值100
  60.     auto-aof-rewrite-min-size:預設值64mb
  61. # appendfsync always
  62. appendfsync everysec
  63. # appendfsync no
還有很多其他的引數,難以一次性介紹完整,有心的朋友可以看看redis.cnf檔案裡面自帶的介紹。

四 遇到的問題
1 編譯的時候報錯
In file included from adlist.c:34:
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 `/root/redis-2.8.13/src'
解決方法
Selecting a non-default memory allocator when building Redis is done by setting the `MALLOC` environment variable. Redis is compiled and linked against libc malloc by default, with the exception of jemalloc being the default on Linux systems. This default was picked because jemalloc has proven to have fewer fragmentation problems than libc malloc.  
To force compiling against libc malloc, use:  
    % make MALLOC=libc  
To compile against jemalloc on Mac OS X systems, use:  
    % make MALLOC=jemalloc
編譯的時候指定MALLOC=libc的方式
  1. root@rac4:~/redis-2.8.13# >make MALLOC=libc
  2. cd src && make all
2 因為我的是虛擬機器,記憶體只有500M,上面安裝了MySQL 導致系統記憶體不足,剛剛啟動報錯
[22270] 11 May 09:52:10.453 # Server started, Redis version 2.8.13
[22270] 11 May 09:52:10.458 # 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.
[22270] 11 May 09:52:10.458 * The server is now ready to accept connections on port 6379
解決方法
  按照提示執行 sysctl vm.overcommit_memory=1 。這裡科普一下 vm.overcommit_memory
預設值為:0
該引數有三個值,分別是:
0:當使用者空間請求更多的的記憶體時,核心嘗試估算出剩餘可用的記憶體。
1:當設這個引數值為1時,核心允許超量使用記憶體直到用完為止,主要用於科學計算
2:當設這個引數值為2時,核心會使用一個決不過量使用記憶體的演算法,即系統整個記憶體地址空間不能超過swap+50%的RAM值,50%引數的設定是在overcommit_ratio中設定。
關於 vm.overcommit_ratio
預設值為:50
這個引數值只有在vm.overcommit_memory=2的情況下,這個引數才會生效。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22664653/viewspace-2099265/,如需轉載,請註明出處,否則將追究法律責任。

相關文章