ORM
ORM(Object Relational Mapping):對象與關系數據之間的映射
映射關系表:
類(class)—— 數據庫的表(table)
對象(object)——記錄(record 行數據)
對象的屬性(attribute)—— 字段(field)
主流技術:Hibernate ; MyBatis;Entity FrameWork
數據庫讀寫分離化
主從數據庫結構
特點:一般一主多從,也可以多主多從;主庫做寫的操作,從庫做讀的操作
主從復制操作:
- 主庫更新數據完成前,將操作寫binlog日志文件
- 從庫打開I/O線程與主庫連接,做binlog dump process(從日志中讀取主庫的操作),并將事件寫入中繼日志
- 從庫執行中繼日志事件,保持與主庫一致
緩存技術
用緩存緩解讀庫的壓力,將數據暫存在緩存中,減少對硬盤的直接操作
緩存與數據庫的協作
數據讀取:
- 根據key從緩存讀取
- 若緩存中沒有,則根據key在數據庫中查找
- 讀取到“值”之后,更新緩存
數據寫入:
- 根據key值寫入數據庫
- 根據key更新緩存?
常見的緩存技術
MemCache
簡單的key/value結構,不支持數據容災,不支持事務管理,結構簡單,功能較少
Redis
Redis集群切片:
- 客戶端切片,在客戶端通過key的hash值對應到不同的redis服務器
- 中間件實現切片:在應用軟件和redis中間實現服務器到后臺redis節點的切片
- 客戶端服務器協作切片:兩者結合,服務器為客戶端提供slot(插槽)(一個服務器可能對應多個slot),再由客戶端的hash算法選擇相應的插槽。?
數據分片方案:
- 范圍分片:根據某個關鍵字的取值范圍將數據分片
- Hash分片:根據某個關鍵字的Hash值將數據分片,能夠較為均勻地分片
- 一致性Hash分片: 將服務器的編號也進行Hash計算,再根據某個關鍵字的Hash值與服務器的Hash值進行比較,將數據存在Hash值距離較近的服務器上。(緩解了新增服務器后,數據遷移的問題)
分布式存儲方案:
- 主從模式:一主多從(主負責寫,從負責讀),主服務器故障時手動切換?
- 哨兵模式:在主從模式的基礎上增加哨兵的監督,哨兵負責監督服務器運行狀態,如果主服務器故障,哨兵可以自行選擇切換主服務器。
- 集群模式:分節點對等集群,根據Web服務器的slot插槽來分配數據庫的節點。
Redis數據類型:
- String:最大512MB,用于緩存,計數。共享Session
- Hash (字典):一個Key對應一組數據,用于存儲、讀取、修改用戶屬性
- List:雙向鏈表,增刪快,查詢慢,用于消息隊列,文章列表
- Set(集合):鍵值對無序,唯一,增刪查復雜度為O(1),用于獨立IP,標簽
- Sorted Set(有序集合):鍵值對有序,唯一,自帶按權重排序的效果,用于排行榜
數據淘汰機制:
- 不淘汰:禁止驅逐數據,填滿了就報警,是系統默認的淘汰策略,常用機制:noeviction
- 根據過期時間淘汰:常用機制:volatile - random(隨機移除某個過期的key),volatile - lru(優先移除最近未使用的過期的key),volatile-ttl(ttl值(ttl值標識過期時間,值最小表示過期最久)最小的key優先移除)?
- 全鍵空間 :常用機制:allkey - random(隨機移除某個key) ,allkey -lru(優先移除最近未使用的key)
Redis的持久化(數據恢復):
- RDB:傳統數據庫中快照的思想。指定時間間隔將數據進行備份
- AOF:傳統數據庫中的日志思想,把每條改變數據集的命令追加到AOF文件的末尾,數據丟失時,可以根據AOF文件中的命令重建數據庫
?常見問題:
- 緩存雪崩:短時間內大量緩存數據失效,客戶端的大量請求直接發送到數據庫,導致數據庫崩潰,可以通過加鎖或隊列、設置不同的緩存失效時間、添加二級緩存等方法避免
- 緩存穿透:緩存沒有存儲服務器需要的數據或查詢數據為空,服務器有大量直接訪問數據庫的請求。可以通過為空數據設置默認值;設置過濾器等方法緩解
- 緩存預熱:系統上線后,需要將相關需要緩存數據直接加到緩存系統中,避免需要第二次訪問某些數據時才將數據加入緩存的效率低下的問題
- 緩存更新:緩存中的過期數據沒有及時更新,可以通過定期更新;根據查詢語句判斷是否過期等方式避免