OPT(erlang)打造一套缓存系统(一)

缓存的设计

这个简易缓存存储的是键/值对,其中键与键之间不得重复,并且每个键只能映射到一个值。这个设计背后的核心思想是为写人缓存的每一个值都分配一个独立的存储进程再将对应的键映射至该进程。你可能会对这种为每个值分配一个进程的设计感到惊讶,甚至觉得不可思议;但对缓存这类服务而言,这个设计是合理的,因为缓存中的值相互独立,各有各的生命周期。同时,Erlang本身对大量轻量级进程提供了良好的支持,使得这种设计成为可能。
为了搭建这个缓存,我们得先建立一些基本的子系统,其中每个子系统都是一个独立的模块。

我们一共需要创建5个模块,
用户只能通过simple_cache API模块与缓存服务交互。该模块直接与sc_store模块和sc_element模块通信,前者负责维护键和进程间的映射关系,后者负责存储进程的创建、更新和删除。所有存储进程都受sc_sup监督进程监督,除此之外,还有一个负责整个缓存系统的启动和停止的应用行为模式模块sc_app。让我们从进程和数据流的角度展示了该架构。

在处理运行时的键/值对插入操作时,监督进程会按需派生sc_element进程。派生出来的进程会记住与给定的键相关联的值,随后,sc_store会记录下该键与该进程ID间的映射关系。键/值之间的映射关系就这样建立起来了。要获取与指定的键相关联的值,首先应该查找与键相关联的存储进程的D,然后再向该进程查询当前持有的值便可。
 

创建OTP应用的基本骨架

1.应用目录结构的布局

首先新建一个名为simple_cache的顶层应用目录。在该目录下,新建doc、ebin、include、priv和src等子目录。

2.创建应用元数据

在启动应用或在执行运行时代码热升级时,OTP需要了解一些用于描述应用自身的元数据。存放元数据的.app文件的文件名应该与应用名相匹配(但无须采用特定模块的名字),在这个例子中,该文件就是ebin/simple_cache.app。

.app文件当前内容如下

{application,simple_cache,
[fdescription,"A simple caching system"},
{vsn, "0.1.0"},
{modules,[sc_app,sc_sup]},{registered,[sc_sup] } ,
{applications,[kernel, stdlib]},
{mod, {sc_app. []}}
]}.

3.实现应用行为模式

应用行为模式的实现位于文件src/sc_app.erl内,需要注意的是,.app文件中的mod元组给出了应用行为模式模块的模块名,系统就是从这里得知应该从何处启动和停止应用的。

-module(sc_app) .
-behaviour(application).
-export ([start/2, stop/1] ) .
start(_StartType, _StartArgs)->case sc_sup:start_link()of{ ok, Pid} ->{ ok,Pid};other ->{error, other}
end.
stop(_state) ->ok.

sc_app模块唯一的任务就是在应用启动时启动根监督者,在应用停止时则什么也不用做。

4.实现监督者

根监督者在文件src/sc_sup.erl中实。我们没有给这个监督者静态指派任何永久子进程,但却可以给它动态添加任意多个同类型的临时子进程。

-module(sc_sup) .
-behaviour(supervisor) .
-export([start_link /0,start_child/2]).
-export([init/1] ).
-define(SERVER,?MODULE).
start_link()->supervisor:start_link({local,?SERVER},?MODULE,[]).
start_child (Value,LeaseTime) ->supervisor:start_child ( ?SERVER,[Value,LeaseTime]).
init([])->Element = {sc__element,{sc_element,start_link,[]},temporary, brutal_kill, worker, [sc_element]},Children = [Element] ,Restartstrategy = { simple_one_for_one,0, 1},{ok,{Restartstrategy,Children }} .
1.简易一对一监督

该监督者的监督策略被设定为simple_one_for_one(简易一对一监督)。采用one_for_one等其他重启策略时,监督者一般需要同时管理多个与自己同时启动的子进程,通常这些子进程的生命周期也与监督者相同。simple_one_for_one型监督者只能启动一种子进程,但却可以启动任意多个。它所有的子进程都是运行时动态添加的,监督者本身在启动时不会启动任何子进程。
观察代码中的监督者模块,现在却只能有一个: simple_.one_for_one型监督者的init/1必须指定一种且仅一种子进程,但子进程并不会随监督者一同启动。不过,你随时可以通过调用简化版supervisor:start_child/2函数,令监督者启动新的子进程。其他类型的监督者在动态添加子进程时,必须将完整的子进程规范传递给start_child/2。但对于simple_one_for_one型监督者而言,由于所有子进程都遵循同一套已知的子进程规范,我们只需要说一声“再来一份”就可以了。这套机制恰恰可以满足我们当前的需求。

2.监督者模块

sc_sup模块有两个API函数,启动一个新的子进程,并将value和LeaseTime参数传给子进程的人口函数(因为每个子进程的这两个参数各不相同)。将这些逻辑组织成一个API函数将更有利于模块中实现细节的封装。

调用start_child/2 API函数时,当前进程会向监督进程发送一条消息,令它以value和LeaseTime为参数调用sc_element模块的start_link函数,进而启动一个新的子进程。子进程规范中的元组

{sc_element, start_link,[]}

给定了模块名、函数名和子进程启动函数的参数,调用start_link之前,列表[value,LeaseTime]将被并人参数列表[],从而形成最终的函数调用sc_element:start_link(value,LeaseTime)。

每调用一次sc_sup:start_child/2,就会新启动一个带有自己的值和淘汰时间的sc_element进程。这就形成了一棵动态生成的监督树。

至此,一个可运行的应用骨架就搭建完毕了。你可以从Erlang shell中启动它并观察它的运作情况。当然,目前除了启动和停止应用以外你还什么都做不了,因为应用的实际功能和用户接口都还没有实现。由于采用了simple_one_for_one型监督策略,监督者在启动时不会启动任何子进程;此外,由于sc_element尚未实现,调用sc_sup:start_child/2会触发运行时错误。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/625507.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20240114-寻找零损失或一损失的玩家

题目要求 给定一个整数数组 matches,其中 matches[i] [winneri, Loseri] 表示玩家 Winneri 在一场比赛中击败了玩家 Loseri。 返回大小为 2 的列表答案,其中: answer[0] 是所有未输掉任何比赛的玩家的列表。answer[1] 是仅输掉一场比赛的…

京东年度数据报告-2023全年度笔记本十大热门品牌销量(销额)榜单

2023年度,在电脑办公市场整体销售下滑的环境下,笔记本市场的整体销售也不景气。 根据鲸参谋平台的数据显示,京东平台上笔记本的年度销量为650万,同比下滑约16%;销售额约为330亿,同比下滑约19%。同时&#…

71.网游逆向分析与插件开发-角色数据的获取-修复角色名与等级显示问题

内容参考于:易道云信息技术研究院VIP课 上一个内容:自动化助手UI显示角色数据-CSDN博客 码云地址(ui显示角色数据 分支):https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号:0049452c079867779…

微软Office 2021 批量许可版

软件介绍 微软办公软件套件Microsoft Office LTSC 2021 专业增强版2024年1月批量许可版更新推送!Office2021正式版和Windows11系统同时于2021年10月份正式推出,Office LTSC 2021相比 Office2019正式版变化不太,最主要强化了LOGO设计趋势&…

电商物流查询:未来的发展方向

在电商日益繁荣的时代,物流信息查询不仅关乎消费者体验,更影响着电商运营的效率。快速、准确地追踪物流信息至关重要。本文将简述物流信息快速追踪的价值,并重点介绍固乔快递查询助手这一高效查询工具及其批量查询功能。 一、物流信息快速追踪…

arcgis javascript api4.x加载天地图wgs84(wkid:4326)坐标系

需求: 使用arcgis javascript api4.x以basetilelayer方式加载天地图wgs84(wkid:4326)坐标系 效果: 代码: 提示:(下述三个文件放同一个文件夹下) 4326.js define([ex…

python毕设选题 - 基于时间序列的股票预测于分析

文章目录 1 简介2 时间序列的由来2.1 四种模型的名称: 3 数据预览4 理论公式4.1 协方差4.2 相关系数4.3 scikit-learn计算相关性 5 金融数据的时序分析5.1 数据概况5.2 序列变化情况计算 最后 1 简介 Hi,大家好,今天向大家介绍一个大数据项目…

QTday6作业

思维导图: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QSqlDatabase>//数据库管理类 #include <QSqlQuery>//执行sql语句类 #include <QSqlRecord>//数据库记录类 #include <QSqlError>//数据库错误类 #include …

使用ChatGPT对进行论文改写与润色

一、内容改写 关键在于明确改写的具体要求。 例如:[论文内容] 可以指明需要提升该段落的流畅性和逻辑连贯性。 常用指令 细微调整文本 轻微编辑 重写以增强表述清晰度 简化句式 校正语法和拼写错误 提升文本的流畅性和条理性 优化词汇使用 调整文本风格 进行深度编辑…

leetcode 17 电话号码字母组合

题目 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a;digits “23” 输出&#xf…

2024年烟花爆竹储存证考试题库及烟花爆竹储存试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年烟花爆竹储存证考试题库及烟花爆竹储存试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大纲随机…

实践学习PaddleScience飞桨科学工具包

实践学习PaddleScience飞桨科学工具包 动手实践&#xff0c;在实践中学习&#xff01;本项目可以在AIStudio平台一键运行&#xff01;地址&#xff1a;https://aistudio.baidu.com/projectdetail/4278591 本项目第一次执行会报错&#xff0c;再执行一次即可。若碰到莫名其妙的…

数据可视化大屏自适应,保持比例不变形,满足不同分辨率的需求——利用transform的scale属性缩放,缩放整个页面。

文章目录 一、需求背景&#xff1a;二、需求分析&#xff1a;三、选择方案&#xff1a;四、实现代码&#xff1a;五、效果预览&#xff1a;六、封装组件&#xff1a; 一、需求背景&#xff1a; 数据可视化大屏是一种将数据、信息和可视化效果集中展示在一块或多块大屏幕上的技…

2020年财政收支

偶感兴趣&#xff0c;花了点时间整理 有兴趣的可以参照下面的链接整理完整2022年的数据&#xff0c;2023年的数据还有12月份的数据未出&#xff0c;估计在这几天出。 附 2022年的财政收支情况 2022年基金支出预算表 2020年的社保收入是7.6万亿。 上图个税金额写错了&#xff0c…

Mindspore 公开课 - CodeGeeX

CodeGeeX: 多语言代码生成模型 CodeGeeX 是一个具有130亿参数的多编程语言代码生成预训练模型。CodeGeeX采用华为MindSpore框架实现&#xff0c;在鹏城实验室“鹏城云脑II”中的192个节点&#xff08;共1536个国产昇腾910 AI处理器&#xff09;上训练而成。截至2022年6月22日&…

数据库结构文档生成方法二(EZDML)

EZDML 下载链接&#xff1a;EZDML - 下载 我们常用的是数据建模有PowerDesigner,EZDML也是一款数据建模工具&#xff0c;而且功能很多&#xff0c;除了生成sql&#xff0c;还可以生成前端后端代码等等。 我们直接下载最新版后点击安装&#xff0c;打开后会默认打开示例&#…

基于springboot数码论坛系统源码和论文

网络的广泛应用给生活带来了十分的便利。所以把数码论坛与现在网络相结合&#xff0c;利用java技术建设数码论坛系统&#xff0c;实现数码论坛的信息化。则对于进一步提高数码论坛发展&#xff0c;丰富数码论坛经验能起到不少的促进作用。 数码论坛系统能够通过互联网得到广泛…

window系统安装MySQL -- MySQL(1)

第一步&#xff1a; 下载mysql安装包 1&#xff09;打开MySQL官方链接&#xff1a;https://www.mysql.com 2&#xff09;选择 DOWNLOADS 3&#xff09;往下滑&#xff0c;点击社区版本下载 4&#xff09;点击 MySQL installer for Windows 5&#xff09;点击安装 第二步&#…

2024年腾讯云服务器购买价格,真便宜

腾讯云服务器租用价格表&#xff1a;轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;2核4G5M带宽756元三年、轻量4核8G12M服务器446元一年、646元15个月&#xff0c;云服务器CVM S5实例2核2G配置280.8元一年…

细说JavaScript对象(JavaScript对象详解)

在JavaScript中对象作为数据类型之一&#xff0c;它的数据结构区别于其余5中数据类型&#xff0c;从数据结构角度看对象就是数据值的几个&#xff0c;其书就结构就是若干组名值对&#xff0c;类似于其他语言中的哈希、散列 关联数组等&#xff0c;但对象在JavaScript中不仅仅扮…