Sử dụng cache khi bạn có thể?

slide-1-728

Cache tại sao không?

Các  developer chắc ai cũng biết đến cache và cũng ít nhiều đã sử dụng cache trong hệ thống của mình. Hôm nay tôi xin giới thiệu qua về cache cụ thể cache trong CakePHP .

Nói đến cache mọi người sẽ nghĩ ngay cache có tác dụng gì ? và tại sao tôi nên dùng cache.

Khi  bạn có một server với cấu hình hạn chế mà lượng người dùng truy cập vào hệ thống của bạn ngày càng tăng làm server của bạn luôn bị quá tải và không đáp ứng được nhu cầu người dùng . Ngoài suy nghĩ  nâng cấp hệ thống server thì điều đầu tiên và ít tốn kém nhất bạn nên nghĩ đến đó là CACHE. Cache làm cho ứng dụng của bạn load nhanh hơn do các xử lý trước đó đã được lưu lại và làm cho hệ thống server của bạn chạy nhẹ nhàng hơn . Đó chính là tác dụng và lý do tại sao bạn nên dùng Cache .

 

Vậy dùng cache khi nào và lúc nào thì hiệu quả ?

Dùng cache khi bạn thấy một nội dung nào đó sẽ không thay đổi trong một khoảng thời gian nhất định. Chẳng hạn một bài báo nội dung của nó sẽ không bao giờ thay đổi đến khi nào người biên tập thay đổi nó, hay cấu trúc dữ liệu của một bảng sẽ không thay đổi nếu như bạn không thêm hoặc xóa trường dữ liệu của bảng đó , những dữ liệu này bạn nên cache lại để tăng tốc độ load ứng dụng và giảm xử lý cho hệ thống của bạn .

 

Có những loại cache nào?

Có rất nhiều loại cache nhưng mình xin nói đến cache được sử dụng trong CakePHP Framework

  1. File Cache : Dữ liệu cần Cache được lưu thành File đặt trên hệ thống server của bạn
  2. Memcache : Dữ liệu cần cache được lưu vào RAM  trên hệ thống server của bạn và được lưu dưới dạng key,value
  3. APCCache : Apc là một extension của PHP, dữ liệu cache cũng được lưu trên Memory của webserver giống như Memcache
  4. Wincache : cũng giống như Apc là một extension của PHP nhưng được cài tiến chủ yếu dùng cho Windows và IIS server
  5. XcacheEngine : Giống APC là một extension của PHP
  6. RedisEngine : Sử dụng PHPredis extension để kết nối  trong PHP, cơ chế cache giống như Memache nhưng Redis hỗ trợ cả cache trên Memory và File cache . Nếu như với Memcache dữ liệu sẽ bị mất khi server khởi động lại thì với Redis dữ liệu được lưu cả trên ổ cứng khi server chẳng may bị khởi động lại thì sau khi khởi động xong dữ liệu lưu trên redis sẽ được nạp lại vào Memory từ dữ liệu File cache (Redis còn được gọi là một hệ thống persistant Cache) .

 

Sử dụng Cache trên CakePHP như thế nào ?

Mình lấy ví dụ luôn trên trang Insights Screen mình mới thực hiện của dữ án Pyxis

Giới thiệu qua về trang Insights : Trang Insights là trang report thông tin về các Page Facebook dữ liệu được lấy và hiện thị giống như trang Insights của Facebook . Bên trái của trang sẽ hiển thị danh sách các Page theo Profile , bên phải hiển thị report của từng Page
Mình nhận thấy rằng danh sách các Page sẽ không có thay đổi trong vòng 48h hoặc nếu có thay đổi trong vòng 48h thì dữ liệu report của page đó chắc chắn sẽ không có dữ liệu do vậy mình đã cache phần dữ liệu này lại , dưới đây là đoạn code :

            Cache::set(array('duration' => '+2 days'));
            $listFbPages = Cache::read('listFbPages_' . $profileId);
            if ($listFbPages === FALSE) {
                $urlGetPageInfo = CommonConst::$FACEBOOK_API_URL.$this->profile[0]['profiles']['facebook_ad_account_id'].PARAM_NAME_CONNECTION_OBJECT.PARAM_NAME_DATA_FORMAT."U&".PARAM_NAME_METHOD."get&".CommonConst::$PARAM_NAME_ACCESS_TOKEN.$this->profile[0][0]['access_token'];
                $pageInfos = json_decode(CurlUtil::singleSend($urlGetPageInfo));
                $listFbPages = array();
                if (!empty($pageInfos)) {
                    foreach ($pageInfos->data as $pageInfo) {
                        // Only show FB page and Place
                        if ($pageInfo->type === 1 || $pageInfo->type === 6) {
                            $listFbPages[$pageInfo->id] = $pageInfo->name;
                        }
                    }
                }
                Cache::write('listFbPages_' . $profileId, $listFbPages);
            }

Tiếp theo đó mình thấy rằng dữ liệu Total Page Like và Like in the Week sẽ không thay đổi trong vòng 1 ngày nên mình cũng sẽ cache dữ liệu này lại :

Cache::set(array('duration' => '+2 days'));
$totalPageLike = Cache::read('totalPageLike_' . $profileId);
$pageOfWeek = Cache::read('pageOfWeek_' . $profileId);
if($totalPageLike === FALSE && $pageOfWeek === FALSE){
    $dataTotalLikeRows = $pageReportModel->find('all', array('conditions' => array('PageReport.page_id' => $page_id, 'PageReport.report_date >= ' . $startTimeofWeek, 'PageReport.report_date >= ' . $currentDateTimeofWeek, 'PageReport.profile_id' => $this->getProfileId()), 'order' => 'PageReport.page_reportid ASC',));
    if (!empty($dataTotalLikeRows)) {
            foreach ($dataTotalLikeRows as $dataTotalLikeRow) {
                    if ($dataTotalLikeRow['PageReport']['page_fans'] != '')
                            $totalPageLike[] = $dataTotalLikeRow['PageReport']['page_fans'];
                    else {
                            if (count($totalPageLike) > 0)
                                    $totalPageLike[] = array_pop($totalPageLike);
                            else
                                    $totalPageLike[] = 0;
                    }
                    Cache::write('totalPageLike_' . $profileId, $totalPageLike);
                    if ($dataTotalLikeRow['PageReport']['report_date'] > $finishTimeOfLastWeek)
                            $pageOfWeek[] = $dataTotalLikeRow['PageReport']['page_fan_adds_unique'];
                    Cache::write('pageOfWeek_' . $profileId, $pageOfWeek);
                    }
    }
}

Còn dữ liệu report là dữ liệu được lấy theo Time range nên việc thực hiện cache sẽ cần phải tính toán nhiều hơn, chẳng hạn nếu thực hiện cache trong trường hợp này thì chúng ta phải thực hiện cache report của từng ngày , và lưu trữ danh sách những ngày này vào một mảng để tiện query, nhưng vì cache dữ liệu của một ngày nên thư mục tmp/caches sẽ có rất nhiều file nếu số lượng file cache quá lớn cũng sẽ ảnh hướng đến tốc độ của hệ thống vì vậy chúng ta cần phải chia những file cache này vào những thư mục nhỏ hơn (Nếu sử dụng memcache thì không cần phải làm thao tác này – Performance tốt nhất thì Memcache có thể lưu được 4 triệu Key) .  Đối với dữ liệu cache theo từng ngày(Trong trường hợp của Insights Screen) dữ liệu này sẽ không bao giờ thay đổi nên bạn có thể cache đến bất cứ thời gian nào bạn muốn .

Đây là một vài thông tin cơ bản về cache hi vọng sẽ khơi lại có mọi người ý tưởng về việc sử dụng cache giúp cho dự án Pyxis phát triển tốt hơn, tốc độ load trang nhanh hơn.

Add a Comment

Scroll Up