Erlang 在记忆法中,限制某个键下记录数量的惯用方法是什么?

Erlang 在记忆法中,限制某个键下记录数量的惯用方法是什么?,erlang,limit,mnesia,Erlang,Limit,Mnesia,我使用mnesia为用户存储数据,记录是一个类似 { username, field1, filed2, timestamp } 为了不让数据库爆炸,我想为属于某个用户的记录数量设置一个限制,比如说,如果某个用户的记录数量达到500条,则在插入新记录之前删除时间戳最早的记录 有没有一种有效的方法可以做到这一点 提前感谢。我提供了两种可能性。一个适合您的设计,一个在您的记录定义中引入一个小的更改。看看哪一个最适合你的需要。下面的第一个在您的设计中起作用 -record(user,{usernam

我使用mnesia为用户存储数据,记录是一个类似

{ username, field1, filed2, timestamp }
为了不让数据库爆炸,我想为属于某个用户的记录数量设置一个限制,比如说,如果某个用户的记录数量达到500条,则在插入新记录之前删除时间戳最早的记录

有没有一种有效的方法可以做到这一点


提前感谢。

我提供了两种可能性。一个适合您的设计,一个在您的记录定义中引入一个小的更改。看看哪一个最适合你的需要。下面的第一个在您的设计中起作用

-record(user,{username,field1,field2,timestamp}). %% execute the function below in a mnesia transaction insert(#user{username = U,timestamp = _T} = User)-> case mnesia:read({user,U}) of [] -> mnesia:write(User); AllHere -> case length(AllHere) == 500 of false -> %% not yet 500 mnesia:write(User); true -> %% value has reached 500 %% get all timestamps and get the %% oldest record and delete it %% OldRecord = get_oldest_stamp(AllHere), ok = mnesia:delete_object(Record), mnesia:write(User) end end. get_oldest_stamp(UserRecords)-> %% here you do your sorting %% and return the record with %% oldest timestamp .... OldRecord.
对我来说,上述实现似乎更好。成功

另一种方法可能是保存您的记录

{username, value_list, timestamp} 
其中value_list包含一个值列表。你的桌子现在可以是一套而不是一个袋子,你可以做这种事情

{NewList,_ignore}=lists:Split(500, [{NewFld1,NewFld2}|Value_list]),
%mnesia:write(Rec#{value_list=NewList}) type of code goes next
无论何时插入。新列表最多包含500个元素,因为最旧的元素位于末尾,如果有501个元素,那么最后一个元素将在_ignore列表中,您将。。。忽略

对于某些列表操作,您可以在键上进行固定时间的查找,但根据您的应用程序,这可能是一个很好的折衷方案。您还可以删除时间戳字段和相关代码来维护该字段。

这种方法非常简单(我在生产中也有类似的方法),但如果记录数量限制很高,则效率会非常低,因为Mnesia必须读取或写入用户的所有数据,对于在该用户上执行的每个操作。
{NewList,_ignore}=lists:Split(500, [{NewFld1,NewFld2}|Value_list]),
%mnesia:write(Rec#{value_list=NewList}) type of code goes next