Redis具體解釋與常見問題解決方式

Redis簡單介紹java

 

redis是一個key-value存儲系統。和Memcached相似,它支持存儲的value類型相對不少其它。包含string(字符串)、list(鏈表)、set(集合)、zset(sortedset --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操做,而且這些操做都是原子性的。在此基礎上。redis支持各類不一樣方式的排序。git

與memcached同樣,爲了保證效率,數據都是緩存在內存中。github

差異的是redis會週期性的把更新的數據寫入磁盤或者把改動操做寫入追加的記錄文件。而且在此基礎上實現了master-slave(主從)同步。redis

 

安裝:算法

安裝Redis數據庫

官方站點:http://redis.io/windows

官方下載:http://redis.io/download 可以依據需要下載不一樣版本號緩存

windows版:https://github.com/ServiceStack/redis-windows安全

 

下載安裝包:數據結構

 

解壓啓動Redis

 

解壓redis64-2.8.17版本號後,找到redis.windows.conf。改動配置文件內容,內容例如如下。

 

支持數據結構

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

 

Redis配置文件主要參數配置

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

port 6379

二、綁定的主機地址

bind 127.0.0.1

三、當client閒置多長時間後關閉鏈接。假設指定爲0,表示關閉該功能

timeout 300

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

loglevel verbose

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

logfile stdout

六、設置數據庫的數量,默認數據庫爲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地址及port。在Redis啓動時,它會本身主動從master進行數據同步。

slaveof <masterip><masterport>

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

masterauth <master-password>

1四、設置Redis鏈接password,假設配置了鏈接password,client在鏈接Redis時需要經過AUTH <password>命令提供password,默認關閉。

requirepass foobared

1五、設置同一時間最大client鏈接數,默認無限制。Redis可以同一時候打開的client鏈接數爲Redis進程可以打開的最大文件描寫敘述符數,假設設置 maxclients 0。表示不做限制。當client鏈接數到達限制時,Redis會關閉新的鏈接並向client返回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、 設置在向client應答時,是否把較小的包合併爲一個包發送,默以爲開啓

glueoutputbuf yes

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

hash-max-zipmap-entries 64

hash-max-zipmap-value 512

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

activerehashing yes

2三、slave依據指定的時間間隔向server發送ping請求。

時間間隔可以經過 repl_ping_slave_period 來設置。默認10秒

repl-ping-slave-period10

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

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

(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常見異常處理

1

2

3

# 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

Redisclient常用命令

 

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 #實時監測server接收到的請求

 

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 #清空慢查詢日誌信息

相關文章
相關標籤/搜索