Erlang04_ets与dets 表
总篇:13
编辑于 2025/5/10 22:40
截稿于: 2025/5/10 23:50
简介
ets(Erlang Term Sotrage),dets(disk ets): k-v结构的数据存储表,其行为类似Redis的list。
区别:
| ETS | DETS | 备注 | |
|---|---|---|---|
| 时效 | 临时存储 | 永久存到磁盘 | 节点关闭后丢失/不丢失 |
| 垃圾回收 | 不会被垃圾回收 | 不会被垃圾回收 | - |
此外还有语法上的区别。
v的数据格式是一条条元组,通常是记录的形式,:{student, 1, jack, 15}。
有以下类型表:
- set: 键必须唯一,如果插入重复键的数据,新数据会覆盖旧数据。类似普通的键值对存储。
- ordered_set: 有序集合,按照键排序,键必须唯一。
- bag: 键不唯一,但键值对唯一。
- duplicate_bag: 键不唯一,键值对也不唯一。即同一个键可以对应多个相同或不同的值。
有以下权限:
- private: 只有表所有者进程可读写。
- protected: 其他进程只可读,表所有者进程可读写。
- public:所有进程均可读写
原语
- TableId =ets:new(Name,[Opt]) 创建表
TableId =ets:new(Name,[Opt]) %创建Name键的表,返回表Id
[Opt]: %按顺序
表类型 set|ordered_set|bag|duplicate_bag,
表权限 private|public|protected,
命名表 named_table,是否可使用Name操作表
{keypos,K},表中每条元组数据的键为位置K上的数据,默认1
- true= ets:insert(TableId, Tuple|[Tuple]) 插入数据
true= ets:insert(TableId, Tuple|[Tuple]) %向TableId的表插入一条或多条数据,按照插入的顺序存入表中
%虽然没有规定类型,但还是建议插入同类型的record数据
- true = ets:delete(TableId, Key) 删除键为Key的数据
true = ets:delete(TableId, Key) % 删除键为Key的数据
- true = ets:delete_all_objects(TableId) 清空表
true = ets:delete_all_objects(TableId) % 清空表,保留表
- true= ets:delete(TableId)
true= ets:delete(TableId) % 删除表内容以及表本身
- true | false = ets:update_element(TableId, Key, {Pos, NewValue}) 修改表数据
true | false = ets:update_element(TableId, Key, {Pos, NewValue}) %修改TableId表的Key键中位置在Post的数据为NewValue
%通常是将原数据提取出来修改后再存回去
- [Tuple] | []= ets:lookup(TableId, Key) 通过键查找记录列表
[Tuple] | []= ets:lookup(TableId, Key) %通过键查找记录列表
- [Tuple] | '$end_of_table' = ets:match_object(TableId, Pattern)
[Tuple] | '$end_of_table' = ets:match_object(TableId, Pattern) % 匹配查询
Pattern:'_' :匹配任意值(通配符)
具体值:精确匹配
ep: {'_',jack,'_'}:匹配名字为jack的学生数据,要求匹配字符个数与记录字段个数相同
基于CRUD的学生管理系统
使用ets实现:
- 创建Key = student_table
- 定义Student记录
- 初始化表数据
- 查询全部学生
- Id查学生
- 增加一个学生
- 删除一个学生
- 修改一个学生(测试需另外写一个函数,此处略)
-module(stu_manage).
%=============export=====================
-export([
init/0,
add_student/5,
delete_student/1,
update_student/1,
find_by_id/1,
list_studentList/0,
get_id/1,
get_name/1,
get_age/1,
get_grade/1,
get_evaluation/1
]).
%=============record=====================
-record(student, {
id,
name,
age,
grade,
evaluation
}).
%====================export functions==============
init() ->
ets:new(student_table, [set, named_table, {keypos, 2}]),
InitialStudents = [
#student{id = 1, name = "张三", age = 15, grade = "一班", evaluation = excellent},
#student{id = 2, name = "李四", age = 16, grade = "二班", evaluation = great},
#student{id = 3, name = "王五", age = 15, grade = "一班", evaluation = great},
#student{id = 4, name = "赵六", age = 16, grade = "二班", evaluation = normal},
#student{id = 5, name = "孙七", age = 15, grade = "一班", evaluation = normal}
],
ets:insert(student_table, InitialStudents),
{ok, "init_success"}.
add_student(Id, Name, Age, Grade, Evaluation) ->
Student = #student{id = Id, name = Name, age = Age, grade = Grade, evaluation = Evaluation},
case ets:insert_new(student_table, Student) of
true -> {ok, "add_success"};
false -> {error, "id_exist"}
end.
delete_student(Id) ->
case ets:delete(student_table, Id) of
true -> {ok, "delete_success"};
false -> {error, "student_not_exist"}
end.
update_student(Student) when is_record(Student, student) ->
Id = Student#student.id,
case ets:lookup(student_table, Id) of
[] ->
{error, "student_not_exist"};
[_] ->
ets:insert(student_table, Student),
{ok, "update_success"}
end.
find_by_id(Id) ->
case ets:lookup(student_table, Id) of
[] -> {error, " student_not_exist"};
[Student] -> {ok, Student}
end.
list_studentList() ->
Students = ets:match_object(student_table, {'_', '_', '_', '_', '_', '_'}),
{ok, Students}.
get_id(#student{id = Id}) -> Id.
get_name(#student{name = Name}) -> Name.
get_age(#student{age = Age}) -> Age.
get_grade(#student{grade = Grade}) -> Grade.
get_evaluation(#student{evaluation = Evaluation}) -> Evaluation.

很像平时写的z_db_lib 数据库操作。
浙公网安备 33010602011771号