使用關係型數據庫做爲Redis落地的思路

Redis的持久化方式主要有2種:RDB和AOF,但各有不足,同時Redis沒有SQL支持,Redis自己提供的命令不足以實現大多數SQL查詢需求,對後期運營的分析需求支撐不足。此外,對於遊戲來講,活躍玩家只佔總玩家的不多一部分,因此冷熱數據分離也頗有必要。所以我以爲Redis最好的持久化方案是備份到MySql之類的關係型數據庫中,Redis自己只做爲一個內存緩存系統使用。數據庫

  • 啓動過程:從數據庫裏面把修改時間在過時時間內的記錄(熱數據)所有讀取寫入到Redis中,並設置過時時間。
  • 讀取過程:先讀Redis,若是存在,則直接返回並更新過時時間(若是不存在過時時間則不更新),不然再去讀數據庫,讀取結果寫入到Redis中。若是數據庫中不存在,則也用記錄的key在Redis作一個不存在的標記,以免以後再次查詢還須要去讀數據庫,拖慢速度。
  • 寫入過程:直接寫入Redis(同時去掉過時時間),同時把key以當前時間爲score寫入一個特定的sorted set(dirtylist)中。
  • 持久化過程:持久化程序跟隨系統啓動,每隔一段時間獲取Redis的dirtylist中是否有元素,若是有元素則pop出來,經過key獲取記錄寫入數據庫,再把Redis中的key設置過時時間。

風險:緩存

  • 額外多了關係型數據庫這一個單點。若是數據庫發生了故障,則短期內沒法讀取冷數據,讀取熱數據和寫入都沒有問題。只要監控到位,反應及時,風險影響不大。
  • 數據丟失的風險。若是Redis發生了故障,則會丟失寫入到Redis但還未持久化的記錄(dirtylist裏面的記錄)。這一點沒法避免,但單從遊戲的角度來講,只要保證以事務爲單位的持久化(好比說dirtylist同一時間的key,做爲一個事務寫入到數據庫),出現問題能夠經過短期的回擋+補償解決問題。

這裏只是記錄下一個思路,具體的問題和解決方案,等具體實踐了以後,再來補充。遊戲

相關文章
相關標籤/搜索