《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 表等各种具有表的特征的东西。

发布了42 篇原创文章 · 获赞 2 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/sanmao123456_/article/details/103489083