內存數據庫,用於作緩存。可作分佈式鎖,提供多種數據類型支持不一樣業務場景。支持事務、持久化、LUA腳本、LRU驅動事件。redis
高性能:第一次訪問數據庫中的數據會比較慢,由於是從磁盤上讀取。將用戶第一次訪問的數據放入緩存,第二次或之後的屢次訪問直接查緩存,沒有再去磁盤,提升查詢效率,縮短查詢時間。若是數據庫中的數據改變,那麼就同步改變緩存中的數據。數據庫
高併發:直接操做緩存可以承受的請求遠遠超過直接訪問數據的請求。能夠考慮將部分數據庫中的數據移到緩存中,從而實現一部分請求不通過數據庫,而直接進入緩存。緩存
緩存分爲兩種:分佈式緩存和本地緩存,redis是分佈式緩存,map是本地緩存。安全
本次緩存容量小,有上限。分佈式緩存容量大。數據結構
map緩存不具備一致性,redis緩存具備一致性。併發
支持多種數據類型(list set zset hash等等)而傳統memcache僅支持String類型app
redis支持數據持久化,能夠將內存中的數據保存在磁盤中。重啓redis可直接使用。dom
redis使用單線程的多路IO複用模型,數據安全。分佈式
String:String數據結構爲簡單的Key-Value類型,value不只能夠是字符串,也能夠是數字。高併發
使用場景:統計數量,粉絲數量,用戶數量。
List:支持反向查找和遍歷,但有額外開銷。可實現分頁查詢。
使用場景:分頁查詢
Set:相比較List,Set中不容許存儲重複的元素。
使用場景:統計共同關注好友等
Redis有設置過時的功能,就是對存儲在redis緩存中的數據設置有效時間。短信驗證碼或者郵箱驗證碼是一個很好的實例。
按期刪除:默認每隔100ms隨機抽取那些設置過時數據的key,檢查是否過時,過去就刪除,是隨機抽取的。
惰性刪除: 按期刪除可能致使許多過時的key過了有效時間卻沒有被刪除,當過時key沒有靠按期刪除機制刪除時,就停留在內存中,除非系統去查看那些key,纔會被redis刪除。這就是惰性刪除。
解決策略:僅僅經過設置過時時間還不夠,還須要內存淘汰策略。關於內存淘汰機制,請繼續往下看。
volatile-ru:從已設置過時時間的數據集(server.db[i].expires)中挑選出最近最少使用的數據,而後淘汰。
volatile-til:從已設置過時時間的數據集(server.db[i].expires)中挑選將要過時的數據,而後淘汰。
volatile-random:從已設置過時時間的數據(server.db[i].expires)中選擇任意數據,而後淘汰。
allkeys-lru:當內存不足以容納新的寫入數據操做時,在鍵空間中,移除最近最少使用的key(經常使用)
alleys-random:從數據集(server.db[i].dict)中選擇任意數據淘汰。
no-eviction:禁止驅逐數據。就是不容許刪除數據,沒人使用這個。
爲何要有持久化機制?
多數是爲了「數據重用」,好比咱們重啓機制、機制故障以後進行恢復數據。
RDB持久化
save | 900 1 | 900秒後,至少有1個key發生變化,redis自動觸發BGSAVE命令 |
save | 300 10 | 300秒後,至少有10個key發生變化,redis自動觸發BGSAVE命令 |
save | 60 10000 | 60秒後,至少有10000個key發生變化,redis自動觸發BGSAVE命令 |
AOF持久化
AOF相比較RDB,AOF的實時性更好,redis默認狀況下沒有開啓AOF(append only file)方式的持久化,能夠經過設置appendonly參數開啓:appendonly:yes
AOF開啓後,每執行一條更改操做,redis就會將該命令寫入磁盤中的AOF文件。
在redis的配置文件中存在三種不一樣的AOF持久化方式:
appendfsync always # 每次有數據修改時會寫入AOF文件,會下降redis的速度
appendfsync everysec # 每秒鐘同步一次,顯式地將多個寫命令同步到磁盤。
appendfsync no # 讓操做系統決定什麼時候進行同步操做
爲了兼顧數據存儲和寫入性能,用戶能夠考慮appendfsync everysec一項,讓redis每秒同步一次,這樣用戶最多丟失1秒的數據,當磁盤IO繁忙時,redis會放慢本身的速度以使用磁盤的最大寫入速度。