天天看點

Redis配置及使用

1、參考資料

線上指令說明: http://doc.redisfans.com/

redis安裝清單: https://github.com/rgl/redis/downloads

Redis工具使用:  https://github.com/uglide/RedisDesktopManager/wiki/Quick-Start

Redis學習手冊(List資料類型) :  http://www.cnblogs.com/stephen-liu74/archive/2012/02/14/2351859.html

Redis的持久化存儲:http://qifuguang.me/2015/10/13/Redis%E6%8C%81%E4%B9%85%E5%8C%96/

2、常用指令

2.1. 連接配接redis伺服器

>進入redis目錄

>redis-cli.exe -h 127.0.0.1 -p 6379

2.2. 關閉服務

>shutdown

2.3. 開啟多個執行個體

> redis-server.exe redis.conf

但是配置中需要加入:slaveof 127.0.0.1 6379

3. 開機啟動redis

sc.exe create redis6379 binPath= ""D:

edis

edis-server.exe" "D:

edis

edis6379.conf"" DisplayName= "redis6379" start= "auto"

解決方法:

建立檔案:redis.vbs

createobject("wscript.shell").run "D:dev

edis-2.4.5start.bat",0

之後,把 start.bat 放在redis-2.4.5目錄下,把redis.vbs放在啟動目錄下

e.g. C:UsersAdministratorAppDataRoamingMicrosoftWindowsStart MenuProgramsStartup

ps: 也可以增加一個計劃任務來完成開機自啟動

建立檔案:start.bat

D:

D:dev

edis-2.4.5

edis-server.exe redis.conf

4、啟動redis程序

StackExchange.Redis

System.Diagnostics.Process.Start("D:\redis\redis-server.exe"); //啟動redis程序(服務)

5、持久化存儲

配置

save 9001

save 30010

save 6010000

dbfilename dump.rdb

dir /opt/soft/redis-3.0.4/cache

注:dir 指的的是工作目錄,而不是exe檔案所在目錄,即cmd進入的目錄

【問題清單】

>> 問題1:redis2.8無法啟動

分       析:redis覺得你的記憶體不夠,不給開啟執行個體,可以配置maxheap來修改

解決方法:

在redis.windows.confi檔案中增加 “maxheap 1024000”

然後在使用指令啟動redis:redis-server redis.windows.conf

>> 問題2:Out Of Memory allocating 32777 bytes

分       析:記憶體配置設定不夠

解決方法:在配置中增加 maxmemory 3221225472

>> 問題3:ERR Operation against a key holding the wrong kind of value

分       析:key對應的value類型不對

解決方法:redis 127.0.0.1:6379>type key

查找key的資料類型,使用對應的指令進行操作

【Redis基本配置示例】

#Redis預設不是以守護程序的方式運作,可以通過該配置項修改,使用yes啟用守護程序。建議為yes

daemonize yes

#如以背景程序運作,則需指定一個pid,預設為/var/run/redis.pid

pidfile redis.pid

#指定Redis監聽端口,預設端口為6379

port 6379

#指定在多長時間内,有多少次更新操作,就将資料同步到資料檔案,可以多個條件配合

save 900 1

save 300 10

save 60 10000

#指定本地資料庫存放目錄

dir ./

#指定本地資料庫檔案名,預設值為dump.rdb

dbfilename dump.rdb

#設定同一時間最大用戶端連接配接數,預設無限制,Redis可以同時打開的用戶端連接配接數為Redis程序可以打開的最大檔案描述符數,

#如果設定 maxclients 0,表示不作限制。當用戶端連接配接數到達限制時,Redis會關閉新的連接配接并向用戶端傳回max number of clients reached錯誤資訊

#從2.8開始預設為10000

maxclients 10000

#指定Redis最大記憶體限制,Redis在啟動時會把資料加載到記憶體中,達到最大記憶體後,Redis會先嘗試清除已到期或即将到期的Key。

#當此方法處理 後,仍然到達最大記憶體設定,将無法再進行寫入操作,但仍然可以進行讀取操作。

#Redis新的vm機制,會把Key存放記憶體,Value會存放在swap區

maxmemory 3221225472

#指定是否在每次更新操作後進行日志記錄,Redis在預設情況下是異步的把資料寫入磁盤,如果不開啟,可能會在斷電時導緻一段時間内的資料丢失。

#因為 redis本身同步資料檔案是按上面save條件來同步的,是以有的資料會在一段時間内隻存在于記憶體中。預設為no

appendonly no

【配置說明】

1. Redis預設不是以守護程序的方式運作,可以通過該配置項修改,使用yes啟用守護程序

   windows上不支援,可以忽略

daemonize no

2. 當Redis以守護程序方式運作時,Redis預設會把pid寫入/var/run/redis.pid檔案,可以通過pidfile指定

pidfile /var/run/redis.pid

3. 指定Redis監聽端口,預設端口為6379,作者在自己的一篇博文中解釋了為什麼選用6379作為預設端口,因為6379在手機按鍵上MERZ對應的号碼,而MERZ取自意大利歌女Alessia Merz的名字

port 6379

4. 綁定的主機位址

bind 127.0.0.1

5.當 用戶端閑置多長時間後關閉連接配接,如果指定為0,表示關閉該功能

timeout 300

6. 指定日志記錄級别,Redis總共支援四個級别:debug、verbose、notice、warning,預設為verbose

loglevel verbose

7. 日志記錄方式,預設為标準輸出,如果配置Redis為守護程序方式運作,而這裡又配置為日志記錄方式為标準輸出,則日志将會發送給/dev/null

logfile stdout

8. 設定資料庫的數量,預設資料庫為0,可以使用SELECT <dbid>指令在連接配接上指定資料庫id

databases 16

9. 指定在多長時間内,有多少次更新操作,就将資料同步到資料檔案,可以多個條件配合

save <seconds> <changes>

    Redis預設配置檔案中提供了三個條件:

save 900 1

save 300 10

save 60 10000

    分别表示900秒(15分鐘)内有1個更改,300秒(5分鐘)内有10個更改以及60秒内有10000個更改。

10. 指定存儲至本地資料庫時是否壓縮資料,預設為yes,Redis采用LZF壓縮,如果為了節省CPU時間,可以關閉該選項,但會導緻資料庫檔案變的巨大

rdbcompression yes

11. 指定本地資料庫檔案名,預設值為dump.rdb

dbfilename dump.rdb

12. 指定本地資料庫存放目錄

dir ./

13. 設定當本機為slav服務時,設定master服務的IP位址及端口,在Redis啟動時,它會自動從master進行資料同步

slaveof <masterip> <masterport>

14. 當master服務設定了密碼保護時,slav服務連接配接master的密碼

masterauth <master-password>

15. 設定Redis連接配接密碼,如果配置了連接配接密碼,用戶端在連接配接Redis時需要通過AUTH <password>指令提供密碼,預設關閉

requirepass foobared

16. 設定同一時間最大用戶端連接配接數,預設無限制,Redis可以同時打開的用戶端連接配接數為Redis程序可以打開的最大檔案描述符數,如果設定 maxclients 0,表示不作限制。當用戶端連接配接數到達限制時,Redis會關閉新的連接配接并向用戶端傳回max number of clients reached錯誤資訊

maxclients 128

17. 指定Redis最大記憶體限制,Redis在啟動時會把資料加載到記憶體中,達到最大記憶體後,Redis會先嘗試清除已到期或即将到期的Key,當此方法處理 後,仍然到達最大記憶體設定,将無法再進行寫入操作,但仍然可以進行讀取操作。Redis新的vm機制,會把Key存放記憶體,Value會存放在swap區

maxmemory <bytes>

18. 指定是否在每次更新操作後進行日志記錄,Redis在預設情況下是異步的把資料寫入磁盤,如果不開啟,可能會在斷電時導緻一段時間内的資料丢失。因為 redis本身同步資料檔案是按上面save條件來同步的,是以有的資料會在一段時間内隻存在于記憶體中。預設為no

appendonly no

19. 指定更新日志檔案名,預設為appendonly.aof

appendfilename appendonly.aof

20. 指定更新日志條件,共有3個可選值:

no:表示等作業系統進行資料緩存同步到磁盤(快)

always:表示每次更新操作後手動調用fsync()将資料寫到磁盤(慢,安全)

everysec:表示每秒同步一次(折衷,預設值)

appendfsync everysec

21. 指定是否啟用虛拟記憶體機制,預設值為no,簡單的介紹一下,VM機制将資料分頁存放,由Redis将通路量較少的頁即冷資料swap到磁盤上,通路多的頁面由磁盤自動換出到記憶體中(在後面的文章我會仔細分析Redis的VM機制)

vm-enabled no

22. 虛拟記憶體檔案路徑,預設值為/tmp/redis.swap,不可多個Redis執行個體共享

vm-swap-file /tmp/redis.swap

23. 将所有大于vm-max-memory的資料存入虛拟記憶體,無論vm-max-memory設定多小,所有索引資料都是記憶體存儲的(Redis的索引資料 就是keys),也就是說,當vm-max-memory設定為0的時候,其實是所有value都存在于磁盤。預設值為0

vm-max-memory 0

24. Redis swap檔案分成了很多的page,一個對象可以儲存在多個page上面,但一個page上不能被多個對象共享,vm-page-size是要根據存儲的 資料大小來設定的,作者建議如果存儲很多小對象,page大小最好設定為32或者64bytes;如果存儲很大大對象,則可以使用更大的page,如果不 确定,就使用預設值

vm-page-size 32

25. 設定swap檔案中的page數量,由于頁表(一種表示頁面空閑或使用的bitmap)是在放在記憶體中的,,在磁盤上每8個pages将消耗1byte的記憶體。

vm-pages 134217728

26. 設定通路swap檔案的線程數,最好不要超過機器的核數,如果設定為0,那麼所有對swap檔案的操作都是串行的,可能會造成比較長時間的延遲。預設值為4

vm-max-threads 4

27. 設定在向用戶端應答時,是否把較小的包合并為一個包發送,預設為開啟

glueoutputbuf yes

28. 指定在超過一定的數量或者最大的元素超過某一臨界值時,采用一種特殊的雜湊演算法

hash-max-zipmap-entries 64

hash-max-zipmap-value 512

29. 指定是否激活重置哈希,預設為開啟(後面在介紹Redis的雜湊演算法時具體介紹)

activerehashing yes

30. 指定包含其它的配置檔案,可以在同一主機上多個Redis執行個體之間使用同一份配置檔案,而同時各個執行個體又擁有自己的特定配置檔案

include /path/to/local.conf

【使用】

問題1:MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error., sPort: 23081, LastCommand:

分析:redis無法完成持久化操作

解決方法:檢查Redis所在的伺服器是否磁盤滿了