From 3a82ff28601d66d443f3b99d0504d35a44712ee5 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sat, 22 Nov 2008 07:41:51 -0500 Subject: [PATCH] double-cache to get newer items darcs-hash:20081122124151-84dde-3e942c9ab172444bd28afb84a452b8bfb5e3574a.gz --- classes/Notice.php | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/classes/Notice.php b/classes/Notice.php index 21b676ba34..fdce77c055 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -299,6 +299,9 @@ class Notice extends Memcached_DataObject return $notice; } + # XXX: this is pretty long and should probably be broken up into + # some helper functions + static function getCachedStream($qry, $cachekey, $offset, $limit, $order) { # If outside our cache window, just go to the DB @@ -326,6 +329,46 @@ class Notice extends Memcached_DataObject return $wrapper; } + # If the cache was invalidated because of new data being + # added, we can try and just get the new stuff. We keep an additional + # copy of the data at the key + ';last' + + # No cache hit. Try to get the *last* cached version + + $last_notices = $cache->get(common_cache_key($cachekey) . ';last'); + + if ($last_notices) { + + # Reverse-chron order, so last ID is last. + + $last_id = $last_notices[0]->id; + + # XXX: this assumes monotonically increasing IDs; a fair + # bet with our DB. + + $new_notice = Notice::getStreamDirect($qry, 0, NOTICE_CACHE_WINDOW, + $last_id, NULL, $order); + + if ($new_notice) { + $new_notices = array(); + while ($new_notice->fetch()) { + $new_notices[] = clone($new_notice); + } + $new_notice->free(); + $notices = array_slice(array_merge($new_notices, $last_notices), + 0, NOTICE_CACHE_WINDOW); + + # Store the array in the cache for next time + + $result = $cache->set(common_cache_key($cachekey), $notices); + $result = $cache->set(common_cache_key($cachekey) . ';last', $notices); + + # return a wrapper of the array for use now + + return new NoticeWrapper(array_slice($notices, $offset, $limit)); + } + } + # Otherwise, get the full cache window out of the DB $notice = Notice::getStreamDirect($qry, 0, NOTICE_CACHE_WINDOW, NULL, NULL, $order); @@ -344,9 +387,12 @@ class Notice extends Memcached_DataObject $notices[] = clone($notice); } + $notice->free(); + # Store the array in the cache for next time $result = $cache->set(common_cache_key($cachekey), $notices); + $result = $cache->set(common_cache_key($cachekey) . ';last', $notices); # return a wrapper of the array for use now