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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值