- 博客(41)
- 收藏
- 关注
原创 基于Mnesia的分布式缓存
根据集群中是否存在其他缓存节点,该函数会采取不同的数据库初始化策略用于处理整个集群中只有当前这一个缓存节点的情况,一个完整的simple_cache实例就此启动完毕,后续加人集群的实例都将可以从它那里复制数据。如果探测到集群中的其他simple_cache实例,从集群中的其他节点处拉取数据。由add_extra_nodes/1通过遍历所有远程节点来实现。相关逻辑由add_extra_nodes/1通过遍历所有远程节点来。如果探测到集群中的其他simple_cache实例,就进入第二个子句。
2023-10-20 06:14:05
252
原创 缓存系统实现
的sc_element进程用于存储与给定的键相关联的数据。以gen_server行为模式为基础来实现这类进程,数据将被在gen server进的进程状态。API由init/1(负责存储系统的初始化)和处理基本CRUD操作(创建读取更新和除的3个函数组成,其中insert/2同时负责创建新表项和更新现存表项。sc_element模块实现了sc sup的子进程每当有新数据插人缓存时,sc_sup就会派出一个新。sc_element一用于存储缓存数据的进程。delete/1-按键从缓存中删除键/值对。
2023-10-19 06:17:43
91
原创 基于TCP的RPC服务
在 split_out_mfa(RawData)中,解析请求数据,随后,将模块名、函数名、参数项式列表传给内置函数apply/,执行请求中的调用。最后,该函数的返回值由io_lib:fwrite/2转换为格式化文本,用作回传给用户的响应,通过套接字发送回去。TCP服务器上的RPC,通过创建一个服务器进程监听传入的tcp连接,并允许用户 通过此TCP流执行RPC命令。在 split_out_mfa(RawData)中,解析请求中的字符串。利用xshell向8000端口创建一个连接。处理TCP上的RPC请求。
2023-10-18 06:14:53
452
原创 实现资源探测
定义了3个字段:target_resource_types就是上述的“需求”列表,所需资源的类型的列表;local_resource_tuples则是“供给”列表,这张列表以资源元组的形式保存着本地节点上的所有资源;)这些广播消息的格式为{trade_resources,[ReplyTo,Resources]},其中ReplyTo是发送方所处节点的节点名(由node()给出)Resources是一个数据结构(一个dict),内含发送方打算公布的所有资源元组。首先,从服务器状态中提取当前所有目标资源的类型。
2023-10-17 06:27:19
82
原创 分布式监控树
Erlang中有不同的监督策略,包括一对一监督(one-for-one)、一对多监督(one-for-all)和简单监督(simple-one-for-one)。不同的监督策略适用于不同的故障处理场景。如果一个子进程终止了,那么后面的子进程——即在启动顺序上在这个终止了的进程后面的子进程——都被终止。然后该终止的进程和后面的子进程都被重启。如果一个子进程终止了,那么所有其他的子进程都被终止然后,所有的子进程都被重启,包括原来被终止的那个。如果一个子进程终止了,仅该进程被重启。
2023-10-16 00:13:36
165
原创 Erlang分布式 编程 1
在分别在两个linux系统erlang分布式节点,nodeA作为tcp服务器,负责建立服务器与客户端之间的连接和收发消息,nodeB节点负责处理nodeA接收到的消息。在客户端中发送请求存储{a,1}的键值对,nodeA成功的接收到消息,并将消息交给nodeB,nodeB处理好后返回给nodeA,并将消息发送给了客户端。在nodeA中启动node_server负责建立连接,并将消息的收发交给server_rec,nodeB中是一个kvs,负责处理nodeA中的消息。
2023-10-13 06:20:20
66
原创 Erlang分布式
要启动节点,通过命令erl -sname 或者erl -name,在此之前需要启动epmd进程,它负责映射符号名到机器地址,在两个节点使用epmd -daemon,也可以通过使用启动参数-setcookie来设置启动节点的cookie。创建的进程调用ping方法,ping方法有两个参数,一个是发送消息的次数,一个就是远程节点的name了,也就是我们将要创建的进程pong的所在节点。使用erl_epmd:names()可以查看epmd注册的节点。此时从节点A和节点B中都能看见连接的节点。
2023-10-11 02:52:29
159
原创 在linux系统中批量编译erlang文件,启动一个简单的erlang服务器
在启动时,出现不同erlang版本编译的beam导致的运行失败,在Linux中启动一个简单的erlang服务器。在linux系统中批量编译erlang文件。批量编译erlang文件。
2023-10-10 01:04:58
317
原创 简单的带有通信和数据库的tcp服务1
s startstart表示启动erlang shell后执行start:start(){outdir, "ebin"} %% 指定编译出来的beam文件存放目录。{i, "include"}, %% 指定include文件夹。-pa ebin表示把ebin路径添加到erlang的搜索路径中。'src/*' %% 指定erl源文件目录。服务启动函数start.erl。执行start.bat启动服务。资源文件start.app。dets插入数据,查询数据。ets插入数据,查询数据。
2023-10-09 06:33:50
65
原创 简单的带有通信和数据库的tcp服务
在上一篇文章的基础上,通过在客户端执行ets和dets相关的操作,向服务端发送消息,服务端接收到消息后,在接收进程中处理相关的操作。
2023-10-08 06:34:07
63
原创 erlang TCP/IP
通过gen_tcp:listen(Port, Options). 来监听一个端口,在gen_server init()的时候监听端口,同时等待连接。tcp_server进程则继续调用gen_tcp:accept(),等待下一个连接。gen_tcp:controlling_process将这个进程号和Socket绑定,作用就是将tcp消息转换成进程消息,使其能通过handle_info匹配{tcp, Socket, Bin}实现异步接收。利用gen_server 实现TCP。
2023-10-04 22:08:02
114
原创 erlang TCP/IP
开启一个监听某个端口的套接字开启一个监听某个端口的套接字,参数 Port 为 0,那么底层操作系统将赋值一个可用的端口号。
2023-10-03 22:21:20
173
原创 tcp/ip
TCP/IP 协议套件还包括其他协议,如 UDP(User Datagram Protocol,用户数据报协议)、HTTP(Hypertext Transfer Protocol,超文本传输协议)、FTP(File Transfer Protocol,文件传输协议)等。这个过程中,主动关闭连接的一方(客户端或服务端)会首先发送FIN报文,而另一方则会发送ACK报文来确认收到这个请求,并且发送自己的FIN报文来关闭连接。C类IP地址:192.168.0.0~239.255.255.0。
2023-09-28 07:05:48
76
原创 shell 学习 Day9
通过for循环,以find命令作为遍历条件,将目标目录下的所有文件进行遍历并做相应操作。计算文档每行出现的数字个数,并计算整个文档的数字总数。
2023-09-27 07:20:25
50
原创 shell 学习 Day8
k n[,m]: ―按照指定的字段范围排序。从第n字段开始,m字段结束。当有重复数据需要去重时,可以通过使用-uk指定从第一列到第二列去重。排序时可以使用- o加上文件名 使得排序好的数据保存在指定的文件中。sort命令默认是用每一行的第一个字符来进行排序。-n: 以数值型进行排序,默认使用字符串型排序。-t: 指定分隔符为空格,-k指定排序第二列。-b: 忽略每行前面的空白部分。sort [选项] 文件名。-r选项 实现反向的排序。wc [选项] 文件名。-u: 删除重复行。
2023-09-26 06:28:42
66
原创 shell 学习 Day7
模式匹配,sed会读取每一行数据到模式空间中,之后判断当前行是否符合模式匹配要求,符合要求就会执行sed程序命令,否则不会执行sed程序命令;sed是一种流编辑器,它一次处理一行内容,将这行放入缓存(存区空间称为: 模式空间),然后才对这行进行处理,处理完后,将缓存区的内容发送到终端。BEGIN:在awk程序一开始时,尚未读取任何数据之前执行。-n: 取消默认输出,sed默认会输出所有文本内容,使用-n参数后只显示处理过的行.-i : 直接对内容进行修改,不加-i时默认只是预览,不会对文件做实际修改。
2023-09-23 15:33:54
46
原创 shell 学习 Day6
c 字符范围: 不依赖分隔符来区分列,而是通过字符范围(行首为0)来进行字段提取。“n-”表示从第n个字符到行尾;“n-m”从第n个字符到第m个字符;“一m”表示从第1个字符到第m个字符。正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配。-d 分隔符: 按照指定分隔符分割列。匹配数字0连续出现两次的字符串。-n 取消分割多字节字符。匹配所有的内容,包括空白行。cut [选项] 文件名。-f 列号: 提取第几列。匹配至少包含一个a的行。匹配用小写字母开头的行。匹配除2--3以外的行。
2023-09-22 05:46:26
48
原创 shell 学习 Day5
linux中的shell可以定义函数,然后在函数中调用执行相关的shell命令,完成功能,shell中的函数调用格式如下:action;function fun () 表示有返回参数的函数。fun() 表示无返回参数的函数使用return可以返回参数值,当不适用retunrn时将默认以最后一条命令运行的结果作为返回值。函数返回值在调用该函数后通过 $?来获得在shell函数内去调用另一个函数。当一个函数去调用不带返回值函数:函数B调用带返回值的函数A,并接收函数A的返回值进行输出。
2023-09-21 06:40:55
48
原创 shell 学习 Day4
while循环可以定义为控制流语句,只要您所应用的条件为真,就会重复执行语句,可以通过 break 语句可以终止 while 循环的重复性任务。在上述代码中会循环输出1-20,但当i的值在3-18 时将会触发continue 语句跳过当前循环的输出。给定一个初始值0,循环加1,当a小于5时继续执行直到a为5时,条件为true,跳出循环。在上述代码中,会循环a,当a的值为4时会调用break 语句,终止当前的for循环。在循环中可以通过 continue 语句在 for 循环中以特定条件跳过当前的循环。
2023-09-20 01:35:22
52
原创 shell 学习 Day3
否则退出if语句,即执行fi后面的语句,f和fi是条件语句的语句括号,必须成对使用。如果表达式为真,则执行语句1,然后退出if语句;否则执行语句2,然后再退出if语句。在上面这段语句中判断输入的参数名是否存在,-e 用于判断目录是否存在。-ne 不等于,应用于整型比较 not equal;-lt 小于,应用于整型比较 letter;-eq 等于,应用于整型比较 equal;-le 小于或等于,应用于整型比较;-ge 大于或等于,应用于整型比较;
2023-09-19 07:17:18
65
原创 shell 学习 Day2
最后一次执行的命令的返回状态上一次执行study3.sh成功,所以输出$?返回的是0,当$?这个变量为0,则表示上一个命令执行正确,当这个变量不为0的其他数,则表示上一个命令执行出现问题。$$:表示当前进程的进程号Pid可以通过ps -f 查看当前的进程中,存在进程号为4062的bash进程。+加法减法乘法除法取余-eq检测两个数是否相等,相等返回 true。[ $a -eq $b ] 返回 false。-ne检测两个数是否不相等,不相等返回 true。
2023-09-16 05:09:52
165
1
原创 shell 学习 Day1
Shell编程中变量分为三种,分别是系统变量、环境变量和用户变量,Shell变量名在定义时,首个字符必须为字母(a-z,A-Z),不能以数字开头,中间不能有空格,可以使用下划线(_),不能使用(-),也不能使用标点符号等。定义变量bookname ,输出时使用单引号,会将单引号中的内容完整的输出。直接使用set 命令,会查询系统中所有的变量,包含用户自定义变量和环境变量。定义变量num=123,调用变量: $变量名 ,输出变量num的值。如果设定了-x选项,会在每个命令执行之前,先把命令输出一次。
2023-09-15 01:52:37
45
原创 ERLANG学习 Day18
它会在单个节点上创建一个常驻内存的表和一个磁盘副本,如果节点崩溃了,表就会从磁盘恢复,表的读访问很快,但写访问较慢,内存最好能容纳这个表。它会在两个节点上各创建一个常驻内存的表,如果两个节点都崩溃了,表就会丢失,内存必须能容纳这个表,可以在任何一个节点上访问这个表。它只会在单个节点上创建一个磁盘副本, 它用于那些因为太大而无法放入内存的表, 它的访问速度比带有内存副本的方案更慢。它会在单个节点上创建一个常驻内存的表,如果节点崩溃了,表就会丢失,它是所有表里最快的一种,内存必须能容纳这个表。
2023-09-13 23:27:02
98
1
原创 ERLANG学习 Day17
如果它发现这可能导致死锁,就会立即中止 事务并撤销之前所做的改动。如果因为其他进程正在访问数据而导致事务一开始就失败了,系统就会进行短时间的等待, 然后再次尝试执行事务。这么做的一种结果就是事务fun里的代码可能会被执行很多次。事务fun里的代码不应该做任何带有副作用的事情。在这段代码中在我检查橙子的数量之前更新了数据库里的苹果数量。如果事务失败它就会被撤销,数据就不会发生更改。当这个事务失败时,mnesia:write所做的更改都被撤 销了。当数量不够时,事务撤销,数据并未更改。Mnesia 启动,
2023-09-13 02:23:31
107
1
原创 ERLANG学习 Day16
query(qlc:q([X || X <- mnesia:table(Name)])).中,qlc就代表了query list comprehension (查询列表推导)。Mnesia是一种用Erlang编写的数据库,Mnesia的速度极快,可以保存任何类型的Erlang数据结构。mnesia:create_schema(NodeList)会在NodeList(它必须是一个包含有效Erlang节点的 列表)里的所有节点上都初始化一个新的Mnesia数据库。添加几行数据,并查询数据,
2023-09-12 01:38:42
63
原创 ERLANG学习 Day15
6.执行to_dets方法,会把一个已打开的 ETS 表 Tab 里的对象数据插入到一个已创建或已打开的Dets。5.读取显示ets1和dets1中的数据,此时,ets1中含有刚才插入的数据,dets1中没有。8.这时将dets1中的数据通过to_ets方法加载到ets2中,实现ets表数据放入dets,dets数据load进ets。此时查看dets1的数据,发现有以上在ets1中插入的数据。成功将dets中的数据导入到ets中。4.创建一个名为dets1的Dets。成功将ets中的数据放入dets。
2023-09-09 07:44:38
83
原创 ERLANG学习 Day14
open的代码会自动初始化DETS表,方法是在创建新表时插入{free, 1}元组。如果File存 在,filelib:is_file(File)就会返回true,否则返回false。请注意,dets:open_file或者 创建一个新文件,或者打开一个现有文件,调用dets:open_file前先检查文件是否存在的原因。如果两个 或更多本地进程用相同的名称和选项打开某个DETS表,它们就会共享这个表。当收到其他未知消息时,我们打印出一条未知消息的提示信息,并继续循环。消息时,我们退出循环并终止进程。
2023-09-08 07:31:13
136
1
原创 ERLANG学习 Day13
在以上三个接口的回调函数中,使用ets:lookup查询以Who为key的元组,使用ets:insert实现在表中添加用户,存钱,取钱。在ets表中添加了以tom为key元组,初始值为0。使用ets:delete删除以Who为key的元组。使用gen_serverd对ETS表进行操作。启动服务器时会初始化创建一个ets表。以my_bank为例。
2023-09-07 07:35:37
94
1
原创 【无标题】
当ETS表被丢弃或者控制它的Erlang进程终 止时,这些数据就会被删除。基本上唯一需要使用这个选项的场合是保存Erlang 记录(它其实是元组的另一种形式),并且记录的第一个元素包含记录名的时候。这个程序会为四种模式各创建一个ETS表,然后向表内插入{a,1}、{b,2}、{a,1}和{a,3}。ETS或 DETS表其实就是Erlang元组的集合ETS则是Disk ETS(磁盘ETS)的缩写。4. protected 创建一个受保护表,任何知道此表标识符的进程都能读取它,但只有主管进程才能写 入它。
2023-09-06 07:37:52
34
1
原创 ERLANG学习 Day11
RegExp 这是一个shell风格的正则表达式,用于测试找到的文件。如果遇到的文件匹配这个正则表达式,就会调用Fun(File, Acc),其中File是匹配正则表达式的文件名。模块入口点lib_find:files(Dir, ShellRegExp, Flag)为此程序的最常用功能提供了一 个简化的入口点。这里的ShellRegExp是一个shell风格的通配符模式,比完整形式的正则表达式 更容易编写。这个模块的主要入口点如下: files(Dir, Reg, Recursive, Fun, Acc)
2023-09-05 07:15:58
51
1
原创 ERLANG学习 Day10
gen_server遵循一个特定的行为模式,包括初始化、处理请求、和终止等过程。在初始化过程中,gen_server会创建一个新的进程,并返回一个进程ID。当一个进程向gen_server发送请求时,它会将请求封装在一个元组中,然后将元组发送到gen_server的进程ID。处理函数可以修改gen_server的状态,并返回一个响应。最后,gen_server会将响应封装在一个元组中,然后发送给发送请求的进程。gen_server是Erlang中一种通用的服务器,它通过消息传递的方式实现进程间通信。
2023-09-02 05:27:59
55
原创 ERLANG学习 Day 8
file:consult(File)会假定File指定的文件中包含了一串Erlang的数据项,如果可以读取其中的所有数据项,就会返回{ok,[Term]};4.io模块:这个模块提供了一系列对已经打开的文件进行操作的函数,这个模块中的函数可以用于对文件中数据的解析以及向文件中写入格式化的数据。3.filelib:这个模块是file模块的的扩展,提供了一套辅助函数用于生成文件列表、校验文件类型等操作。1.file模块:在这个模块中包含了用于文件的打开,关闭,读取,写入和目录列表等功能的函数。
2023-08-30 23:35:07
58
1
原创 ERLANG学习 Day7
如果邮箱里不存在匹配{alarm, X}的消息,priority_receive就会接收邮箱里的第一个 消息。如果没有任何消息,它就会在最里面的接收语句处挂起,并返回它收到的第一个消息。如 果存在匹配{alarm, X}的消息,这个消息就会被立即返回。超时值为0会让超时的主体部分立即发生,但在这之前,系统会尝试对邮箱里的消息进行匹 配。可以通过定义一个flush_buffer函数,它会清空进程邮箱里的所有消息。启动一个定时器,然后在到期前关闭它。定义一个sleep(T)函数, 它会让当前的进程挂起T毫秒。
2023-08-30 01:11:16
101
1
原创 ERLANG/OTP学习 Day6
所有这些好东西都能在分布式环境里工作,这要归功于两个内置函数:term_to_binary (Term)和逆函数binary_to_term(Bin),后者用于恢复数据类型。在分布式系统里,binary_to_term(Bin)可以根据Bin里保存的数据类型外部表现形式来重 建任何数据类型。我们接收一个消息,打开名为mbox的文件,把消息写入这个文件,任务完成。FTP服务器、HTTP服务器或其他任何文件服务器的关键任务是把一个文件从服务器传送到客户端。即时通讯客户端的关键任务是接收一个消息并告知用户。
2023-08-28 23:31:41
62
1
原创 ERLANG/OTP学习 Day5
{Mod, Func, ArgList}定义监视器用于启动工作器的函数,将被用作apply(Mod, Fun, ArgList)的参数。这个行为用一个回调模块作为参数,里面指定了监 控策略以及如何启动监控树里的各个工作进程。在一对多监控里,如果任何一个工作器崩溃了,所有工作进程都会被终止(通过调用相 应回调模块里的terminate/2函数)然后重启。树的上级进程(监控器)监视着下级进程(工作器), 如果下级进程挂了就会重启它们。一对一监控树 在一对一监控里,如果某个工作器崩溃了,就会被监控器重启。
2023-08-26 00:14:01
76
原创 ERLANG/OTP学习 Day4
时间是已经发生的事情,在event_handler.erl中,发生一个事件,会发送一个event消息给注册进程,在这个过程中,发送消息后并不需要去关心它会如何去处理,只是把消息发送出去,告诉其他进程发生了什么,这种把事件转向事件接收器的进程叫做事件处理器。这样可以做到将事件的产生和处理分离开来,对于那些产生事件后并不处理时,可以不影响事件的产生。event_handler:add_handler(Name, Fun)执行这个方法,当事件X发生时,事件处理器就会去执行函数Fun(X)。
2023-08-24 23:20:47
78
1
原创 ERLANG/OTP学习 Day3
gen_server 接口方法,gen_server:start_link(local,Name),Mod,...)会启动一个本地的服务器,当{local,Name}中的local为global时,会启动一个可以被erlang节点集群访问的全局服务器,Mod参数时回调的模块名,gen_server:call(?回调函数handle info(Info,state)被用来处理发给服务器的自发性消息。gen_server:cast(Name,Msg)实现了一个播发 (cast),是一个是没有返回值的调用.
2023-08-24 00:04:54
68
1
原创 ERLANG/OTP学习 Day2
在erlang 的进程通信中,每次调用spawn都会得到一个新的进程标识符,用于唯一标识创建的子进程。这个标识符在后续的过程中可以向子进程发送消息,每个进程都有一个信箱,可以把外来的消息存放在信箱中,在进程检查信箱前的所有消息都会存放在这里。self()是向子进程发送自己的进程id,在ping()这个进程中收到run()的进程id后会向run()发送消息,当run()收到子进程的消息pong时得到结果,实现了进程间的相互通信。在运行时系统中的所有进程之间都是相互隔离的,每个进程的内不会与其他的进程共享。
2023-08-22 23:29:14
105
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人