Remote Dictionary Server(Redis)是一個開源的使用 ANSI C 語言編寫、支持網絡、可基於內存亦可持久化的日誌型、Key-Value 數據庫,並提供多種語言的 API。它一般被稱爲數據結構服務器,由於值(value)能夠是 字符串(String), 哈希(Map),列表(list), 集合(sets) 和 有序集合(sorted sets)。redis能夠是純內存數據庫,也能夠將數據記錄到磁盤進行持久化。html
一、最經常使用的就是會話緩存
二、消息隊列,好比支付
三、活動排行榜或計數
四、發佈、訂閱消息(消息通知)
五、商品列表、評論列表等git
redis的配置文件,你會發現仍是頗有條理的。redis配置文件被分紅了幾大塊區域,它們分別是:github
1.通用(general)
2.快照(snapshotting)
3.複製(replication)
4.安全(security)
5.限制(limits)
6.追加模式(append only mode)
7.LUA腳本(lua scripting),暫時不寫
8.慢日誌(slow log)
9.事件通知(event notification),暫時不寫
redis
1.通用:算法
經過daemonize配置項能夠控制redis的運行形式,默認是no(打開客戶端纔會運行,關閉客戶端redis中止運行),若是改成yes,那麼redis就會以daemon形式運行(即後臺運行,咱們應該使用這種形式):數據庫
daemonize yes緩存
當以daemon形式運行時,redis會生成一個pid文件,默認會生成在/var/run/redis.pid。固然,你能夠經過pidfile來指定pid文件生成的位置安全
pidfile /path/to/redis.pid服務器
默認綁定127.0.0.1,redis會響應本機全部可用網卡的鏈接請求。固然,redis容許你經過bind配置項來指定要綁定的IP,咱們能夠綁定一個或多個ip,好比咱們綁定192.168.100.2,那麼192.168.100這個網段的均可以訪問(這個最好是內網網段),也可看下這篇文章(ttps://bingozb.github.io/62.html)網絡
bind 127.0.0.1
redis的默認服務端口是6379,你能夠經過port配置項來修改。若是端口設置爲0的話,redis便不會監聽端口了。
port 6379
「若是redis不監聽端口,還怎麼與外界通訊呢」,其實redis還支持經過unix socket方式來接收請求。能夠經過unixsocket配置項來指定unix socket文件的路徑,並經過unixsocketperm來指定文件的權限。
unixsocket /tmp/redis.sock
unixsocketperm 755
當一個redis-client一直沒有請求發向server端,那麼server端有權主動關閉這個鏈接,能夠經過timeout來設置「空閒超時時限」,0表示永不關閉。
timeout 0
TCP鏈接保活策略,能夠經過tcp-keepalive配置項來進行設置,單位爲秒,假如設置爲60秒,則server端會每60秒向鏈接空閒的客戶端發起一次ACK請求,以檢查客戶端是否已經掛掉,對於無響應的客戶端則會關閉其鏈接。因此關閉一個鏈接最長鬚要120秒的時間。若是設置爲0,則不會進行保活檢測。
tcp-keepalive 300
redis支持經過loglevel配置項設置日誌等級,共分四級,即debug、verbose、notice、warning。
loglevel notice
redis也支持經過logfile配置項來設置日誌文件的生成位置。若是設置爲空字符串,則redis會將日誌輸出到標準輸出。假如你在daemon狀況下將日誌設置爲輸出到標準輸出,則日誌會被寫到/dev/null中。
logfile ""
若是但願日誌打印到syslog中,也很容易,經過syslog-enabled來控制。另外,syslog-ident還可讓你指定syslog裏的日誌標誌
syslog-ident redis
對於redis來講,能夠設置其數據庫的總數量,默認包含16個數據庫,這16個數據庫的編號將是0到15。默認的數據庫是編號爲0的數據庫。用戶可使用select <DBid>來選擇相應的數據庫:
databases 16
2.快照--rdb(redis持久化方法之一):
快照是默認的持久化方式,咱們能夠用以下的指令來讓數據保存到磁盤上,即控制RDB快照功能:
save 900 1 //表示每15分鐘且至少有1個key改變,就觸發一次持久化
save 300 10 //表示每5分鐘且至少有10個key改變,就觸發一次持久化
save 60 10000 //表示每60秒至少有10000個key改變,就觸發一次持久化
若是你想禁用RDB持久化的策略,只要不設置任何save指令就能夠,或者給save傳入一個空字符串參數也能夠達到相同效果,就像這樣:
save ""
若是用戶開啓了RDB快照功能,那麼在redis持久化數據到磁盤時若是出現失敗,默認狀況下,redis會中止接受全部的寫請求。這樣作的好處在於可讓用戶很明確的知道內存中的數據和磁盤上的數據已經存在不一致了。若是redis不顧這種不一致,獨斷獨行的繼續接收寫請求,就可能會引發一些災難性的後果。若是下一次RDB持久化成功,redis會自動恢復接受寫請求。固然,若是你不在意這種數據不一致或者有其餘的手段發現和控制這種不一致的話,你徹底能夠關閉這個功能,以便在快照寫入失敗時,也能確保redis繼續接受新的寫請求。配置項以下:
stop-writes-on-bgsave-error yes
對於存儲到磁盤中的快照,能夠設置是否進行壓縮存儲。若是是的話,redis會採用LZF算法進行壓縮。若是你不想消耗CPU來進行壓縮的話,能夠設置爲關閉此功能,可是存儲在磁盤上的快照會比較大
rdbcompression yes
在存儲快照後,咱們還可讓redis使用CRC64算法來進行數據校驗,可是這樣作會增長大約10%的性能消耗,若是你但願獲取到最大的性能提高,能夠關閉此功能。
rdbchecksum yes
咱們還能夠設置快照文件的名稱,默認是這樣配置的:
dbfilename dump.rdb
最後,你還能夠設置這個快照文件存放的路徑。好比默認設置就是當前文件夾:
dir ./
3.複製:
主從複製(也叫主從同步)能夠防止主機壞掉致使的網站不能正常運做的問題。Redis支持主從複製,並且配置也很簡單。redis的主從複製可讓多個從服務器(slave server)擁有和主服務器(master server)相同的數據庫副本。
特色:
1.一個master能夠擁有多個slave
2.多個slave除了能夠鏈接同一個master外,還能夠鏈接其餘的slave
3.不會阻塞master,在slave同步數據時,master能夠繼續處理客戶端的請求
4.提升了系統的伸縮性,好比多個slave專門用於客戶端的讀操做
5.可在master服務器上禁止數據持久化,而只在slave服務器上進行數據持久化操做
Redis主從複製的過程,分爲兩個階段,第一個階段以下:
(1)slave服務器主動鏈接到master服務器。
(2)slave服務器發送SYNC命令到master服務器請求同步數據。
(3)master服務器備份數據庫到rdb文件。
(4)master服務器將該rdb文件傳輸給slave服務器。
(5)slave服務器清空數據庫數據,把rdb文件數據導入數據庫中。
完成第一階段,接下來master服務器把用戶全部更改數據的操做(寫操做),經過命令的形式轉發給slave服務器,slave服務器只需執行master服務器發送過來的命令就能夠實現後續的同步效果。Redis的主從複製配置很簡單,只需在slave服務器的配置文件中,添加下面的配置項:
指定master(主服務器)的ip和端口
slaveof 192.168.1.115 6379
若是主服務器設置了安全密碼,還要加上這行代碼進行受權
masterauth 密碼
當從redis失去了與主redis的鏈接,或者主從同步正在進行中時,redis該如何處理外部發來的訪問請求呢?這裏,從redis能夠有兩種選擇,第一種選擇:若是slave-serve-stale-data設置爲yes(默認),則從redis仍會繼續響應客戶端的讀寫請求。第二種選擇:若是slave-serve-stale-data設置爲no,則從redis會對客戶端的請求返回「SYNC with master in progress」,固然也有例外,當客戶端發來INFO請求和SLAVEOF請求,從redis仍是會進行處理。設置從redis只讀:
slave-read-only yes
配置完成後,重啓redis從服務器,就已經經過主從複製實現了數據的同步。
4.安全:
咱們能夠要求redis客戶端在向redis-server發送請求以前,先進行密碼驗證。因爲redis性能很是高,因此每秒鐘能夠完成多達15萬次的密碼嘗試,因此你最好設置一個足夠複雜的密碼,不然很容易被黑客破解,咱們設置一個密碼(芝麻開門)。
requirepass zhimakaimen
redis容許咱們對redis指令進行改名,好比將一些比較危險的命令改個名字,避免被誤執行。好比能夠把CONFIG命令改爲一個很複雜的名字,這樣能夠避免外部的調用,同時還能夠知足內部調用的須要:
rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c89
咱們甚至能夠禁用掉CONFIG命令,那就是把CONFIG的名字改爲一個空字符串:
rename-command CONFIG ""
須要注意的是,若是你使用AOF方式進行數據持久化,或者須要與從redis進行通訊,那麼更改指令的名字可能會引發一些問題。
5.限制:
咱們能夠設置redis同時能夠與多少個客戶端進行鏈接。默認狀況下爲10000個客戶端。當你沒法設置進程文件句柄限制時,redis會設置爲當前的文件句柄限制值減去32,由於redis會爲自身內部處理邏輯留一些句柄出來。若是達到了此限制,redis則會拒絕新的鏈接請求,而且向這些鏈接請求方發出「max number of clients reached」以做迴應。
maxclients 10000
咱們甚至能夠設置redis可使用的內存量。一旦到達內存使用上限,redis將會試圖移除內部數據,移除規則能夠經過maxmemory-policy來指定。若是redis沒法根據移除規則來移除內存中的數據,或者咱們設置了「不容許移除」,那麼redis則會針對那些須要申請內存的指令返回錯誤信息,好比SET、LPUSH等。可是對於無內存申請的指令,仍然會正常響應,好比GET等。默認設置爲:
maxmemory <bytes>
須要注意的一點是,若是你的redis是主redis(說明你的redis有從redis),那麼在設置內存使用上限時,須要在系統中留出一些內存空間給同步隊列緩存,只有在你設置的是「不移除」的狀況下,纔不用考慮這個因素。
對於內存移除規則來講,redis提供了多達6種的移除規則。他們是:
1.volatile-lru:使用LRU算法移除過時集合中的key
2.allkeys-lru:使用LRU算法移除key
3.volatile-random:在過時集合中移除隨機的key
4.allkeys-random:移除隨機的key
5.volatile-ttl:移除那些TTL值最小的key,即那些最近才過時的key。
6.noeviction:不進行移除。針對寫操做,只是返回錯誤信息。
maxmemory-policy volatile-lru
LRU算法和最小TTL算法都並不是是精確的算法,而是估算值。因此你能夠設置樣本的大小。假如redis默認會檢查三個key並選擇其中LRU的那個,那麼你能夠改變這個key樣本的數量。
maxmemory-samples 3
6.追加模式--aof(redis持久化方法之二):
啓用aof持久化方式
appendonly yes
日誌追加(aof)方式比快照方式有更好的持久化性,若是啓用了aof,Redis會將每個收到的寫命令經過write函數追加到文件appendonly.aof中,當Redis重啓時,它會執行該文件中的全部命令,這樣就能夠在內存中重建整個redis數據庫的內容。另外,操做系統內核的 I/O 接口可能存在緩存,因此日誌追加方式不可能當即寫入文件,這樣就有可能丟失部分數據。幸運的是,Redis提供瞭解決方法,經過修改配置文件,告訴Redis應該在何時使用fsync函數強制操做系統把緩存中的寫命令寫入磁盤中的日誌文件。有如下三種方法:
#appendfsync no 是否寫入磁盤徹底依賴操做系統,性能最好,持久化沒保證
#appendfsync always 在每次寫請求後都調用fsync()。這種模式下,redis會相對較慢,但數據最安全。
appendfsync everysec 每秒鐘寫入磁盤一次,在性能和持久化方面作了很好的折中,最多存在一秒鐘的數據丟失狀況
默認狀況下爲everysec
當fsync方式設置爲always或everysec時,若是後臺持久化進程須要執行一個很大的磁盤IO操做,那麼redis可能會在fsync()調用時卡住。目前還沒有修復這個問題,這是由於即便咱們在另外一個新的線程中去執行fsync(),也會阻塞住同步寫調用。爲了緩解這個問題,咱們可使用下面的配置項,這樣的話,當BGSAVE或BGWRITEAOF運行時,fsync()在主進程中的調用會被阻止。這意味着當另外一路進程正在對AOF文件進行重構時,redis的持久化功能就失效了,就好像咱們設置了「appendsync none」同樣。若是你的redis有時延問題,那麼請將下面的選項設置爲yes。不然請保持no,由於這是保證數據完整性的最安全的選擇。
no-appendfsync-on-rewrite no
咱們容許redis自動重寫aof。當aof增加到必定規模時,redis會隱式調用BGREWRITEAOF來重寫log文件,以縮減文件體積。redis是這樣工做的:redis會記錄上次重寫時的aof大小。假如redis自啓動至今尚未進行太重寫,那麼啓動時aof文件的大小會被做爲基準值。這個基準值會和當前的aof大小進行比較。若是當前aof大小超出所設置的增加比例,則會觸發重寫。另外,你還須要設置一個最小大小,是爲了防止在aof很小時就觸發重寫。
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
若是設置auto-aof-rewrite-percentage爲0,則會關閉此重寫功能。
8.慢日誌:
redis慢日誌是指一個系統進行日誌查詢超過了指定的時長。這個時長不包括IO操做,好比與客戶端的交互、發送響應內容等,而僅包括實際執行查詢命令的時間。針對慢日誌,你能夠設置兩個參數,一個是執行時長,單位是微秒,另外一個是慢日誌的長度。當一個新的命令被寫入日誌時,最老的一條會從命令日誌隊列中被移除。單位是微秒,即1000000表示一秒。負數則會禁用慢日誌功能,而0則表示強制記錄每個命令。
slowlog-log-slower-than 10000
慢日誌最大長度,能夠隨便填寫數值,沒有上限,但要注意它會消耗內存。你可使用SLOWLOG RESET來重設這個值。
slowlog-max-len 128