Redis是一個開源(BSD許可)的內存數據結構存儲,用作資料庫、緩存和消息代理。它支持諸如字元串、散列、列表、集、帶範圍查詢的排序集、點陣圖、hyperloglog、帶半徑查詢和流的地理空間索引等數據結構。
Redis具有內置的複製、Lua腳本、LRU清除、事務和不同級別的磁碟持久性,並通過Redis Sentinel和Redis集羣的自動分區提供高可用性。
為了保證多條命令組合的原子性,Redis提供了簡單的事務功能以及集成Lua腳本來解決這個問題。簡單介紹Redis中事務的使用方法以及它的侷限性。
Redis提供了簡單的事務功能,將一組需要一起執行的命令放到multi和exec兩個命令之間。
Redis提供了基於「發布/訂閱」模式的消息機制,此種模式下,消息發布者和訂閱者不進行直接通信,發布者客戶端向指定的頻道(channel)發布消息,訂閱該頻道的每個客戶端都可以收到該消息。
發布消息
publish channel:sports "Tim won the championship
訂閱消息
subscribe channel:sports
有關訂閱命令有兩點需要注意:
psubscribe、unsubscribe、punsubscribe的四個命令。
Redis發布訂閱與成熟MQ的比較
總之,MQ所提供的功能遠比Redis發布訂閱要複雜,畢竟Redis不是專門做發布訂閱的,但是如果系統中已經有了Redis,並且需要基本的發布訂閱功能,就沒有必要再安裝MQ了,因為可能MQ提供的功能大部分都用不到,而且你可以容忍redis發布訂閱的缺點的話,可以考慮用它。
Redis支持RDB和AOF兩種持久化機制,持久化功能有效地避免因進程退出造成的數據丟失問題,當下次重啟時利用之前持久化的文件即可實現數據恢復。
RDB持久化
RDB持久化是把當前進程數據生成快照保存到硬碟的過程,觸發RDB持久化過程分為手動觸發和自動觸發。
RDB的優缺點
優點:
缺點:
針對RDB不適合實時持久化的問題,Redis提供了AOF持久化方式來解決。
AOF持久化
AOF(append only file)持久化:以獨立日誌的方式記錄每次寫命令,重啟時再重新執行AOF文件中的命令達到恢複數據的目的。
AOF的主要作用是解決了數據持久化的實時性,目前已經是Redis持久化的主流方式。
開啟AOF,通過修改redis.conf配置文件
appendonly yes ##默認不開啟。
AOF文件名通過appendfilename配置設置,默認文件名appendonly.aof。保存路徑同RDB持久化方式一致,通過dir配置指定。
AOF的工作流程如下圖:
溫馨提示
場景:AOF文件可能存在結尾不完整的情況,比如機器突然掉電導致AOF尾部文件命令寫入不全。
解決方法:
# !!! Warning: short read while loading the AOF file !!! # !!! Truncating the AOF at offset 397856725 !!! # AOF loaded anyway because aof-load-truncated is enabled
Redis持久化功能一直是影響Redis性能的高發地。主要有以下方面
1. fork操作
起因:對於高流量的Redis實例OPS可達5萬以上,如果fork操作耗時在秒級別將拖慢Redis幾萬條命令執行,對線上應用延遲影響非常明顯。正常情況下fork耗時應該是每GB消耗20毫秒左右。可以在info stats統計中查latest_fork_usec指標獲取最近一次fork操作耗時,單位微秒。
優化:
CPU
內存
內存消耗優化:
硬碟
優化方法如下:
註:配置no-appendfsync-on-rewrite=yes時,在極端情況下可能丟失整個AOF重寫期間的數據,需要根據數據安全性決定是否配置。
AOF追加阻塞
當開啟AOF持久化時,常用的同步硬碟的策略是everysec,用於平衡性能和數據安全性。對於這種方式,Redis使用另一條線程每秒執行fsync同步硬碟。當系統硬碟資源繁忙時,會造成Redis主線程阻塞,
阻塞流程分析:
我整理了一些互聯網公司java程序員在面試中涉及到的絕大部分架構面試題及答案做成了文檔和架構視頻資料免費分享給大家(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分散式、高並發等架構技術資料)也可以關注獲得更多的面試資料,節省大家收集的時間!
獲取資料的方式:轉發+私信【資料】領取!