回覆列表
  • 1 # 使用者4532147702961

    1、首先明確是不是一定要上快取,當前架構的瓶頸在哪裡,若瓶頸真是資料庫操作上,再繼續往下看。

    2、明確memcached和redis的區別,到底要使用哪個。前者終究是個快取,不可能永久儲存資料(LRU機制),支援分散式,後者除了快取的同時也支援把資料持久化到磁碟等,redis要自己去實現分散式快取(貌似最新版本的已整合),自己去實現一致性hash。因為不知道應用場景,不好說一定要用memcache還是redis,說不定用mongodb會更好,比如在儲存日誌方面。

    4、思路是對的,清晰明瞭,讀DB前,先讀快取,如果有直接返回,如果沒有再讀DB,然後寫入快取層並返回。

    5、考慮是否需要主從,讀寫分離,考慮是否分散式部署,考慮是否後續水平伸縮。

    6、想要一勞永逸,後續維護和擴充套件方便,那就將現有的程式碼架構最佳化,按你說的替換資料庫元件需要改動大量程式碼,說明當前架構存在問題。可以利用現有的一些框架,比如SpringMVC,將應用層和業務層和資料庫層解耦。再上快取之前把這些做好。

    7、把讀取快取等操作做成服務元件,對業務層提供服務,業務層對應用層提供服務。

    8、保留原始資料庫元件,最佳化成服務元件,方便後續業務層靈活呼叫快取或者是資料庫。

    9、不建議一次性全量上快取,最開始不動核心業務,可以將邊緣業務先換成快取元件,一步步換至核心業務。

    10、重新整理記憶體,以memcached為例,新增,修改和刪除操作,一般採用lazy load的策略,即新增時只寫入資料庫,並不會馬上更新Memcached,而是等到再次讀取時才會載入到Memcached中,修改和刪除操作也是更新 資料庫,然後將Memcached中的資料標記為失效,等待下次讀取時再載入。

    大方向兩種方案:

    1、指令碼同步:

    自己寫指令碼將資料庫資料寫入到redis/memcached。

    這就涉及到實時資料變更的問題(mysql row binlog的實時分析),binlog增量訂閱Alibaba 的canal ,以及快取層資料 丟失/失效 後的資料同步恢復問題。

    2、業務層實現:

    先讀取nosql快取層,沒有資料再讀取mysql層,並寫入資料到nosql。

    nosql層做好多節點分散式(一致性hash),以及節點失效後替代方案(多層hash尋找相鄰替代節點),和資料震盪恢復了。

  • 中秋節和大豐收的關聯?
  • 官帽核桃怎麼盤玩法?