Erlang --- 進程字典


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.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM