Redis詳解與常見問題解決方案

Redis簡介java

redis是一個key-value存儲系統。和Memcached相似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sortedset --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操做,並且這些操做都是原子性的。在此基礎上,redis支持各類不一樣方式的排序。與memcached同樣,爲了保證效率,數據都是緩存在內存中。區別的是redis會週期性的把更新的數據寫入磁盤或者把修改操做寫入追加的記錄文件,而且在此基礎上實現了master-slave(主從)同步。git

安裝:github

安裝Redisredis

官方網站:http://redis.io/算法

官方下載:http://redis.io/download 能夠根據須要下載不一樣版本數據庫

windows版:https://github.com/ServiceStack/redis-windowswindows

下載安裝包:緩存



解壓啓動Redis安全

解壓redis64-2.8.17版本後,找到redis.windows.conf,修改配置文件內容,內容以下。服務器



支持數據結構

redis提供五種數據類型:String,hash,list,set及zset(sortedset)。

Redis配置文件主要參數配置

一、指定Redis監聽端口,默認端口爲6379。

port 6379

二、綁定的主機地址

bind 127.0.0.1

三、當客戶端閒置多長時間後關閉鏈接,若是指定爲0,表示關閉該功能

timeout 300

四、指定日誌記錄級別,Redis總共支持四個級別:debug、verbose、notice、warning,默認爲verbose。

loglevel verbose

五、日誌記錄方式,默認爲標準輸出,若是配置Redis爲守護進程方式運行,而這裏又配置爲日誌記錄方式爲標準輸出,則日誌將會發送給/dev/null。

logfilestdout

六、設置數據庫的數量,默認數據庫爲0,可使用SELECT <dbid>命令在鏈接上指定數據庫id。

databases 16

七、指定在多長時間內,有多少次更新操做,就將數據同步到數據文件,能夠多個條件配合。

save <seconds><changes>

八、Redis默認配置文件中提供了三個條件:

save 900 1

save 300 10

save 60 10000

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

九、指定存儲至本地數據庫時是否壓縮數據,默認爲yes,Redis採用LZF壓縮,若是爲了節省CPU時間,能夠關閉該選項,但會致使數據庫文件變的巨大。

rdbcompression yes

十、指定本地數據庫文件名,默認值爲dump.rdb。

dbfilename dump.rdb

十一、 指定本地數據庫存放目錄。

dir ./

十二、設置當本機爲slave服務時,設置master服務的IP地址及端口,在Redis啓動時,它會自動從master進行數據同步。

slaveof <masterip><masterport>

1三、當master服務設置了密碼保護時,slave服務鏈接master的密碼。

masterauth <master-password>

1四、設置Redis鏈接密碼,若是配置了鏈接密碼,客戶端在鏈接Redis時須要經過AUTH <password>命令提供密碼,默認關閉。

requirepass foobared

1五、設置同一時間最大客戶端鏈接數,默認無限制,Redis能夠同時打開的客戶端鏈接數爲Redis進程能夠打開的最大文件描述符數,若是設置 maxclients 0,表示不做限制。當客戶端鏈接數到達限制時,Redis會關閉新的鏈接並向客戶端返回max number of clientsreached錯誤信息。

maxclients 128

1六、指定Redis最大內存限制,Redis在啓動時會把數據加載到內存中,達到最大內存後,Redis會先嚐試清除已到期或即將到期的Key,當此方法處理 後,仍然到達最大內存設置,將沒法再進行寫入操做,但仍然能夠進行讀取操做。Redis新的vm機制,會把Key存放內存,Value會存放在swap區。

maxmemory <bytes>

1七、指定是否在每次更新操做後進行日誌記錄,Redis在默認狀況下是異步的把數據寫入磁盤,若是不開啓,可能會在斷電時致使一段時間內的數據丟失。由於 redis自己同步數據文件是按上面save條件來同步的,因此有的數據會在一段時間內只存在於內存中。默認爲no。

appendonly no

1八、指定更新日誌文件名,默認爲appendonly.aof

appendfilename appendonly.aof

1九、指定更新日誌條件,共有3個可選值:

no:表示等操做系統進行數據緩存同步到磁盤(快)

always:表示每次更新操做後手動調用fsync()將數據寫到磁盤(慢,安全)

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

appendfsync everysec

20、 設置在向客戶端應答時,是否把較小的包合併爲一個包發送,默認爲開啓

glueoutputbuf yes

2一、指定在超過必定的數量或者最大的元素超過某一臨界值時,採用一種特殊的哈希算法。

hash-max-zipmap-entries 64

hash-max-zipmap-value 512

2二、指定是否激活重置哈希,默認爲開啓(後面在介紹Redis的哈希算法時具體介紹)。

activerehashingyes

2三、slave根據指定的時間間隔向服務器發送ping請求。時間間隔能夠經過 repl_ping_slave_period 來設置。默認10秒

repl-ping-slave-period10

2四、當一個slave失去和master的鏈接,或者同步正在進行中,slave的行爲有兩種可能:

(1) 若是 slave-serve-stale-data 設置爲 "yes" (默認值),slave會繼續響應客戶端請求,多是正常數據,也多是還沒得到值的空數據。

(2) 若是 slave-serve-stale-data 設置爲 "no",slave會回覆"正在從master同步(SYNCwith master in progress)"來處理各類請求,除了 INFO 和 SLAVEOF 命令。

slave-serve-stale-datayes

2五、Redis主從配置

redis支持master-slave的主從配置,配置方法是在從機的配置文件中指定slaveof參數爲主機的ip和port便可。

slaveof 192.168.1.23 6379

2六、 指定包含其它的配置文件,能夠在同一主機上多個Redis實例之間使用同一份配置文件,而同時各個實例又擁有本身的特定配置文件。

include /path/to/local.conf

include /path/to/other.conf

Redis中常見異常處理以及內存CPU優化

Redis常出現問題總結:

一、當出現修改--maxheap and --heapdir

在啓動這兩個版本時都會建立一個 RedisQFork.dat文件,我不肯定 RedisQFork 文件是否變小一點, 但我肯定, 你能夠經過設置Redis啓動參數 heapdir 來調整這個文件的位置。

我在 redis.windows.conf文件中搜索"heapdir",而後在默認註釋掉的內容下面添加一行,指定Redis內存映射文件(memory mapped file)存放的路徑:

二、redis常見異常處理

123# heapdir指定內存映射文件路徑名,不能是文件名# heapdir <directory path(absoluteorrelative)>heapdir D:/temp/redis_heapdir/

具體文件和目錄就請你根據本身的磁盤進行指定啦. 個人症狀和狀況是這樣的, 16GB內存,Windows版64bit的Redis,啓動Redis後就在C盤的C:\Windows\ServiceProfiles\NetworkService\AppData\Local\Redis目錄下面生成一個16GB大小的 RedisQFork_8792.dat 文件(8792是本次啓動的進程PID, 關閉redis 則此文件自動被刪除). 原本當初爲了省錢只上了64GB的固態硬盤,結果16G一吃下來,C盤就只有16GB空餘空間,自從設置到D盤,重啓之後,感受強迫症就好多了。

三、常見異常處理

若是你遇到 java.net.SocketTimeoutException: Readtimed out exception的異常信息

請嘗試在構造JedisPool的時候設置本身的超時值. JedisPool默認的超時時間是2秒(單位毫秒)

pool = new JedisPool(config, ip,port,RedisConfig.getTimeout());

四、Redis中CPU使用效率優化

將no-appendfsync-on-rewrite的配置設爲yes能夠緩解這個問題,設置爲yes表示rewrite期間對新寫操做不fsync,暫時存在內存中,等rewrite完成後再寫入。

最好是不開啓Master的AOF備份功能。

Redis也能夠關閉自動持久化,註釋掉這些save配置,或者save 「」

若是後臺保存到磁盤發生錯誤,將中止寫操做。

stop-writes-on-bgsave-error yes。

使用LZF壓縮rdb文件,這會耗CPU, 可是能夠減小磁盤佔用。

rdbcompression yes

保存rdb和加載rdb文件的時候檢驗,能夠防止錯誤,可是要付出約10%的性能,能夠關閉他,提升性能。

rdbchecksum yes

五、當出現如下錯誤時:

VirtualAlloc/COWAlloc fail! Out Of Memory allocating 42bytes!

修改:maxmemory 1024000000

maxheap 1024000000

Redis客戶端經常使用命令

get key

set key value

clear

exists key

del key

dbsize

lpush key value

info all

info

monitor

hgetall key

redis 127.0.0.1:6379> info #查看server版本內存使用鏈接等信息

redis 127.0.0.1:6379> client list #獲取客戶鏈接列表

redis 127.0.0.1:6379> client kill 127.0.0.1:33441 #終止某個客戶端鏈接

redis 127.0.0.1:6379> dbsize #當前保存key的數量

redis 127.0.0.1:6379> save #當即保存數據到硬盤

redis 127.0.0.1:6379> bgsave #異步保存數據到硬盤

redis 127.0.0.1:6379> flushdb #當前庫中移除全部key

redis 127.0.0.1:6379> flushall #移除全部key從全部庫中

redis 127.0.0.1:6379> lastsave #獲取上次成功保存到硬盤的時間戳

redis 127.0.0.1:6379> monitor #實時監測服務器接收到的請求

redis 127.0.0.1:6379> slowlog len #查詢慢查詢日誌條數

redis 127.0.0.1:6379> slowlog get #返回全部的慢查詢日誌,最大值取決於slowlog-max-len配置

redis 127.0.0.1:6379> slowlog get 2 #打印兩條慢查詢日誌

redis 127.0.0.1:6379> slowlog reset #清空慢查詢日誌信息

相關文章
相關標籤/搜索