Erlang中是不建議用進程字典的,但進程字典是數據存取最快的方式,對於游戲這種高性能要求的應用,進程字典是不二的選擇。使用進程字典時要切記在對應的進程中操作,最好按功能把put,get操作封裝到模塊接口中,避免誤用。
作為自身狀態的一部分,每個進程都有一個私有的進程字典(換句話說每個進程字典只供它所屬的進程調用,其他進程調用不了,進程字典的key和value沒有特定的關系),這是一個可以用任何值作為鍵的簡單哈希表,用於存儲Erlang項式。通過內置函數put( Key,Value)和get( Key)可以從中存取項式。
put( Key,Val ) -> OldVal | underfined
在進程字典里添加一個與值 Val 關聯的新鍵 Key,並返回 undefined,如果鍵已經存在,則舊的值會被刪除並被替換成 Val,最后函數返回舊的值。
get() -> [ { Key,Val}]
以一個{ Key,Val } 元組列表的形式返回進程里的所有字典值
get( Key ) -> Val | undefined
在進程字典里獲取一個跟鍵Key相關的值Val,如果這個鍵不存在,則返回undefined。
erase() -> [{ Key,Val}]
返回所有進程字典數據並刪除之
erase(Key) -> Val | undefined
獲取並清除進程字典里跟鍵Key所對應的值,如果進程字典里沒有跟鍵相關聯的值,則返回undefined。
例如:
%%定義宏
-define(DIC_ROLE_ITEMS,dic_role_item).
%%初始化RoleItemList,在此進程初始化的時候調用
init_role_item(RoleId) ->
RoleItemList = [list_to_tuple([ets_role_item | X]) || X <- db_agent_item:get_role_item_by_roleid(RoleId)],
update_role_item_list(RoleItemList).
%%更新DIC_ROLE_ITEMS進程字典
update_role_item_list(RoleItemList) ->
put(?DIC_ROLE_ITEMS,List).
%%獲取進程字典的數據
get_roleitemlist() ->
case get(?DIC_ROLE_ITEMS) of
undefined ->
[];
List when is_list(List) ->
List;
_ ->
[]
end.
%% 處理用戶離線
role_offline() ->
erase(?DIC_ROLE_ITEMS).
%%更新內存中道具信息
update_role_item_info(RoleItemInfo) ->
case is_record(RoleItemInfo,ets_role_equip) of
true ->
List = get_roleitemlist(),
List1 =
case lists:keyfind(RoleItemInfo#ets_role_item.role_itemId,#ets_role_item.role_itemId,List) of
false ->
List ++ [RoleItemInfo];
_ ->
lists:keyreplace(RoleItemInfo#ets_role_item.roleItemId,#ets_role_item.roleItemId,List,RoleItemInfo)
end,
update_role_item_list(List1);
false ->
?WARNING_MSG("RoleItemInfo is not record:~p~n",[RoleItemInfo])
end.
%%刪除內存中指定道具的信息
delete_role_item_info(RoleItemId) ->
case get_roleitemlist() of
[] ->
skip;
RoleItemList ->
NewRoleItemList = lists:keydelete(RoleItemId,#ets_role_item.roleItemId,RoleItemList),
update_role_item_list(NewRoleItemList)
end.