瀏覽代碼

ft: 优化

master
SisMaker 3 年之前
父節點
當前提交
8c6d9db905
共有 8 個檔案被更改,包括 232 行新增30 行删除
  1. +18
    -5
      include/ranks.hrl
  2. +46
    -1
      src/rank/rankMgr.erl
  3. +40
    -1
      src/rank/rankWork.erl
  4. +26
    -0
      src/rank/rankWork_sup.erl
  5. +42
    -0
      src/rank/rsKvsToBeam.erl
  6. +38
    -8
      src/ranks.erl
  7. +3
    -0
      src/ranks_app.erl
  8. +19
    -15
      src/ranks_sup.erl

+ 18
- 5
include/ranks.hrl 查看文件

@ -1,13 +1,26 @@
-ifndef(RANKS_H_).
-define(RANKS_H_, true).
-record(rank_info, {
%%
-define(ranksCfg, ranksCfg).
%%
-define(workCnt, workCnt).
%%
-define(IIF(Cond, Ret1, Ret2), (case Cond of true -> Ret1; _ -> Ret2 end)).
-define(etsRankInfo, etsRankInfo).
%% rankTypeXScore
-record(etsRankRecord, {
key :: integer()
, otherInfo :: term()
, score1 :: term()
, score2 :: term()
, scoreN :: term()
, publicInfo :: term()
, rankType1Score :: term()
, rankType2Score :: term()
, rankTypeNScore :: term()
}).
-define(RankRecordFields, record_info(fields, etsRankRecord)).
-endif.

+ 46
- 1
src/rank/rankMgr.erl 查看文件

@ -2,4 +2,49 @@
-behavior(gen_srv).
-export([]).
-include("ranks.hrl").
-export([
start_link/0
]).
-export([
init/1
, handleCall/3
, handleCast/2
, handleInfo/2
, terminate/2
, code_change/3
]).
-define(SERVER, ?MODULE).
-record(state, {}).
%% ******************************************** API *******************************************************************
start_link() ->
gen_srv:start_link({local, ?SERVER}, ?MODULE, [], []).
%% ******************************************** callback **************************************************************
init(_Args) ->
ets:new(?etsRankInfo, [set, public, named_table, {keypos, #etsRankRecord.key}, {write_concurrency, auto}, {read_concurrency, true}]),
{ok, #state{}}.
handleCall({mInitRank, RankType}, _State, _FROM) ->
ets:new(RankType, [ordered_set, public, named_table, {write_concurrency, auto}, {read_concurrency, true}]),
{reply, ok};
handleCall(_Msg, _State, _FROM) ->
{reply, ok}.
%%
handleCast(_Msg, _State) ->
kpS.
handleInfo(_Msg, _State) ->
kpS.
terminate(_Reason, _State) ->
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
%% ****************************************************** logic ********************************************************

+ 40
- 1
src/rank/rankWork.erl 查看文件

@ -2,4 +2,43 @@
-behavior(gen_srv).
-export([]).
-export([
start_link/1
]).
-export([
init/1
, handleCall/3
, handleCast/2
, handleInfo/2
, terminate/2
, code_change/3
]).
-record(state, {}).
%% ******************************************** API *******************************************************************
start_link(SrvName) ->
gen_srv:start_link({local, SrvName}, ?MODULE, [], []).
%% ******************************************** callback **************************************************************
init(_Args) ->
{ok, #state{}}.
handleCall(_Msg, _State, _FROM) ->
{reply, ok};
handleCall(_Msg, _State, _FROM) ->
{reply, ok}.
handleCast(_Msg, _State) ->
kpS.
handleInfo(_Msg, _State) ->
kpS.
terminate(_Reason, _State) ->
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
%% ****************************************************** logic ********************************************************

+ 26
- 0
src/rank/rankWork_sup.erl 查看文件

@ -0,0 +1,26 @@
-module(rankWork_sup).
-behaviour(supervisor).
-export([start_link/0]).
-export([init/1]).
-define(SERVER, ?MODULE).
start_link() ->
supervisor:start_link({local, ?SERVER}, ?MODULE, []).
init([]) ->
SupFlags = #{strategy => simple_one_for_one, intensity => 100, period => 3600},
ChildSpecs = [
#{
id => rankWork,
start => {rankWork, start_link, []},
restart => permanent,
shutdown => 3000,
type => worker,
modules => [rankWork]
}
],
{ok, {SupFlags, ChildSpecs}}.

+ 42
- 0
src/rank/rsKvsToBeam.erl 查看文件

@ -0,0 +1,42 @@
-module(rsKvsToBeam).
-export([
load/2
]).
%% map类型的数据不能当做key
-type key() :: atom() | binary() | bitstring() | float() | integer() | list() | tuple().
-type value() :: atom() | binary() | bitstring() | float() | integer() | list() | tuple() | map().
-spec load(term(), [{key(), value()}]) -> ok.
load(Module, KVs) ->
Forms = forms(Module, KVs),
{ok, Module, Bin} = compile:forms(Forms),
code:soft_purge(Module),
{module, Module} = code:load_binary(Module, atom_to_list(Module), Bin),
ok.
forms(Module, KVs) ->
%% -module(Module).
Mod = erl_syntax:attribute(erl_syntax:atom(module), [erl_syntax:atom(Module)]),
%% -export([getV/0]).
ExportList = [erl_syntax:arity_qualifier(erl_syntax:atom(getV), erl_syntax:integer(1))],
Export = erl_syntax:attribute(erl_syntax:atom(export), [erl_syntax:list(ExportList)]),
%% getV(K) -> V
Function = erl_syntax:function(erl_syntax:atom(getV), lookup_clauses(KVs, [])),
[erl_syntax:revert(X) || X <- [Mod, Export, Function]].
lookup_clause(Key, Value) ->
Var = erl_syntax:abstract(Key),
Body = erl_syntax:abstract(Value),
erl_syntax:clause([Var], [], [Body]).
lookup_clause_anon() ->
Var = erl_syntax:variable("_"),
Body = erl_syntax:atom(undefined),
erl_syntax:clause([Var], [], [Body]).
lookup_clauses([], Acc) ->
lists:reverse(lists:flatten([lookup_clause_anon() | Acc]));
lookup_clauses([{Key, Value} | T], Acc) ->
lookup_clauses(T, [lookup_clause(Key, Value) | Acc]).

+ 38
- 8
src/ranks.erl 查看文件

@ -1,5 +1,7 @@
-module(ranks).
-include("ranks.hrl").
-export([
start/0
, stop/0
@ -7,7 +9,7 @@
, initRank/1 %%
, updateScore/3 %%
, updateInfo/2 %%
, getRankInfo/3 %%
, getRankInfo/4 %%
]).
start() ->
@ -16,18 +18,46 @@ start() ->
stop() ->
application:stop(ranks).
startWork(Cnt) ->
ok.
workName(Idx) ->
binary_to_atom(<<"$rankWork_", (integer_to_binary(Idx))/binary>>).
fieldIdx([], _Idx, Acc) ->
Acc;
fieldIdx([Field | Fields], Idx, Acc) ->
fieldIdx(Fields, Idx + 1, [{Field, Idx} | Acc]).
-spec startWork(Cnt :: non_neg_integer()) -> ok | {error, term()}.
startWork(Cnt) when Cnt > 0 ->
case ?ranksCfg:getV(?workCnt) of
0 ->
NameList = [{Idx, workName(Idx)} || Idx <- lists:seq(1, Cnt)],
[supervisor:start_child(rankWork_sup, [WorkName]) || {_Idx, WorkName} <- NameList],
CfgList = [{?workCnt, Cnt} | NameList],
Fields = record_info(fields, etsRankRecord),
gtKvsToBeam:load(?ranksCfg, fieldIdx(Fields, 1, CfgList)),
ok;
_Cnt ->
{error, started}
end.
initRank(RankType) ->
ok.
gen_srv:call(rankMgr, {mInitRank, RankType}).
%% key
updateScore(RankType, Key, Score) ->
ok.
WorkName = ?ranksCfg:getV(erlang:phash2(Key, ?ranksCfg:getV(?workCnt)) + 1),
%% key
RankPos = ?ranksCfg:getV(RankType),
gen_srv:cast(WorkName, {mUpdateScore, RankPos, Score}).
updateInfo(Key, Infos) ->
ok.
%% key
updateInfo(Key, RecordKvs) ->
WorkName = ?ranksCfg:getV(erlang:phash2(Key, ?ranksCfg:getV(?workCnt)) + 1),
%%
gen_srv:cast(WorkName, {mUpdateInfo, RecordKvs}).
%%
getRankInfo(RankType, Cnt, Page, PageInfo) ->
getRankInfo(RankType, Cnt, PageInfo) ->
ok.

+ 3
- 0
src/ranks_app.erl 查看文件

@ -2,9 +2,12 @@
-behaviour(application).
-include("ranks.hrl").
-export([start/2, stop/1]).
start(_StartType, _StartArgs) ->
gtKvsToBeam:load(?ranksCfg, [{?workCnt, 0}]),
ranks_sup:start_link().
stop(_State) ->

+ 19
- 15
src/ranks_sup.erl 查看文件

@ -11,20 +11,24 @@
start_link() ->
supervisor:start_link({local, ?SERVER}, ?MODULE, []).
%% sup_flags() = #{strategy => strategy(), % optional
%% intensity => non_neg_integer(), % optional
%% period => pos_integer()} % optional
%% child_spec() = #{id => child_id(), % mandatory
%% start => mfargs(), % mandatory
%% restart => restart(), % optional
%% shutdown => shutdown(), % optional
%% type => worker(), % optional
%% modules => modules()} % optional
init([]) ->
SupFlags = #{strategy => one_for_all,
intensity => 0,
period => 1},
ChildSpecs = [],
SupFlags = #{strategy => one_for_one, intensity => 0, period => 1},
ChildSpecs = [
#{
id => rankMgr,
start => {rankMgr, start_link, []},
restart => permanent,
shutdown => 3000,
type => worker,
modules => [rankMgr]
},
#{
id => rankWork_sup,
start => {rankWork_sup, start_link, []},
restart => permanent,
shutdown => infinity,
type => supervisor,
modules => [rankWork_sup]
}
],
{ok, {SupFlags, ChildSpecs}}.
%% internal functions

Loading…
取消
儲存