Redis知識點小結一 概念: 記憶體資料庫,用於做緩存。可做分散式鎖,提供多種數據類型支持不同業務場景。支持事務、持久化、LUA腳本、LRU驅動事件。 記憶體資料庫,用於做緩存。可做分散式鎖,提供多種數據類型支持不同業務場景。支持事務、持久化、LUA腳本、LRU驅動事件。 高性能和高併發 高性能:第一 ...
概念:
-
記憶體資料庫,用於做緩存。可做分散式鎖,提供多種數據類型支持不同業務場景。支持事務、持久化、LUA腳本、LRU驅動事件。
高性能和高併發
-
高性能:第一次訪問資料庫中的數據會比較慢,因為是從磁碟上讀取。將用戶第一次訪問的數據放入緩存,第二次或以後的多次訪問直接查緩存,沒有再去磁碟,提高查詢效率,縮短查詢時間。如果資料庫中的數據改變,那麼就同步改變緩存中的數據。
-
高併發:直接操作緩存能夠承受的請求遠遠超過直接訪問數據的請求。可以考慮將部分資料庫中的數據移到緩存中,從而實現一部分請求不經過資料庫,而直接進入緩存。
為什麼不用map做緩存卻用redis呢
-
緩存分為兩種:分散式緩存和本地緩存,redis是分散式緩存,map是本地緩存。
-
本次緩存容量小,有上限。分散式緩存容量大。
-
map緩存不具有一致性,redis緩存具有一致性。
redis的優點
-
支持多種數據類型(list set zset hash等等)而傳統memcache僅支持String類型
-
redis支持數據持久化,可以將記憶體中的數據保存在磁碟中。重啟redis可直接使用。
-
redis使用單線程的多路IO復用模型,數據安全。
redis常用數據結構及使用場景
-
String:String數據結構為簡單的Key-Value類型,value不僅可以是字元串,也可以是數字。
-
使用場景:統計數量,粉絲數量,用戶數量。
-
-
List:支持反向查找和遍歷,但有額外開銷。可實現分頁查詢。
-
使用場景:分頁查詢
-
-
Set:相比較List,Set中不允許存儲重覆的元素。
-
使用場景:統計共同關註好友等
-
redis過期時間
-
Redis有設置過期的功能,就是對存儲在redis緩存中的數據設置有效時間。簡訊驗證碼或者郵箱驗證碼是一個很好的實例。
redis的刪除策略
-
定期刪除:預設每隔100ms隨機抽取那些設置過期數據的key,檢查是否過期,過去就刪除,是隨機抽取的。
-
惰性刪除: 定期刪除可能導致許多過期的key過了有效時間卻沒有被刪除,當過期key沒有靠定期刪除機制刪除時,就停留在記憶體中,除非系統去查看那些key,才會被redis刪除。這就是惰性刪除。
-
解決策略:僅僅通過設置過期時間還不夠,還需要記憶體淘汰策略。關於記憶體淘汰機制,請繼續往下看。
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:禁止驅逐數據。就是不允許刪除數據,沒人使用這個。
redis持久化機制
-
為什麼要有持久化機制?
-
多數是為了“數據重用”,比如我們重啟機制、機制故障之後進行恢複數據。
-
-
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會放慢自己的速度以使用磁碟的最大寫入速度。
-
2019-07-12
There's no losing only learning
There's no falture only opportunities
There's no problem only solutions