ETS与DETS区别

前言

前面学习了ETS表与DETS表,也知道了他们的区别,但都过于干巴巴,现在我们来演示一下

演示区别

采用gen_sever进行演示

tab.erl

-author("01").

-module(tab).
-behaviour(gen_server).
%%%=======================EXPORT=======================
-export([start/0, start_link/0, stop/1, get/2, put/3, get_dets/2]).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
%%%=======================INCLUDE======================
%%%=======================RECORD=======================
%%%=======================DEFINE=======================
-define(TAB_NAME, my_table).
-define(DATA_FILE, data_store).
%%%=======================TYPE=========================
%%%=================EXPORTED FUNCTIONS=================
start() ->
  gen_server:start(?MODULE, [], []).

start_link() ->
  gen_server:start_link(?MODULE, [], []).

%% ----------------------------------------------------
%% Description: 获取dets表 中key的值[{key,value}]
%% ----------------------------------------------------
get_dets(Pid, Key) ->
  gen_server:call(Pid, {get_dets, Key}).
%% ----------------------------------------------------
%% Description: 获取ets表 中key的值
%% ----------------------------------------------------
get(Pid, Key) ->
  gen_server:call(Pid, {get, Key}).
%% ----------------------------------------------------
%% Description: 向dets和ets中分别存入值
%% ----------------------------------------------------
put(Pid, Key, Value) ->
  gen_server:call(Pid, {put, Key, Value}).

stop(Pid) ->
  gen_server:call(Pid, stop).

init([]) ->
  {ok, Dets} = dets:open_file(?DATA_FILE, [{type, set}, {repair, true}]), %%创建或打开dets表
  Tab = ets:new(?TAB_NAME, [set, named_table]), %%创建dets表
  {ok, {Dets, Tab}}.

handle_call({get, Key}, _From, Data) ->
  {reply, ets:lookup(?TAB_NAME, Key), Data};

handle_call({put, Key, Value}, _From, Data) ->
  case ets:insert_new(?TAB_NAME, {Key, Value}) of
    true ->
      dets:insert_new(?DATA_FILE, {Key, Value}),
      {reply, insert_ok, Data};
    false ->
      {reply, insert_fail, Data}
  end;
handle_call({get_dets, Key}, _From, Data) ->
  {reply, dets:lookup(?DATA_FILE, Key), Data};
handle_call(stop, _From, Data) ->
  {stop, normal, ok, Data}.

handle_cast(_Msg, State) ->
  {noreply, State}.

handle_info(_Info, State) ->
  {noreply, State}.

terminate(_Reason, Data) ->
  dets:close(?DATA_FILE),
  Data.

code_change(_OldVsn, State, _Extra) ->
  {ok, State}.

在这里插入图片描述
可以看见,我们分别向ets表与dets表插入了{a,2}这条数据,但当gen_server服务关闭了,重新打开后获取不到ets表中{a,2}这条数据,但可以获取到dets表中这条数据。

总结

DETS是ETS的磁盘实现版本,它们之间的主要不同在于:

  • DETS中没有ordered_set类型的表;
  • DETS磁盘文件的大小不能超过2 GB;
  • 表的创建和关闭有些变化。创建新的数据库表要调用dets:open_file/2,关闭这个表可以调用dets:close/1。此后,可以调用dets:open_file/1重新打开该表
  • ETS表格内部的操作是原子的,可以保证数据的一致性。对于ETS表格的操作,要么全部成功执行并提交,要么在失败时回滚。DETS表格没有提供像ETS那样的原子性操作。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值