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:所有进程均可读写

原语

  1. 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
    
  1. true= ets:insert(TableId, Tuple|[Tuple]) 插入数据
true= ets:insert(TableId, Tuple|[Tuple]) %向TableId的表插入一条或多条数据,按照插入的顺序存入表中
%虽然没有规定类型,但还是建议插入同类型的record数据
  1. true = ets:delete(TableId, Key) 删除键为Key的数据
true = ets:delete(TableId, Key) % 删除键为Key的数据
  1. true = ets:delete_all_objects(TableId) 清空表
true = ets:delete_all_objects(TableId) % 清空表,保留表
  1. true= ets:delete(TableId)
true= ets:delete(TableId) % 删除表内容以及表本身
  1. true | false = ets:update_element(TableId, Key, {Pos, NewValue}) 修改表数据
true | false = ets:update_element(TableId, Key, {Pos, NewValue})  %修改TableId表的Key键中位置在Post的数据为NewValue
%通常是将原数据提取出来修改后再存回去
  1. [Tuple] | []= ets:lookup(TableId, Key) 通过键查找记录列表
[Tuple] | []= ets:lookup(TableId, Key) %通过键查找记录列表
  1. [Tuple] | '$end_of_table' = ets:match_object(TableId, Pattern)
[Tuple] | '$end_of_table' = ets:match_object(TableId, Pattern) % 匹配查询

Pattern:'_' :匹配任意值(通配符)
         具体值:精确匹配
ep: {'_',jack,'_'}:匹配名字为jack的学生数据,要求匹配字符个数与记录字段个数相同

基于CRUD的学生管理系统

使用ets实现:

  1. 创建Key = student_table
  2. 定义Student记录
  3. 初始化表数据
  4. 查询全部学生
  5. Id查学生
  6. 增加一个学生
  7. 删除一个学生
  8. 修改一个学生(测试需另外写一个函数,此处略)
-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 数据库操作。

posted on 2025-05-10 23:49  依只  阅读(26)  评论(0)    收藏  举报

导航