erlang学习:mnesia数据库与ets表1

news/2024/9/19 18:12:42 标签: 数据库, erlang, 学习

Mnesia 和 ETS 都是 Erlang 提供的表管理工具,用于存储和检索数据,但它们之间有一些重要的区别和共同点。

共同点

都是Erlang提供的表存储机制:ETS 和 Mnesia 都允许你在内存中创建表,并且可以用来存储键值对或者更复杂的数据结构。
支持模式匹配:两者都支持 Erlang 的模式匹配特性,使得你可以通过模式来查找表中的元素。
提供了API:都有相应的 API 可以用来插入、删除、查找数据。

区别

事务支持:Mnesia 支持事务,而 ETS 不支持。这意味着在 Mnesia 中,你可以执行一系列的操作作为一个整体,要么全部成功,要么全部失败。
分布式支持:Mnesia 是一个分布式数据库系统,可以在多个节点上复制数据,而 ETS 只存在于单个节点上。
持久化选项:Mnesia 提供了持久化存储的选择,如 disc_copies 或 disc_only_copies,而 ETS 数据默认只存在于内存中,进程退出后数据就会丢失。
性能:对于简单的键值查询,ETS 性能优于 Mnesia。这是因为 ETS 的开销较低,而 Mnesia 由于其分布式特性和事务支持,会有更多的开销。
应用场景:Mnesia 更适合于需要分布式存储和事务支持的应用场景,而 ETS 则更适合于简单的、不需要持久化的数据存储需求。
并发控制:Mnesia 在锁机制和并发控制方面比 ETS 更加完善,特别是在分布式环境中

下面是测试代码,将存储在mnesia数据库中的数据读取进ets中

erlang">-module(test_mnesia).
-include_lib("stdlib/include/qlc.hrl").

-record(goods, {name, money, num}).
%% API
-export([create_ets/0,check/1,test/1,insert/3, select/0, select/1, delete/1,start/0, do_this_once/0]).
start() ->
  mnesia:start().

%%mnesia增删查实现,替换这一块还没具体研究,好像可以替换某个键相同的记录
insert(Name, Money, Num) ->
  Row = #goods{name = Name, money = Money, num = Num},
  io:format("insert ~p~n", [Row]),
  F = fun() ->
    mnesia:write(Row)
      end,
  mnesia:transaction(F).

delete(Item) ->
  Oid = {shop, Item},
  io:format("delete ~p~n", [Oid]),
  F = fun() ->
    mnesia:delete(Oid)
      end,
  mnesia:transaction(F).

select() ->
  do(qlc:q([X || X <- mnesia:table(goods)])).
select(Num) ->
  do(qlc:q([X || X <- mnesia:table(goods), X#goods.num =< Num])).

do(Q) ->
  F = fun
        () ->
          qlc:e(Q)
      end,
  {atomic, Val} = mnesia:transaction(F),
  Val.

create_ets() ->   %%创建ets表
  ets:new(ets_goods,[named_table, public]).
test(TableId) ->
  List = select(),    %%找出数据库中的数据
  Fun = fun
          (Record) ->
            ets:insert(TableId, Record)
        end,
  lists:foreach(Fun,List).   %%遍历存放进ets表中
check(TableId) ->     %%查看ets中存储数据
  ets:tab2list(TableId).

do_this_once() ->
  mnesia:create_schema([node()]),
  mnesia:start(),
  mnesia:create_table(goods, [{attributes, record_info(fields, goods)}]),
  mnesia:stop().

以下是测试截图请添加图片描述

我插入了两个数据,但是ets中只装了一个,暂时不清楚是什么bug


http://www.niftyadmin.cn/n/5665932.html

相关文章

Vue2项目升级攻略:如何更新package.json中的依赖

随着前端技术的不断发展&#xff0c;许多优秀的库和框架都在不断更新。Vue2作为国内广泛使用的前端框架&#xff0c;其项目中的依赖也需要定期更新&#xff0c;以确保项目的稳定性和安全性。本文将详细介绍如何在Vue2项目中更新package.json中的依赖。 一、了解package.json 在…

如何在 CentOS 上安装和使用 Neofetch(图文教程)

Neofetch 是一个用来在命令行界面显示系统信息的工具。它可以展示操作系统、内核版本、CPU、内存、桌面环境、主题、图标、终端等信息&#xff0c;并配合 ASCII 艺术图来美化输出。 一、安装步骤 1、添加yum源 curl -o /etc/yum.repos.d/konimex-neofetch-epel-7.repo https:/…

【PLW004】基于Python网络爬虫与推荐算法的新闻推荐平台v1.0(Python+Django+NLP+Vue+MySQL前后端分离)

基于Python网络爬虫与推荐算法的新闻推荐平台。 网络爬虫&#xff1a;通过Python实现新浪新闻的爬取&#xff0c;可爬取新闻页面上的标题、文本、图片、视频链接&#xff08;保留排版&#xff09; 推荐算法&#xff1a;权重衰减标签推荐区域推荐热点推荐融合推荐算法。 文章目录…

在RabbitMQ中四种常见的消息路由模式

1. Fanout模式 Fanout模式的交换机是扇出交换机&#xff08;Fanout Exchange&#xff09;&#xff0c;它会将消息广播给所有绑定到它的队列&#xff0c;而不考虑消息的内容或路由键。 工作原理&#xff1a; 生产者发送消息到Fanout Exchange。Fanout Exchange会将消息广播给…

CSS clip-path 属性的使用

今天记录一个css属性clip-path&#xff0c;首先介绍下这个属性。 clip-path 是CSS中的一个神奇属性&#xff0c;它能够让你像魔术师一样&#xff0c;对网页元素施展“裁剪魔法”——只展示元素的一部分&#xff0c;隐藏其余部分。想象一下&#xff0c;不用依赖图片编辑软件&am…

力扣最热一百题——缺失的第一个正数

目录 题目链接&#xff1a;41. 缺失的第一个正数 - 力扣&#xff08;LeetCode&#xff09; 题目描述 示例 提示&#xff1a; 解法一&#xff1a;标记数组法 1. 将非正数和超出范围的数替换 2. 使用数组下标标记存在的数字 3. 找到第一个未标记的位置 4. 为什么时间复杂…

【C++ | tips】const Date* operator() const中这两个const有什么区别?他们的作用是什么?

const Date* operator&() const { return this; } 我们要明白operator&()这个函数是做什么的。 在C中&#xff0c;&操作符通常用于获取一个对象的地址。但是&#xff0c;有时候我们想要自定义这个行为&#xff0c;比如说&#xff0c;我们想要控制别人怎么获取…

【计算机毕业设计】医院电子病历

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;医院电子病历管理系统当然也不能排除在外。医院电子病历管理系统是以实际运用为开发背景&#xff0c;运用软件工程开发方…