Chi*_*ang 5 erlang mnesia limit
我使用mnesia为用户存储数据,记录是一个结构像的包
{ username, field1, filed2, timestamp }
Run Code Online (Sandbox Code Playgroud)
为了不让数据库爆炸,我想对属于某个用户的记录数设置一个限制,比如说,如果一个用户的记录数达到500,那么在a之前删除时间戳最旧的记录插入新记录。
有没有一种有效的方法来做到这一点?
提前致谢。
我提供了两种可能性。一种适合您的设计,另一种对您的记录定义进行微小的更改。查看哪一款最适合您的需求。下面的第一个在您的设计中工作。
-记录(用户,{用户名,字段1,字段2,时间戳})。
%% 在 mnesia 事务中执行以下函数
insert(#user{用户名 = U,时间戳 = _T} = 用户)->
案例 mnesia:read({user,U}) of
[] -> mnesia:write(用户);
全部在这里->
案例长度(AllHere) == 500 of
false -> %% 还没有 500
mnesia:写(用户);
正确->
%%值已达到500
%% 获取所有时间戳并获取
%% 最旧的记录并将其删除
%%
旧记录 = get_oldest_stamp(AllHere),
ok = mnesia:delete_object(记录),
mnesia:写(用户)
结尾
结尾。
get_oldest_stamp(用户记录)->
%% 在这里进行排序
%% 并返回记录
%% 最旧的时间戳
....
旧记录。
交易内的功能length/1并不是最优的。让我们想一个更好的办法。另外,我不知道你的时间戳是什么样子,所以我确信你有办法对它们进行排序并找出最新的时间戳,选出拥有该时间戳的记录,然后返回它。我给出这个解决方案只是为了适合您的设计。我也认为有些地方我们需要一些indexing。下一个实施对我来说似乎更好。如果我们可以更改记录定义并引入一个oldest采用 a 的字段bool()并像这样对其进行索引,会怎么样
-记录(用户,{
用户名,
字段1,
字段2,
时间戳,
最旧的 %% bool(),已索引
})。
insert_user(用户名,字段1,字段2)->
用户=#用户{
用户名 = 用户名,
字段 1 = 字段 1,
字段2 = 字段2,
时间戳 = {日期(),时间()}
}。
插入(用户)。
%% 在 mnesia 事务中执行此操作
插入(#user{用户名= U} =用户)->
案例 mnesia:read({user,U}) of
[] -> mnesia:write(User#user{oldest = true});
全部在这里->
案例长度(AllHere) == 500 of
假->
%% 取消设置所有现有记录的最旧字段
%% 为假
F = 乐趣(用户X)->
确定 = mnesia:delete_object(UserX),
确定 = mnesia:write(UserX#user{oldest = false})
结尾,
[F(XX) || XX <- 所有这里],
确定 = mnesia:write(User#user{oldest = true});
正确->
[OldestRec] = mnesia:index_read(用户,true,oldest),
ok = mnesia:delete_object(OldestRec),
确定 = mnesia:write(User#user{oldest = true})
结尾
结尾。
上面的实现对我来说似乎更好。成功 !!