自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(37)
  • 收藏
  • 关注

原创 Linux常用脚本(七) ---简单防火墙管理

【代码】Linux常用脚本(七) ---简单防火墙管理。

2024-12-22 23:35:54 310

原创 Linux常用脚本(六) --- 获取系统信息和检查错误日志

【代码】Linux常用脚本(六) --- 获取系统信息和检查错误日志。

2024-12-19 22:28:10 234

原创 Linux常用脚本(五) --- 查看目录占用空间以及最大文件或目录

【代码】Linux常用脚本(五) --- 查看目录占用空间以及最大文件或目录。

2024-12-18 23:54:28 169

原创 Linux常用脚本(四) --- 批量修改文件权限

【代码】Linux常用脚本(四) --- 批量修改文件权限。

2024-12-17 23:08:03 488

原创 Linux常用脚本(三) --- 根目录磁盘空间检查

【代码】Linux常用脚本(三) --- 根目录磁盘空间检查。

2024-12-17 00:03:59 264

原创 Linux常用脚本(二) --- 清理指定过期时间临时文件的脚本

【代码】Linux常用脚本(二) --- 清理指定过期时间临时文件的脚本。

2024-12-15 21:01:13 349

原创 Linux常用脚本(一) --- 备份文件夹并压缩成 .tar.gz 文件

【代码】Linux常用脚本(一) --- 备份文件夹并压缩成 .tar.gz 文件。

2024-12-12 21:47:14 231

原创 Linux基础命令(五):进程管理相关命令

【代码】Linux基础命令(五):进程管理相关命令。

2024-12-12 00:19:00 384

原创 Linux基础命令(四):有关磁盘与文件系统的命令

挂载后可以通过 /mnt 目录访问 /dev/sda1 上的文件。卸载后,/mnt 目录下的文件系统不再可用。

2024-12-10 22:48:27 492

原创 Linux基础命令(三):文件压缩及解压缩命令

archive.tar:创建的归档文件名称。tar.bz2:打包并压缩后的文件扩展名。tar.gz:打包并压缩后的文件扩展名。j:表示使用 bzip2 压缩归档文件。z:表示使用 gzip 压缩归档文件。z:表示使用 gzip 解压缩。c:创建一个新的归档文件。f:指定归档文件的名称。f:指定归档文件名。

2024-12-09 22:31:18 621

原创 Linux基础命令(二):查看文件及内容处理命令

解释:rev 用于反转文件中每一行的字符顺序。

2024-12-08 21:43:49 557

原创 Linux基础命令(一):文件和目录操作命令

【代码】Linux基础命令(一):文件和目录操作命令。

2024-12-06 01:33:18 501

原创 Mnesia(三)

内存表(RAM Table)以其极高的性能适用于对速度要求极高的场景,但由于数据是瞬态的,一旦系统崩溃或重启,所有数据会丢失。其值是一个节点名的列表,表示哪些节点上的 Mnesia 实例将存储该表的数据,数据存储在磁盘上。它的值是一个节点名的列表,表示哪些节点上的 Mnesia 实例将存储该表的数据。用于获取与记录相关的信息,使用语法{attribute,record_info(fields,xxx)},而不需要显式的逐个字段的指定列名。Args:一个包含表配置的列表,它指定了该表的属性和行为。

2024-12-05 00:15:37 1904

原创 Mnesia 事务

在 Erlang 中,mnesia:transaction/1 提供了一个事务机制,保证了一组数据库操作要么全部成功,要么全部失败,避免了并发访问时的数据不一致问题。通过将多个数据库操作(mnesia:delete/1, mnesia:write/1 等)封装在一个F函数中,然后通过 mnesia:transaction(F) 执行这个函数,确保了事务的一致性和隔离性。事务机制的关键作用是解决并发访问中的竞争条件问题。

2024-12-03 21:07:40 477

原创 Mnesia(二) ——增删表中数据

mnesia:write/1 会根据主键的值判断是否插入新记录还是更新已有记录。如果表的主键存在,mnesia 会进行更新;如果主键不存在,它将插入新记录。如果 Oid 不存在于表中,mnesia 不会抛出错误,而是返回 ok,表示删除操作已完成(只是没有数据被删除)

2024-12-02 23:24:17 245

原创 Erlang数据库:Mnesia(一) —— 数据库查询

用于执行由 qlc:q/1 生成的查询,并返回查询的结果。qlc:e/1 会在执行时处理 Mnesia 表中的数据,生成一个结果集。它负责把参数中的查询语句编译为用来执行数据库查询的内部形式。首先我们需要创建两张表,并插入一些数据。首先创建数据库表,插入数据。

2024-12-01 16:50:59 497

原创 DETS

文件大小限制:DETS 表存储的数据文件最大不能超过 2GB。在磁盘上建立一个映射表,将文件名映射为整数,将整数映射为文件名。

2024-11-28 23:01:09 258

原创 gen_server和ets小案例

使用gen_server和ets实现简单的定时清理数据。

2024-11-28 00:36:48 190

原创 ETS(六)

优化的代码通过将数据按页存储在ETS表中,优化了分页查询的效率。首先,它在插入数据时就根据PageSize将数据拆分成多个页面,存储到ETS表中。查询时,根据起始和结束位置计算出相关的页码,避免了每次查询时都需要遍历整个数据集。这样,当查询特定范围的数据时,只需加载包含目标数据的页,减少了对不相关数据的访问,提升了查询效率。同时,数据的分页存储方式也避免了一次性将所有数据加载到内存中,从而降低了内存消耗。效率低,随着数据量增大,查询速度变慢,因为每次都需要从头扫描表,尤其在查询较后页时,性能会显著下降。

2024-11-26 22:12:19 256

原创 ETS(五)

使用est:next/2实现简单分页查询。

2024-11-25 23:41:21 143

原创 ETS(四)

Condition 部分:[{‘>’, ‘$3’, 30}] 表示查询条件是 “年龄”(即 ‘$3’)大于30。注意:‘$3’ 是一个变量,它对应模式中第三个元素。Pattern 部分:{‘$1’, ‘$2’, ‘$3’, ‘$4’} 表示查询每个元组的四个元素:ID、姓名、年龄和注册日期。这个部分匹配表中的每一行。ets:select_delete/2:对于删除操作,条件和查询类似,只是会删除符合条件的记录。

2024-11-24 20:12:44 255

原创 ETS(三)

可以看到随着数据量的增加,ets:match/2 和 ets:tab2list/1 的执行时间差距逐渐加大。这种现象的主要原因是它们的查询方式和性能特征不同。两者的区别就变为了ets:match/2方法与ets:tab2list/1方法之间的区别。

2024-11-21 21:57:06 356

原创 ETS(二)

ets:new/2 用于创建一个 ETS 表。表创建时,需要指定表名和选项,选项决定了表的类型、访问权限等属性。Name: 表的名称,必须是一个原子(例如 my_table)。Opt: 选项列表,用于配置表的行为。

2024-11-21 00:05:52 377

原创 ETS和DETS:大量数据的存储机制

ETS 和 DETS 都是 Erlang 提供的键值存储,ETS 数据存储在内存中,查询效率非常高,且无论数据量大小,查询速度几乎不受影响(在某些情况下可能呈对数增长)。但是,ETS 数据是临时的,一旦表被删除,数据也会丢失。DETS 则将数据存储在磁盘上,查询速度相对较慢,但它能够节省内存,并且数据是持久化的,即使系统崩溃也不丢失。DETS 表会在重新打开时检查数据一致性,并尝试修复损坏的数据,这个过程可能会比较耗时。两者的接口几乎相同,支持多个进程共享数据,适合用于进程间的数据交换。

2024-11-19 23:36:25 474

原创 警报管理

警报处理程序这一步调用了 alarm_handler 模块中的 set_alarm/1 函数,并传递了 tooHot 作为参数。我定义了事件处理器 my_alarm_handler,并将其与 alarm_handler 进行了绑定(通过 gen_event),当此事件发生时,它会被传递给 my_alarm_handler 模块进行处理。alarm_handler 模块本身并没有处理事件的逻辑,而是依赖于 gen_event 框架来调用my_alarm_handler 中的回调函数。

2024-11-18 23:12:35 453

原创 错误日志(一)

新的消息进来时,会把它加到日志的尾部,如果日志被装满了,最早的条目就会被清除。在日后对错误日志进行分析的时候,可以用这3种标签协助我们来检查问题,过滤日志条目。你需要传入日志的编号(通过 rb:list/0 获取),然后它会显示该条日志的详细信息。返回的是一个表格,显示每条日志的编号、类型、进程、日期和时间等信息。向错误日志发送一个错误消息它的参数与io:format(Format,Data)函数的参数一样。创建一个适合程序开发的环境,只会提供错误日志的简单形式(错误日志记录器会产生下面几种类型的报告。

2024-11-17 22:04:16 1772

原创 构造基于OTP的系统(一)——通用事件处理

后续调用event_handler:event/2,事件处理函数都为controller/1。此时事件会被送到 my_handler 进程,此时只有。函数添加到事件处理器中,告知进程更新事件处理函数。函数,并传递初始的事件处理函数。函数启动一个线程,执行。

2024-11-15 00:36:46 237

原创 gen_server5

用来查找某个账户的余额,Tab为gen_server的状态(这里为 ETS表),Who为用来查找表中以Who为key的数据。在本示例中,银行账户的余额是通过 ETS 表来存储的。handle_cast/2 和 handle_info/2 用于处理异步消息和发给服务器的原生消息。handle_call/3 处理同步请求(如新建账户、存款、取款等操作)。stop/0 函数通过发送消息停止 gan_server 服务。使用当前模块名称来创建一个为[]的数据库,来存储银行账户信息。用来插入或更新账户信息。

2024-11-14 00:12:49 249

原创 gen_server-4

调用 server5:rpc/2 向 Pid(即 server5 进程)发送 {self(), {fac, 5}} 请求,计算 5 的阶乘。server5 进程在接收到请求后,会将请求传递给 my_fac_server:loop/0 进程,该进程会调用 fac(5) 来计算阶乘。调用 server5:start/0 启动了 server5 服务器, 返回server5 的服务器进程ID Pid。这使得 server5 进程的行为从默认的 wait/0 切换到 my_fac_server:loop/0.

2024-11-12 22:24:02 177

原创 gen_server-3

此时会向name_server线程发送请求,{From, {swap_code, NewCallBackMod}}会匹配结果,将Mod name_server修改为new_name_server,此时我们就能调用new_name_server中的all_name/0方法,name_server 进程收到请求,此时Mod已变为new_name_server执行, handle(allNames, Dict),dict:fetch_keys(Dict)函数,会去字典中查找所有key。

2024-11-11 23:15:06 263

原创 gen_server-2

处理了结果,服务器代码变化为:在 loop/3 函数中,加入了 try / catch 机制来捕捉 Mod:handle(Request, OldState) 过程中可能出现的异常,当Mod:handle(Request, OldState)抛出异常,会调用log_the_error/3打印日志,并且向发送请求的进程发送 {Name, crash} 消息,rpc/2 中会接收到 {Name, crash},并通过 exit(rpc) 退出当前进程。,回调程序的代码并没有多大改变,只是在调用。

2024-11-10 23:17:55 146

原创 gen_server-1

name_server 进程收到请求,执行 handle({add, xm, “xiaoming”}, Dict),将 “xm” 和 “xiaoming” 存入字典。name_server:find/1函数执行过程与name_server:add/2类似,name_server 进程收到请求,执行 handle({find, xm}, Dict),dict:find(Name,Dict)函数,会去字典中查找"xm" 的值 “xiaoming” ,找到了返回值,未找到返回error。

2024-11-08 00:46:11 166

原创 IRC Lite

在本章中,我们要开发一个轻巧的类IRC的程序。组成这个应用程序的组件共有5个,图11-1展示了这些组件之间的组织结构。在图11-1中有3个客户端节点(假定都运行在不同的机器上)和一个独立的服务器节点(在另外一台独立的机器上)。这些组件分别负责完成下面这些功能。用户界面部件是一个用于将接收到的消息显示出来的GUI窗口组件,当然它也负责发送消息,它发出的消息会发送到聊天客户端组件。聊天客户端(图11-1中的C)负责管理来自聊天窗口的消息,然后将它们转发至当前群组的群控制器中。

2024-11-04 22:29:42 600

原创 分布式编程

分布式编程的两种基本模型:这种模型可以让我们在一个紧密耦合的计算机集群上编写程序。在分布式Erlang中,我们要编写可运行在不同Erlang节点之上的程序。我们可以在任何一个节点创建进程,这与我们前几章中讨论单节点编程时的情形一致,所有的消息传递和错误处理原语都可以照搬套用。分布式Erlang应用程序运行在一个可信任的环境中–因为任何节点都可以运行其他节点上的操作,这就需要一个高度信任的网络环境。尤其是在防火墙的保护下,Erlang应用程序可以运行在同一个局域网的不同集群之间,虽然这些集群都对外网公开。

2024-11-03 22:04:49 942

原创 并发编程中的错误

如果一个进程链接到某个系统进程,由于某种原因而导致这个进程退出,那么链接的系统进程不会自动消亡,而是会收到一个退出信号,系统进程收到这个消息,可以再进行一些处理。如果其中的一个进程调用了BIF link(P) (P的值是另一个进程的PID),那么这两个进程之间就建立了链接。当Pid进程向一个系统进程发送一个内容为why的退出信号时,系统会把退出信号转换为消息{‘EXIT’,Pid,why}然后送入系统进程的。图9-1中的(a),表示的是两个链接在一起的进程,其中的A是一个系统进程(用双圈表示)。

2024-10-30 22:41:29 722

原创 erlang基础总结

列表中的元素可以合理的地方换行,但是不允许在一些 “不合理的方”,比如原子类型、整数、或者其它数据类型的中间换行。列表用方括号表示,列表与元组相似,但是元组只能在比较中使用,而列表允许执行的操作更多。,之外的其它字符,那么就必须用单引号括起来,如:‘Mobile_phone’,‘empty box’。Erlang不直接支持字符串的概念,但是可以使用带双引号的值创建字符串值。头是单一元素,尾是列表的其余部分,例如,可以使用 “|” 查看部分列表。原子类型的值与变量不同,变量拥有值,而原子类型没有。

2024-10-28 22:05:21 1031

原创 erlang-并发

在进入rpc/2函数的时候,Pid会被绑定到某个值,因此在模式{Pid,Response}中,Pid是绑定的,而Response是自由的。如果邮箱中的第一个消息不能匹配receive语句的任何一个模式,那么就会将第一个消息从邮箱中删除并送入一个“保存队列”,然后继续尝试邮箱中的第二个消息。如果匹配成功,消息就从邮箱中删除,对应的模式之后的表达式就会被求值。说明:在邮箱中有大量消息的情况下,使用这种方法来优先接收消息是非常低效的,因此,如说明果你计划使用这种技术,那么需要确认邮箱中没有大量的消息。

2024-10-27 17:19:17 1960 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除