Move algorithm for caching to Notice class
Moved the algorithm for notice stream caching to the Notice class.
This commit is contained in:
parent
f8c34711b4
commit
10ef8a2f71
|
@ -967,4 +967,59 @@ class Notice extends Memcached_DataObject
|
||||||
array('notice' => $this->id));
|
array('notice' => $this->id));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function stream($fn, $args, $cachekey, $offset=0, $limit=20, $since_id=0, $before_id=0, $since=null)
|
||||||
|
{
|
||||||
|
$cache = common_memcache();
|
||||||
|
|
||||||
|
if (empty($cache) ||
|
||||||
|
$since_id != 0 || $before_id != 0 || !is_null($since) ||
|
||||||
|
($offset + $limit) > NOTICE_CACHE_WINDOW) {
|
||||||
|
return call_user_func_array($fn, array_merge($args, array($offset, $limit, $since_id,
|
||||||
|
$before_id, $since)));
|
||||||
|
}
|
||||||
|
|
||||||
|
$idkey = common_cache_key($cachekey);
|
||||||
|
|
||||||
|
$idstr = $cache->get($idkey);
|
||||||
|
|
||||||
|
if (!empty($idstr)) {
|
||||||
|
// Cache hit! Woohoo!
|
||||||
|
$window = explode(',', $idstr);
|
||||||
|
$ids = array_slice($window, $offset, $limit);
|
||||||
|
return $ids;
|
||||||
|
}
|
||||||
|
|
||||||
|
$laststr = common_cache_key($idkey.';last');
|
||||||
|
|
||||||
|
if (!empty($laststr)) {
|
||||||
|
$window = explode(',', $laststr);
|
||||||
|
$last_id = $window[0];
|
||||||
|
$new_ids = call_user_func_array($fn, array_merge($args, array(0, NOTICE_CACHE_WINDOW,
|
||||||
|
$last_id, 0, null)));
|
||||||
|
|
||||||
|
$new_window = array_merge($new_ids, $window);
|
||||||
|
|
||||||
|
$new_windowstr = implode(',', $new_window);
|
||||||
|
|
||||||
|
$result = $cache->set($idkey, $new_windowstr);
|
||||||
|
$result = $cache->set($idkey . ';last', $new_windowstr);
|
||||||
|
|
||||||
|
$ids = array_slice($new_window, $offset, $limit);
|
||||||
|
|
||||||
|
return $ids;
|
||||||
|
}
|
||||||
|
|
||||||
|
$window = call_user_func_array($fn, array_merge($args, array(0, NOTICE_CACHE_WINDOW,
|
||||||
|
0, 0, null)));
|
||||||
|
|
||||||
|
$windowstr = implode(',', $new_window);
|
||||||
|
|
||||||
|
$result = $cache->set($idkey, $windowstr);
|
||||||
|
$result = $cache->set($idkey . ';last', $windowstr);
|
||||||
|
|
||||||
|
$ids = array_slice($window, $offset, $limit);
|
||||||
|
|
||||||
|
return $ids;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,58 +43,12 @@ class Notice_inbox extends Memcached_DataObject
|
||||||
/* the code above is auto generated do not remove the tag below */
|
/* the code above is auto generated do not remove the tag below */
|
||||||
###END_AUTOCODE
|
###END_AUTOCODE
|
||||||
|
|
||||||
function stream($user_id, $offset=0, $limit=20, $since_id=0, $before_id=0, $since=null)
|
function stream($user_id, $offset, $limit, $since_id, $before_id, $since)
|
||||||
{
|
{
|
||||||
$cache = common_memcache();
|
return Notice::stream(array('Notice_inbox', '_streamDirect'),
|
||||||
|
array($user_id),
|
||||||
if (empty($cache) ||
|
'notice_inbox:by_user:'.$user_id,
|
||||||
$since_id != 0 || $before_id != 0 || !is_null($since) ||
|
$offset, $limit, $since_id, $before_id, $since);
|
||||||
($offset + $limit) > INBOX_CACHE_WINDOW) {
|
|
||||||
return Notice_inbox::_streamDirect($user_id, $offset, $limit, $since_id, $before_id, $since);
|
|
||||||
}
|
|
||||||
|
|
||||||
$idkey = common_cache_key('notice_inbox:by_user:'.$user_id);
|
|
||||||
|
|
||||||
$idstr = $cache->get($idkey);
|
|
||||||
|
|
||||||
if (!empty($idstr)) {
|
|
||||||
// Cache hit! Woohoo!
|
|
||||||
$window = explode(',', $idstr);
|
|
||||||
$ids = array_slice($window, $offset, $limit);
|
|
||||||
return $ids;
|
|
||||||
}
|
|
||||||
|
|
||||||
$laststr = common_cache_key($idkey.';last');
|
|
||||||
|
|
||||||
if (!empty($laststr)) {
|
|
||||||
$window = explode(',', $laststr);
|
|
||||||
$last_id = $window[0];
|
|
||||||
$new_ids = Notice_inbox::_streamDirect($user_id, 0, INBOX_CACHE_WINDOW,
|
|
||||||
$last_id, null, null);
|
|
||||||
|
|
||||||
$new_window = array_merge($new_ids, $window);
|
|
||||||
|
|
||||||
$new_windowstr = implode(',', $new_window);
|
|
||||||
|
|
||||||
$result = $cache->set($idkey, $new_windowstr);
|
|
||||||
$result = $cache->set($idkey . ';last', $new_windowstr);
|
|
||||||
|
|
||||||
$ids = array_slice($new_window, $offset, $limit);
|
|
||||||
|
|
||||||
return $ids;
|
|
||||||
}
|
|
||||||
|
|
||||||
$window = Notice_inbox::_streamDirect($user_id, 0, INBOX_CACHE_WINDOW,
|
|
||||||
null, null, null);
|
|
||||||
|
|
||||||
$windowstr = implode(',', $new_window);
|
|
||||||
|
|
||||||
$result = $cache->set($idkey, $windowstr);
|
|
||||||
$result = $cache->set($idkey . ';last', $windowstr);
|
|
||||||
|
|
||||||
$ids = array_slice($window, $offset, $limit);
|
|
||||||
|
|
||||||
return $ids;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function _streamDirect($user_id, $offset, $limit, $since_id, $before_id, $since)
|
function _streamDirect($user_id, $offset, $limit, $since_id, $before_id, $since)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user