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