- 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 增加分布式支持
最新推荐文章于 2021-10-11 20:32:22 发布