(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).