《Erlang/OTP併發編程實戰》第九章 用 Mnesia 爲 cache 增加分佈式支持

  1. Mnesia 是一套輕量級的軟實時分佈式數據存儲系統,支持冗餘複製和事務,適合於存儲離散的 Erlang 數據塊,尤其擅長 RAM 中的數據存儲。
  2. Mnesia 適用於冗餘數較低,尺寸較小的數據存儲需求。對於大小適中的(基於磁盤的)持久化數據,或是需要跨進程共享的運行時數據,Mnesia 都是不錯的選擇。
  3. 建立數據庫的步驟:
    1. 初始化 Mnesia
    2. 啓動節點
    3. 建立數據庫模式
    4. 啓動 Mnesia
    5. 建立數據庫表
    6. 向新建的表中錄入數據
    7. 對數據做一些基本查詢
  4. 初始化數據庫:
    1. 啓動節點:
      erl -mnesia dir '"/tmp/mnesia_store"' -name mynode

       

    2. 建立數據庫模式:
      所謂數據庫模式就是一些描述信息,其中記錄着當時數據庫中存有哪些表,表的詳細情況又如何。
      要想在多個節點上建立分佈式數據庫,就必須在所有節點上存放一份該模式的副本,以便讓節點了解自己所存的數據的一般結構。
      mnesia:create_schema([node()]).    % 在本地節點建立空數據庫模式

      如果執行失敗,有可能是因爲當前節點無法與列表中的某個節點建立通信,也可能是某個節點上已經有 Mnesia 在運行,或者其中某個節點上殘留有舊的數據庫模式(可以調用 mnesia:delete_schema(Nodes) 來清理舊有模式)。

    3. 啓動 Mnesia

      mnesia:start().
      mnesia:info().    % 查看數據庫信息
    4. 建表:
      mnesia:create_table(Name, Options).
      
      -record(user, {id, name}).
      mnesia:create_table(user, [{attributes, record_info(fields, user)}, {type, bag}]).
      
      mnesia:write(#user{id=Id, name=Name}).
      mnasia:read(user, Id).
      mnesia:transaction(Fun).
      mnesia:dirty_write(#user{id=Id, name=Name}).
      
      
      %% record_info/2 不是真正意義上的函數,它只在編譯器有效(和記錄語法中的#一樣),在運行期或在 Erlang shell 中無法調用它。
      
      其他的默認選項:
      1、表既可讀也可寫
      2、表僅駐留於 RAM 中
      3、表中存儲的記錄與表同名
      4、表的類型爲 set
      5、加載優先級爲0
      6、local_content 標記被置爲 false
      
      Mnesia 表類型:
      1、set
      2、ordered_set
      3、bag
      
      Mnesia 存儲類型:
      1、ram_copies
      2、disc_copies
      3、disc_only_copies    % 不支持ordered_set
      
      不同節點上的表可以有不同的存儲類型,甚至支持運行時修改。

      Options 是一張 {Name, Value} 選項列表,在所有選項之中,最重要的一個是 attributes,該選項用於指定表中所存記錄的字段名。
      如果沒有它,Mnesia 會假定記錄中僅有兩個字段,分別爲 key 和 val。
      表的主鍵永遠都是記錄的第一個字段。

  5. 查詢:

    mnesia:select(user, [{#user{id='$1', name=zh}, [], ['$1']}]).
    
    {Head, Condition, Results}
    Condition 羅列作用於該匹配條件上的額外約束條件
    Result 描述要從匹配到的每條記錄中生成什麼樣的結果項式
    
    '_'    僅限於在 Head 部分使用,無所謂,任意值都可以
    '$_'   僅限於在 Result 和 Condition 中使用,與查詢條件相匹配的整條記錄
    '$$'   僅限於在 Result 和 Condition 中使用,等價於依此羅列出在 Head 部分匹配的所有變量

     

  6. 查詢列表速構(QLC):
    -include_lib("stdlib/include/qlc.hrl").
    
    Table = mnesia:table(user),
    QueryHandle = qlc:q([U#user.id || U <- Table, U#user.name =:= zh]),
    qlc:eval(QueryHandle).

    QLC 是一套通用查詢接口,適用於 ETS 表、Mnesia 表等各種具有表的特徵的東西。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章