0

我有一个应用程序,它根据predefined URLs以下方式路由请求:

第一步:缓存查找
所有的URLS都聚合成一个array(序列化并存储在缓存中),其结构如下:

  • 每个array key代表一个URL
  • URL信息(即如何处理URL)被定义为对应的array value

在实践中,这给了我(仅供参考的PHP 5.4数组语法):

<?php

// structure of the cached URLS array
$cached_urls = [
    '/pageA' => [
        'controller' => 'ProductController',
        'content_id' => 1234
    ],
    '/serviceA' => [
        'controller' => 'ServiceController',
        'content_id' => 45678
    ]
];

// working with the array (retrieve $cached_urls from cache, then...)
if (!isset($cached_urls[$request['url']])) {
    // 404
} else {
    $url = $cached_urls[$request['url']];
    // further actions based on $url
}

第二步:
如果$cached_urls无法从缓存中检索到数组,则进行数据库查找和缓存重建我会做 3 件事:

  • 从表中检索URL信息url(其中每个row代表1 URLURL本身是用于过滤查询的字段)和其他相关表。
  • 处理请求的方式与在缓存场景中处理请求的方式相同$url
  • 重建缓存,以便下次请求进入时,我不必进行数据库查找,

在执行速度方面,这是我们所拥有的(从快到慢):

  1. 缓存查找(~10ms)
  2. 数据库查找(~100ms)
  3. 重建缓存(~2000ms)

当缓存可用时,页面的服务速度非常快,但是每次重建缓存时(大约每分钟),页面需要几秒钟才能提供服务,这是一个问题。因此我想知道:

PHP中有哪些设计模式可用于执行异步处理(在我的情况下将用于重建缓存)同时避免同时执行多次相同的任务(因为我只需要一次重建缓存一次直到它被重建,而不是同时击中我的应用程序的每个请求)?

4

1 回答 1

0

在更新内容的过程中更新缓存(即:您的管理面板/cms/其他)。对于站点管理员来说,2 秒的等待是完全可以接受的。

于 2012-10-10T09:15:09.737 回答