Erlang进程字典 #

一、进程字典概述 #

进程字典是每个进程私有的键值存储,用于存储进程级别的状态。

1.1 特点 #

  • 进程私有
  • 键值存储
  • 可变状态
  • 不影响其他进程

1.2 使用场景 #

  • 存储进程配置
  • 缓存数据
  • 存储上下文信息

二、基本操作 #

2.1 put #

erlang
-module(put_demo).
-export([demo/0]).

demo() ->
    put(key1, value1),
    put(key2, value2),
    put(key1, new_value1),
    io:format("Dictionary: ~p~n", [get()]).

2.2 get #

erlang
-module(get_demo).
-export([demo/0]).

demo() ->
    put(name, "Alice"),
    put(age, 30),
    
    Name = get(name),
    Age = get(age),
    Unknown = get(unknown),
    All = get(),
    
    io:format("Name: ~p~n", [Name]),
    io:format("Age: ~p~n", [Age]),
    io:format("Unknown: ~p~n", [Unknown]),
    io:format("All: ~p~n", [All]).

2.3 erase #

erlang
-module(erase_demo).
-export([demo/0]).

demo() ->
    put(a, 1),
    put(b, 2),
    put(c, 3),
    
    OldValue = erase(a),
    io:format("Erased value: ~p~n", [OldValue]),
    
    erase(),
    io:format("After erase all: ~p~n", [get()]).

三、进程字典函数 #

3.1 函数列表 #

函数 说明
put(Key, Value) 设置键值,返回旧值
get(Key) 获取值,不存在返回undefined
get() 获取所有键值对
erase(Key) 删除键,返回旧值
erase() 清空字典,返回所有键值对
get_keys(Value) 获取指定值的所有键

3.2 get_keys #

erlang
-module(get_keys_demo).
-export([demo/0]).

demo() ->
    put(a, 1),
    put(b, 1),
    put(c, 2),
    
    Keys = get_keys(1),
    io:format("Keys with value 1: ~p~n", [Keys]).

四、使用场景 #

4.1 存储配置 #

erlang
-module(config_storage).
-export([init/1, get_config/1, set_config/2]).

init(Config) ->
    lists:foreach(fun({K, V}) -> put(K, V) end, maps:to_list(Config)).

get_config(Key) ->
    get(Key).

set_config(Key, Value) ->
    put(Key, Value).

4.2 存储上下文 #

erlang
-module(context_storage).
-export([set_user/1, get_user/0, set_request_id/1, get_request_id/0]).

set_user(User) ->
    put('$user', User).

get_user() ->
    get('$user').

set_request_id(Id) ->
    put('$request_id', Id).

get_request_id() ->
    get('$request_id').

4.3 计数器 #

erlang
-module(counter).
-export([new/1, increment/1, decrement/1, value/1]).

new(Name) ->
    put(Name, 0).

increment(Name) ->
    put(Name, get(Name) + 1).

decrement(Name) ->
    put(Name, get(Name) - 1).

value(Name) ->
    get(Name).

五、注意事项 #

5.1 避免滥用 #

erlang
-module(avoid_abuse).
-export([bad/0, good/0]).

bad() ->
    put(state, #{counter => 0}),
    State = get(state),
    NewState = State#{counter := maps:get(counter, State) + 1},
    put(state, NewState).

good() ->
    State = #{counter => 0},
    NewState = State#{counter := maps:get(counter, State) + 1},
    NewState.

5.2 使用规范键名 #

erlang
-module(key_naming).
-export([demo/0]).

demo() ->
    put('$internal_key', value),
    put('user_key', value),
    ok.

5.3 进程字典与函数纯度 #

erlang
-module(purity).
-export([pure/1, impure/1]).

pure(X) ->
    X * 2.

impure(X) ->
    put('$last_result', X * 2),
    get('$last_result').

六、总结 #

本章学习了:

  • 进程字典概述
  • 基本操作
  • 使用场景
  • 注意事项

准备好学习OTP了吗?让我们进入下一章。

最后更新:2026-03-27