rebar3 服务器
This commit is contained in:
@@ -0,0 +1,204 @@
|
||||
-ifndef(__MS_CACHE_HRL__).
|
||||
-define(__MS_CACHE_HRL__, true).
|
||||
|
||||
-include("base.hrl").
|
||||
|
||||
-define(MS_CACHE, ms_cache).
|
||||
|
||||
-define(WORKER_COUNTER_DEFAULT, 8).
|
||||
-define(WORKER_INIT_TIME_MIN, 100).
|
||||
|
||||
%% 需要更新的数据超过指定数量,立即触发存盘,默认只为1000
|
||||
-define(SYNC_NUM, ms_cache_config:get_env(db_save_count, 1000)).
|
||||
|
||||
%% 缓存保存到数据库时间,默认10分钟保存一次
|
||||
-define(DB_SAVE_TIME, ms_cache_config:get_env(db_save_time, 600000)).
|
||||
|
||||
%% 安全模式(待修改的数据有备份到dets或其他落地数据库)
|
||||
-define(SAFE_MODE, ms_cache_config:get_env(safe_mode, false)).
|
||||
|
||||
%% 错误信息
|
||||
-define(ERR_MSG(Tab, Key, Reason), ms_cache_util:get_error_message(Tab, Key, Reason)).
|
||||
|
||||
%% 根据类型获取缓存表名
|
||||
-define(TABLE_NAME(Tab, Type), (ms_cache_util:get_table_name(Tab, Type))).
|
||||
-define(TABLE_NAME(Tab, Type, WorkNum), (ms_cache_util:get_table_name(Tab, Type, WorkNum))).
|
||||
|
||||
%% 获取缓存数据节点
|
||||
-define(DATA_NODE, (ms_cache_util:get_data_node())).
|
||||
|
||||
%% 获取缓存表处理的模块
|
||||
%%-define(TABLE_HANDLER(Tab), (list_to_atom(lists:concat([Tab, "_c"])))).
|
||||
-define(TABLE_HANDLER(Tab), (ms_cache_config:get({?MS_CACHE, handler, Tab}))).
|
||||
-define(SET_TABLE_HANDLER(Tab, Handler), (ms_cache_config:put({?MS_CACHE, handler, Tab}, Handler))).
|
||||
|
||||
%% 缓存数据转换为record形式
|
||||
-define(TO_REC(Data), (ms_cache_util:map_to_record(Data))).
|
||||
|
||||
%% 缓存数据转换为map形式
|
||||
-define(TO_MAP(Data), (ms_cache_util:record_to_map(Data))).
|
||||
|
||||
%% 缓存数据格式转换
|
||||
-define(FMT_DATA(Data), (ms_cache_util:format_data(Data))).
|
||||
|
||||
%% 单次清理缓存数据的数量
|
||||
-define(CACHE_REMOVE_LIMIT, 1000).
|
||||
|
||||
%% 获取数据库连接池名
|
||||
-define(SELECT_POOL, ms_cache_config:get_env(db_select_pool_name, undefined)).
|
||||
-define(UPDATE_POOL, ms_cache_config:get_env(db_update_pool_name, undefined)).
|
||||
|
||||
%% 读写模式 concurrency | serial
|
||||
-define(CONCURRENCY, concurrency).
|
||||
-define(SERIAL, serial).
|
||||
-define(RW_MODE, ms_cache_config:get_env(rw_mode, ?CONCURRENCY)).
|
||||
|
||||
%% 数据同步模式 data | key todo key模式当前有bug,关服时缓存data表先被删除,导致同步进程查询的时候报错
|
||||
-define(DATA_SYNC_MODE_DATA, data). %% 同步变化的整个数据 record | map
|
||||
-define(DATA_SYNC_MODE_KEY, key). %% 只同步变化的key
|
||||
-define(DATA_SYNC_MODE, ms_cache_config:get_env(data_sync_mode, ?DATA_SYNC_MODE_DATA)).
|
||||
|
||||
%% 获取表的handler名称
|
||||
-define(TABLE_HANDLER_NAME(Table), list_to_atom(lists:concat([Table, "_c"]))).
|
||||
|
||||
-define(MS_CACHE_DB_DROP_AUTH, ms_cache_config:get_env(db_drop_auth, ?FALSE)).
|
||||
|
||||
-define(OPT_TABLE_MAX, 10).
|
||||
-define(OPT_TABLE_LIST(Table), [erlang:list_to_atom(erlang:atom_to_list(?TABLE_NAME(Table, opt)) ++ "_" ++ erlang:integer_to_list(Num)) || Num<-lists:seq(1, ?OPT_TABLE_MAX)]).
|
||||
|
||||
|
||||
%% 缓存使用的内存表.
|
||||
%% ms_cache_mdb : mnesia作为缓存表
|
||||
%% ms_cache_edb : ets set数据表 + ets ordered_set索引表 (仿mnesia写法,mnesia简化版,综合性能最好)
|
||||
%% ms_cache_edb2 : ets set数据表 + ets bag索引表 (插入和删除性能较差)
|
||||
%% ms_cache_edb3 : ets set数据表 + ets set索引表 (大数据性能差,别用,只用来测试对比)
|
||||
-define(MS_CACHE_DB_MOD, (ms_cache_util:get_cache_db_mod())).
|
||||
|
||||
%% 数据库操作标志
|
||||
-record(ms_cache_opt, {
|
||||
key = 0,
|
||||
opt = none, %% insert | update | delete
|
||||
opt_rec = none
|
||||
}).
|
||||
|
||||
%% 复合主键的数据,以第一个key作为索引的所有key列表
|
||||
-record(ms_cache_idx, {
|
||||
key = 0,
|
||||
val = []
|
||||
}).
|
||||
|
||||
%% 数据加载标志
|
||||
-record(ms_cache_load, {
|
||||
key = 0,
|
||||
val = none %%{Key, none} - 无Key对应数据 | {Index, index_loaded} - 复合主键以第一个key为所以的数据已加载 | {Table, table_loaded} - 整表数据已加载
|
||||
}).
|
||||
|
||||
-record(ms_cache_expired, {
|
||||
key = 0, %% 缓存清理key | 缓存清理index(复合主键)
|
||||
val = none
|
||||
}).
|
||||
|
||||
|
||||
|
||||
|
||||
%% atom define
|
||||
-ifndef(OK).
|
||||
-define(OK, ok).
|
||||
-endif.
|
||||
-ifndef(TRUE).
|
||||
-define(TRUE, true).
|
||||
-endif.
|
||||
-ifndef(FALSE).
|
||||
-define(FALSE, false).
|
||||
-endif.
|
||||
-ifndef(UNDEFINED).
|
||||
-define(UNDEFINED, undefined).
|
||||
-endif.
|
||||
-ifndef(INDEFINITELY).
|
||||
-define(INDEFINITELY, indefinitely).
|
||||
-endif.
|
||||
-ifndef(CONTINUE).
|
||||
-define(CONTINUE, continue).
|
||||
-endif.
|
||||
-ifndef(IGNORE).
|
||||
-define(IGNORE, ignore).
|
||||
-endif.
|
||||
-ifndef(INFINITY).
|
||||
-define(INFINITY, infinity).
|
||||
-endif.
|
||||
-ifndef(ERROR).
|
||||
-define(ERROR, error).
|
||||
-endif.
|
||||
-ifndef(NONE).
|
||||
-define(NONE, none).
|
||||
-endif.
|
||||
-ifndef(STOP).
|
||||
-define(STOP, stop).
|
||||
-endif.
|
||||
-ifndef(SKIP).
|
||||
-define(SKIP, skip).
|
||||
-endif.
|
||||
|
||||
%% 封装处理handle_continue
|
||||
-define(TRY_CONTINUE(Msg, State),
|
||||
try
|
||||
do_continue(Msg, State)
|
||||
catch _:ErrMsgDoNotRepeatName:Trace ->
|
||||
?ERROR(?MODULE, "handle continue: Msg = ~p, ErrMsg = ~p, Trace = ~p", [Msg, ErrMsgDoNotRepeatName, Trace]),
|
||||
{noreply, State}
|
||||
end
|
||||
).
|
||||
%% 封装处理handle_call
|
||||
-define(TRY_CALL(Msg, From, State),
|
||||
try
|
||||
do_call(Msg, From, State)
|
||||
catch _:ErrMsgDoNotRepeatName:Trace ->
|
||||
?ERROR(?MODULE, "handle call: Msg = ~p, ErrMsg = ~p, Trace = ~p", [Msg, ErrMsgDoNotRepeatName, Trace]),
|
||||
{reply, ok, State}
|
||||
end
|
||||
).
|
||||
-define(TRY_CALL(Msg, State),
|
||||
try
|
||||
do_call(Msg, State)
|
||||
catch _:ErrMsgDoNotRepeatName:Trace ->
|
||||
?ERROR(?MODULE, "handle call: Msg = ~p, ErrMsg = ~p, Trace = ~p", [Msg, ErrMsgDoNotRepeatName, Trace]),
|
||||
{reply, ok, State}
|
||||
end
|
||||
).
|
||||
%% 封装处理handle_cast
|
||||
-define(TRY_CAST(Msg, State),
|
||||
try
|
||||
do_cast(Msg, State)
|
||||
catch _:ErrMsgDoNotRepeatName:Trace ->
|
||||
?ERROR(?MODULE, "handle cast: Msg = ~p, ErrMsg = ~p, Trace = ~p", [Msg, ErrMsgDoNotRepeatName, Trace]),
|
||||
{noreply, State}
|
||||
end
|
||||
).
|
||||
%% 封装处理handle_info
|
||||
-define(TRY_INFO(Msg, State),
|
||||
try
|
||||
do_info(Msg, State)
|
||||
catch _:ErrMsgDoNotRepeatName:Trace ->
|
||||
?ERROR(?MODULE, "handle info: Msg = ~p, ErrMsg = ~p, Trace = ~p", [Msg, ErrMsgDoNotRepeatName, Trace]),
|
||||
{noreply, State}
|
||||
end
|
||||
).
|
||||
|
||||
|
||||
%%% 打印函数
|
||||
|
||||
%% 进程字典的读取和存储
|
||||
-define(PUT_TO_PROC_DICT(Key, Val), erlang:put({?MODULE, Key}, Val)).
|
||||
-define(GET_FROM_PROC_DICT(Key), erlang:get({?MODULE, Key})).
|
||||
-define(GET_FROM_PROC_DICT(Key, Default),
|
||||
case erlang:get({?MODULE, Key}) of
|
||||
?UNDEFINED ->
|
||||
Default;
|
||||
Val ->
|
||||
Val
|
||||
end ).
|
||||
-define(ERASE_FROM_PROC_DICT(Key), erlang:erase({?MODULE, Key})).
|
||||
|
||||
-type ms_cache_key() :: integer() | atom() | binary().
|
||||
|
||||
-endif.
|
||||
Reference in New Issue
Block a user