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

上往建站提供服务器空间服务商,百度快照排名,网站托管,百度推广运营,致力于设计外包服务与源代码定制开发,360推广,搜狗推广,增加网站的能见度及访问量提升网络营销的效果,主营:网站公司,百度推广公司电话,官网搭建服务,网站服务企业排名,服务器空间,英文域名等业务,专业团队服务,效果好。
庆阳400电话申请开通【庆阳企业网站建设】庆阳微信公众号小程序开发运营价格、庆阳微信公众号APP软件客户端设计运营、庆阳网页页面设计公司费用、庆阳公司网站制作方案流程改版维护大概需要多少钱

庆阳,习称“陇东”,是甘肃省辖地级市,甘肃的石油天然气化工基地、长庆油田主产区。截至2020年7月,辖1个区、7个县,总面积27119平方公里,总人口265万,常住人口227.88万人,城镇人口90.98万。
庆阳地处中国西部地区、甘肃省东部,东接陕西省的宜君、黄陵、富县、甘泉、志丹等县;北邻陕西省定边、吴起、志丹县及宁夏回族自治区盐池县;西与宁夏回族自治区固原市原州区、彭阳县、同心县接壤;南与甘肃省的泾川县及陕西的彬州市、长武、旬邑县相连。被誉为“红色圣地、岐黄故里、农耕之源、能源新都”,素有“陇东粮仓”的美称。 [1-2]
庆阳市是是“环江翼龙”和“黄河古象”的故乡,中国“第一块旧石器”的出土地,中华民族早期农耕文明的发祥地之一,中医药文化的发祥地、中医鼻祖岐伯的出生地,甘肃的革命老区,长庆油田的发源地。
2019年,庆阳市完成生产总值742.94亿元,同比增长5.3%。 [3] 2020年,庆阳市实现地区生产总值754.73亿元,比2019年增长4.3%。
领域层固然重要,但如果没有数据源层,领域层就是一个空中楼阁。
这里的Model层,不限于传统框架的Model层,即不应将Model层与数据库习惯性地绑定在一起。数据的来源可以是广泛的,可能来自数据库,或者来自简单的文件,可能来自第三方平台接口,也可能存放于内存。所以,PhalApi这里的Model层,则是广义上的数据源层,用于获取原始的业务数据,而不管来自何方,何种存储媒介。
我曾经在一家游戏公司任职时,就看到他们使用了文件来存放。相信,你也看到过。其次,在现在多客户端多系统的交互背景下,很多系统都需要进行数据共享和通信,为了提高服务器的性能也会使用到缓存。这些场景下,会导致数据是通过接口来获取,或者来源于缓存。可以看出,如果把数据源就看作是MySql,是非常局限的。
我们在PhalApi中继续使用了Model层,受MVC模式的影响,大家都对Model层非常熟悉,但可能会在潜意识中存在误解。再强调一次,PhalApi为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(各城市商务人员可上门服务)