最實用的 Redis總結,簡單易懂,讓你快速瞭解Redis。
1,redis是什麼
redis是一種支援Key-Value等多種資料結構的儲存系統。可用於快取,事件釋出或訂閱,高速佇列等場景。該資料庫使用ANSI C語言編寫,支援網路,提供字串,雜湊,列表,佇列,集合結構直接存取,基於記憶體,可持久化。
2.redis的應用場景有哪些
1,會話快取(最常用)
2,訊息佇列,比如支付
3,活動排行榜或計數
4,釋出,訂閱訊息(訊息通知)
5,商品列表,評論列表等
6.執行耗時特別久,且結果不頻繁變動的SQL,就特別適合將執行結果放入快取,這樣,後面的請求就去快取中讀取,請求使得能夠迅速響應。
7.在大併發的情況下,所有的請求直接訪問資料庫,資料庫會出現連線異常。這個時候,就需要使用的的Redis的做一個緩衝操作,讓請求先訪問到的Redis的的,而不是直接訪問資料庫。
3. redis常見效能問題和解決方案:
(1) Master最好不要做任何持久化工作,如RDB記憶體快照和AOF日誌檔案
(2) 如果資料比較重要,某個Slave開啟AOF備份資料,策略設定為每秒同步一次
(3) 為了主從複製的速度和連線的穩定性,Master和Slave最好在同一個區域網內
(4) 儘量避免在壓力很大的主庫上增加從庫
(5) 主從複製不要用圖狀結構,用單向連結串列結構更為穩定,即:Master <- Slave1 <- Slave2 <- Slave3…
這樣的結構方便解決單點故障問題,實現Slave對Master的替換。如果Master掛了,可以立刻啟用Slave1做Master,其他不變。
4,redis的持久化
redis持久有兩種方式:快照(快照),僅附加檔案(AOF)
快照(快照)
1,將儲存在記憶體的資料以快照的方式寫入二進位制檔案中,如預設dump.rdb中
2,儲存900 1
#900秒內如果超過1個Key被修改,則啟動快照保
僅附加檔案(AOF)
1,使用AOF持久時,服務會將每個收到的寫命令通過寫函式追加到檔案中(appendonly.aof)
2,AOF持久化儲存方式引數說明
appendonly yes
#開啟AOF持久化儲存方式
appendfsync always
#收到寫命令後就立即寫入磁碟,效率最差,效果最好
appendfsync everysec
#每秒寫入磁碟一次,效率與效果居中
appendfsync no
#完全依賴作業系統,效率最佳,效果沒法保證
Redis優點
1,執行在記憶體,速度快官方號稱支援併發讀11萬次/s,併發寫8萬次/s,可以說是相當彪悍了。
2,資料雖在記憶體,但是提供了持久化的支援,即可以將記憶體中的資料非同步寫入到硬碟中,同時不影響繼續提供服務
3,支援資料結構豐富(string(字串),list(連結串列),set(集合),zset(sorted set - 有序集合))和Hash(雜湊型別,md5加密出來的那個串)
5. redis的缺點
一)快取和資料庫雙寫一致性問題
(二)快取雪崩問題
(三)快取擊穿問題
(四)快取的併發競爭問題
6.單執行緒的redis為什麼這麼快
一)純記憶體操作
(二)單執行緒操作,避免了頻繁的上下文切換
(三)採用了非阻塞I/O多路複用機制
7.redis的回收策略
在redis.conf中有一行配置
# maxmemory-policy volatile-lru
該配置就是配記憶體淘汰策略的(什麼,你沒配過?好好反省一下自己)
1)noeviction:當記憶體不足以容納新寫入資料時,新寫入操作會報錯。應該沒人用吧。
2)allkeys-lru:當記憶體不足以容納新寫入資料時,在鍵空間中,移除最近最少使用的key。推薦使用,目前專案在用這種。
3)allkeys-random:當記憶體不足以容納新寫入資料時,在鍵空間中,隨機移除某個key。應該也沒人用吧,你不刪最少使用Key,去隨機刪。
4)volatile-lru:當記憶體不足以容納新寫入資料時,在設定了過期時間的鍵空間中,移除最近最少使用的key。這種情況一般是把redis既當快取,又做持久化儲存的時候才用。不推薦
5)volatile-random:當記憶體不足以容納新寫入資料時,在設定了過期時間的鍵空間中,隨機移除某個key。依然不推薦
6)volatile-ttl:當記憶體不足以容納新寫入資料時,在設定了過期時間的鍵空間中,有更早過期時間的key優先移除。不推薦
ps:如果沒有設定 expire 的key, 不滿足先決條件(prerequisites); 那麼 volatile-lru, volatile-random 和 volatile-ttl 策略的行為, 和 noeviction(不刪除) 基本上一致。