erlang:练习-使用dets

(1) 扩展adapter_db1里的适配器,使调用adapter_db1:new(persistent)能创建一个持久性数据存储的元组模块。
在这里插入图片描述

使用 ets:new/2 函数创建一个具有特定选项的新ETS表:

  • named_table:表示这是一个命名表。
  • public:表示任何进程都可以访问此表。
  • {keypos, 1}:指定键的位置在每个项的第一个位置。
    使用dets把数据存储到磁盘文件中,设置自动保存时间为5秒。
    dets保存数据到文件:
  • 可以通过调用 dets:sync/1 函数来手动触发保存操作,将表的当前状态写入磁盘。
  • 当调用 dets:close/1 函数关闭 dets 表时,表的内容会被写入磁盘,以确保数据的持久化。
  • 如果创建 dets 表时设置了 {auto_save, N} 选项,那么表会在每隔 N 毫秒自动保存一次。这个选项确保了数据在指定的时间间隔内写入磁盘,而不需要手动干预。
    持久化ETS表的数据存储在磁盘上,并且在Erlang节点重启后仍然可用。
-module(adapter_db2).
-export([new/1, store/3, lookup/2, close/1]).
new(dict) ->
	{?MODULE, dict, dict:new()};
new(lists) ->
	{?MODULE, list, []};
new(persistent) ->
	case dets:open_file(data_db, [named_table, {keypos, 1}, {auto_save, 5000}]) of
		Tab ->
			{?MODULE, persistent, Tab}
	end.
store(Key, Val, {?MODULE, dict, D}) ->
	D1 = dict:store(Key, Val, D),
	{?MODULE, dict, D1};
store(Key, Val, {?MODULE, list, L}) ->
	L1 = lists:keystore(Key, 1, L, {Key, Val}),
	{?MODULE, list, L1};
store(Key, Val, {?MODULE, persistent, Tab}) ->
	dets:insert(Tab, {Key, Val}),
	{?MODULE, persistent, Tab}.

lookup(Key, {?MODULE, dict, D}) ->
	dict:find(Key, D);
lookup(Key, {?MODULE, list, L}) ->
	case lists:keysearch(Key, 1, L) of
		{value, {Key, Val}} ->
			{ok, Val};
		false ->
			error
	end;
lookup(Key, {?MODULE, persistent, Tab}) ->
	case dets:lookup(Tab, Key) of
		[{Key, Val}] ->
			{ok, Val};
		[] ->
			error
	end.

% 用于关闭 dets 表
close({?MODULE, persistent, Tab}) ->
	dets:close(Tab).
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值