您身边的网站建设专家
成功案例

【建站服务】庆阳400电话申请开通【庆阳企业网站建设】庆阳微信公众号小程序开发运营价格、庆阳微信公众号APP软件客户端设计运营、庆阳网页页面设计公司费用、庆阳公司网站制作方案流程改版维护大概需要多少钱

日期: 2022-09-20 15:50:20 浏览数:5


上往建站提供服务器空间服务商百度快照排名网站托管百度推广运营,致力于设计外包服务与源代码定制开发360推广搜狗推广,增加网站的能见度及访问量提升网络营销的效果,主营:网站公司,百度推广公司电话,官网搭建服务,网站服务企业排名,服务器空间,英文域名等业务,专业团队服务,效果好。


庆阳400电话申请开通【庆阳企业网站建设】庆阳微信公众号小程序开发运营价格、庆阳微信公众号APP软件客户端设计运营、庆阳网页页面设计公司费用、庆阳公司网站制作方案流程改版维护大概需要多少钱

网站建设.jpg

庆阳,习称“陇东”,是甘肃省辖地级市,甘肃的石油天然气化工基地、长庆油田主产区。截至2020年7月,辖1个区、7个县,总面积27119平方公里,总人口265万,常住人口227.88万人,城镇人口90.98万。

庆阳地处中国西部地区、甘肃省东部,东接陕西省的宜君、黄陵、富县、甘泉、志丹等县;北邻陕西省定边、吴起、志丹县及宁夏回族自治区盐池县;西与宁夏回族自治区固原市原州区、彭阳县、同心县接壤;南与甘肃省的泾川县及陕西的彬州市、长武、旬邑县相连。被誉为“红色圣地、岐黄故里、农耕之源、能源新都”,素有“陇东粮仓”的美称。 [1-2] 

庆阳市是是“环江翼龙”和“黄河古象”的故乡,中国“第一块旧石器”的出土地,中华民族早期农耕文明的发祥地之一,中医药文化的发祥地、中医鼻祖岐伯的出生地,甘肃的革命老区,长庆油田的发源地。

2019年,庆阳市完成生产总值742.94亿元,同比增长5.3%。 [3]  2020年,庆阳市实现地区生产总值754.73亿元,比2019年增长4.3%。

2.3.4 广义的Model数据层

领域层固然重要,但如果没有数据源层,领域层就是一个空中楼阁。

这里的Model层,不限于传统框架的Model层,即不应将Model层与数据库习惯性地绑定在一起。数据的来源可以是广泛的,可能来自数据库,或者来自简单的文件,可能来自第三方平台接口,也可能存放于内存。所以,PhalApi这里的Model层,则是广义上的数据源层,用于获取原始的业务数据,而不管来自何方,何种存储媒介。

我曾经在一家游戏公司任职时,就看到他们使用了文件来存放。相信,你也看到过。其次,在现在多客户端多系统的交互背景下,很多系统都需要进行数据共享和通信,为了提高服务器的性能也会使用到缓存。这些场景下,会导致数据是通过接口来获取,或者来源于缓存。可以看出,如果把数据源就看作是MySql,是非常局限的。

我们在PhalApi中继续使用了Model层,受MVC模式的影响,大家都对Model层非常熟悉,但可能会在潜意识中存在误解。再强调一次,PhalApi为Model层赋予了新的诠释和活力,其数据来源不局限于数据库,可以是通过开放平台接口获取的数据,也可以是不落地直接存放于缓存的数据,还可以是存储在其他媒介的数据。

更富表现力的Model层

Model层主要是关注技术层面的实现细节,以及需要考虑系统性能和海量数据存储等。如果数据来源于数据库,我们则需要考虑到数据库服务器的感受,保证不会有过载的请求而导致它“罢工”。对此,我们可以结合缓存来进行性能优化。

如,一般地:

// 版本1:简单的获取$model = new Model_User();
$rs = $model->getByUserId($userId);

这种是没有缓存的情况,当发现有性能问题并且需要通过添加缓存来解决时,可以这样调整:

// 版本2:使用缓存$key = 'userbaseinfo_' . $userId;
$rs = DI()->cache->get($key);if ($rs === NULL) {
    $rs = $model->getByUserId($userId);
    DI()->cache->set($key, $rs, 600);
}

但不建议在领域Domain层中引入缓存,因为会导致混淆Domain层的关注点,并且不便进行测试。更好是将技术层面的缓存机制处理移至Model层,保持数据获取的透明性:

<?phpclass Model_User extends PhalApi_Model_NotORM {    public function getByUserIdWithCache($userId) {
        $key = 'userbaseinfo_' . $userId;
        $rs = DI()->cache->get($key);        if ($rs === NULL) {
            $rs = $this->getByUserId($userId);
            DI()->cache->set($key, $rs, 600);
        }        return $rs;
    }

对应地,在Domain层的调用改为:

// 版本3:使用缓存 (缓存机制封装在Model层)$model = new Model_User();
$rs = $model->getByUserIdWithCache($userId);

至此,Model层对于上层如Domain来说,负责获取源数据,而不管此数据来自于数据库,还是远程接口,抑或是缓存包装下的数据。这正是我们使用数组在Model层和Domain层通讯的原因,因为数组更加通用,不需要额外添加实体。但如果项目有需要,也可以添加DTO这样的层级。

重量级数据获取的应对方案

纵使更富表现力的Model很好地封装了源数据的获取,但是仍然会遇到一些尴尬的问题。特别地,当我们大量地进行缓存读取判断时,会出现很多重复的代码,这样既不雅观也难以管理,甚至会出现一些简单的人为编写错误而导致的BUG。另外,当我们需要进行预览、调试或测试时,我们是不希望看到缓存的,即希望能够手工指定是否需要缓存。

这里再稍微简单回顾总结一下现在所面临的问题:我们希望通过缓存策略来优化Model层的源数据获取,特别当源数据获取的成本非常大时。但我们又希望我们可以轻易控制何时需要缓存,何时不需要,并且希望原有的代码能在OCP的原则下不需要修改,但又能很好地传递源数据获取的复杂参数。归纳一下,则可分为三点:缓存的控制、源数据的获取、复杂参数的传递。

不管是单点缓存,还是多级缓存,都希望使用原有已经注册的cache组件服务。所以,应该使用委托。委托的另一个好处在于使用外部依赖注入可以获得更好的测试性。

源数据的获取,作为源数据获取的主要过程和主要实现,需要进行缓存的控制(可细分为:是否允许读缓存、是否允许写缓存)、获取缓存的key值和有效时间,以及最终原始数据的获取。明显,这里应该使用模板方法,然后提供钩子函数给具体子类。

这里,我们提供了Model代理抽象类PhalApi_ModelProxy。之所以使用代理模式,是因为实际上并不一定会真正调用到最终源数据的获取,因为往往源数据的获取成本非常高,故而我们希望通过缓存来拦截数据的获取。

由于Model代理被上层的Domain领域层调用,但又依赖于下层Model层获得原始数据,所以处于Domain和Model之间。为了保持良好的项目代码层级,如果需要创建PhalApi_ModelProxy子类,建议新建一个ModelProxy目录。


庆阳400电话申请开通庆阳企业网站建设庆阳微信公众号小程序开发运营价格、庆阳微信公众号APP软件客户端设计运营、庆阳网页页面设计公司费用、庆阳公司网站制作方案流程改版维护大概需要多少钱


上往建站提供搭建网站域名注册官网备案服务网店详情页设计企业网店专业网络店铺管理运营全托管公司咨询电话,服务器空间,微信公众号托管网页美工排版,致力于域名申请竞价托管软文推广全网营销,提供标准级专业技术保障,了却后顾之忧,主营:虚拟主机网站推广百度竞价托管网站建设上网建站推广服务网络公司有哪些等业务,专业团队服务,效果好。

服务热线:400-111-6878 手机微信同号:18118153152(各城市商务人员可上门服务)


全国咨询热线:400-111-6878

地址:全国各地都有驻点商务

Copyright © 2021 通陆科技

网站建设上往建站