summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvan Prodromou <evan@prodromou.name>2008-11-22 07:41:51 -0500
committerEvan Prodromou <evan@prodromou.name>2008-11-22 07:41:51 -0500
commit3a82ff28601d66d443f3b99d0504d35a44712ee5 (patch)
treedfdc9da6a163c2b0dc5186839a05fa825803b654
parenta730ad708c0e036691e26687cc7ec41d57c6db40 (diff)
double-cache to get newer items
darcs-hash:20081122124151-84dde-3e942c9ab172444bd28afb84a452b8bfb5e3574a.gz
-rw-r--r--classes/Notice.php46
1 files changed, 46 insertions, 0 deletions
diff --git a/classes/Notice.php b/classes/Notice.php
index 21b676ba3..fdce77c05 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