- Mnesia 是一套輕量級的軟實時分佈式數據存儲系統,支持冗餘複製和事務,適合於存儲離散的 Erlang 數據塊,尤其擅長 RAM 中的數據存儲。
- Mnesia 適用於冗餘數較低,尺寸較小的數據存儲需求。對於大小適中的(基於磁盤的)持久化數據,或是需要跨進程共享的運行時數據,Mnesia 都是不錯的選擇。
- 建立數據庫的步驟:
- 初始化 Mnesia
- 啓動節點
- 建立數據庫模式
- 啓動 Mnesia
- 建立數據庫表
- 向新建的表中錄入數據
- 對數據做一些基本查詢
- 初始化數據庫:
- 啓動節點:
erl -mnesia dir '"/tmp/mnesia_store"' -name mynode
- 建立數據庫模式:
所謂數據庫模式就是一些描述信息,其中記錄着當時數據庫中存有哪些表,表的詳細情況又如何。
要想在多個節點上建立分佈式數據庫,就必須在所有節點上存放一份該模式的副本,以便讓節點了解自己所存的數據的一般結構。mnesia:create_schema([node()]). % 在本地節點建立空數據庫模式
如果執行失敗,有可能是因爲當前節點無法與列表中的某個節點建立通信,也可能是某個節點上已經有 Mnesia 在運行,或者其中某個節點上殘留有舊的數據庫模式(可以調用 mnesia:delete_schema(Nodes) 來清理舊有模式)。
-
啓動 Mnesia
mnesia:start(). mnesia:info(). % 查看數據庫信息
- 建表:
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。
表的主鍵永遠都是記錄的第一個字段。
- 啓動節點:
-
查詢:
mnesia:select(user, [{#user{id='$1', name=zh}, [], ['$1']}]). {Head, Condition, Results} Condition 羅列作用於該匹配條件上的額外約束條件 Result 描述要從匹配到的每條記錄中生成什麼樣的結果項式 '_' 僅限於在 Head 部分使用,無所謂,任意值都可以 '$_' 僅限於在 Result 和 Condition 中使用,與查詢條件相匹配的整條記錄 '$$' 僅限於在 Result 和 Condition 中使用,等價於依此羅列出在 Head 部分匹配的所有變量
- 查詢列表速構(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 表等各種具有表的特徵的東西。
《Erlang/OTP併發編程實戰》第九章 用 Mnesia 爲 cache 增加分佈式支持
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.