数据同步后 删除mnesia缓存数据
功能:数据实时写入缓存,定时同步mnesia缓存数据到DB并删除已同步的缓存数据(不再使用)。方法:1、哥们推荐 缓存如果用redis的话可以利用它的队列实现此功能2、利用热代码替换原理还有个方法,更新程序,把新的log写入新的表里,然后再开始操作老表,用两个表交替进行3、利用dump_tables,就是说,能备份一堆表的数据到磁盘上,当节点再次启动的时候,这些数据就作为这些ramcopis的表的数据被恢复出来,他跟disc_copies的差别就是,这个备份动作是程序指定的,disc_copies是实时的? ? ? ?4、利用?mnesia:dirty_next(tablename,Key),dirty_delete(Key),尾递归(NextKey)5、因为想到用 Key 删除。所以直接用all_keys 方法读取即可。在查询所有记录时用read锁即可保证数据一致性。? ? 实现方式如下:
201 handle_info({writing_db}, State) ->202 ?DEBUG("In ~p on ~p line handle_info function start ~n",[?MODULE, ?LINE]),203 F = fun() ->204 Data = mnesia:match_object(langxwevent, {langxwevent,'_','_', '_', '_','_','_','_'}, read),205 Keys = mnesia:all_keys(langxwevent),206 {Data, Keys}207 end,208 case mnesia:transaction(F) of209 {aborted, Reason} ->210 ?DEBUG("In ~p on ~p line handle_info function Reason=~p ~n",[?MODULE, ?LINE, Reason]);211 {atomic,{[],[]}} -> 212 ?DEBUG("In ~p on ~p line handle_info function [] ~n",[?MODULE, ?LINE]),213 [];214 {atomic,{L,Keys}} ->215 ?DEBUG("In ~p on ~p line handle_info function L= ~p ..~n Kyes=~p..~n",[?MODULE, ?LINE , L, Keys]),216 writing_db(L),217 ?DEBUG("In ~p on ~p line handle_info function delete_data L= ~p ..~n Kyes=~p..~n",[?MODULE, ?LINE , L, Keys]),218 Fun = fun(Key) ->219 ?DEBUG("In ~p on ~p line handle_info function Key= ~p ~n",[?MODULE, ?LINE , Key]),220 mnesia:dirty_delete(langxwevent,Key)221 end,222 ?DEBUG("In ~p on ~p line handle_info function Keys= ~p ~n",[?MODULE, ?LINE , Keys]),223 lists:foreach(Fun, Keys)224 end,225 timer:send_after(5000, self(), {writing_db}), 226 {noreply, State};?