diff options
author | Evan Prodromou <evan@status.net> | 2010-12-11 11:00:04 -0500 |
---|---|---|
committer | Evan Prodromou <evan@status.net> | 2010-12-11 11:00:04 -0500 |
commit | d0ea138888cbc5de30f2c9a52a771921efa9fdc1 (patch) | |
tree | bc96b66956cdb8bbe745592b20a06d603ff96ba5 /classes | |
parent | 7285bbc93b5394a16731e498b62188ea847de38d (diff) |
cache stream of subscriptions
Diffstat (limited to 'classes')
-rw-r--r-- | classes/Subscription.php | 91 |
1 files changed, 89 insertions, 2 deletions
diff --git a/classes/Subscription.php b/classes/Subscription.php index a4764e9f1..763e3835b 100644 --- a/classes/Subscription.php +++ b/classes/Subscription.php @@ -26,6 +26,8 @@ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; class Subscription extends Memcached_DataObject { + const CACHE_WINDOW = 201; + ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -91,6 +93,9 @@ class Subscription extends Memcached_DataObject self::blow('user:notices_with_friends:%d', $subscriber->id); + self::blow('subscription:by-subscriber:'.$subscriber->id); + self::blow('subscription:by-subscribed:'.$other->id); + $subscriber->blowSubscriptionCount(); $other->blowSubscriberCount(); @@ -220,6 +225,9 @@ class Subscription extends Memcached_DataObject self::blow('user:notices_with_friends:%d', $subscriber->id); + self::blow('subscription:by-subscriber:'.$subscriber->id); + self::blow('subscription:by-subscribed:'.$other->id); + $subscriber->blowSubscriptionCount(); $other->blowSubscriberCount(); @@ -283,6 +291,29 @@ class Subscription extends Memcached_DataObject $offset = 0, $limit = PROFILES_PER_PAGE) { + if ($offset + $limit > self::CACHE_WINDOW) { + return new ArrayWrapper(self::realBySubscriber($subscriberId, + $offset, + $limit)); + } else { + $key = 'subscription:by-subscriber:'.$subscriberId; + $window = self::cacheGet($key); + if ($window === false) { + $window = self::realBySubscriber($subscriberId, + 0, + self::CACHE_WINDOW); + self::cacheSet($key, $window); + } + return new ArrayWrapper(array_slice($window, + $offset, + $limit)); + } + } + + private static function realBySubscriber($subscriberId, + $offset, + $limit) + { $sub = new Subscription(); $sub->subscriber = $subscriberId; @@ -294,7 +325,13 @@ class Subscription extends Memcached_DataObject $sub->find(); - return $sub; + $subs = array(); + + while ($sub->fetch()) { + $subs[] = clone($sub); + } + + return $subs; } /** @@ -315,6 +352,29 @@ class Subscription extends Memcached_DataObject $offset = 0, $limit = PROFILES_PER_PAGE) { + if ($offset + $limit > self::CACHE_WINDOW) { + return new ArrayWrapper(self::realBySubscribed($subscribedId, + $offset, + $limit)); + } else { + $key = 'subscription:by-subscribed:'.$subscribedId; + $window = self::cacheGet($key); + if ($window === false) { + $window = self::realBySubscribed($subscribedId, + 0, + self::CACHE_WINDOW); + self::cacheSet($key, $window); + } + return new ArrayWrapper(array_slice($window, + $offset, + $limit)); + } + } + + private static function realBySubscribed($subscribedId, + $offset, + $limit) + { $sub = new Subscription(); $sub->subscribed = $subscribedId; @@ -326,6 +386,33 @@ class Subscription extends Memcached_DataObject $sub->find(); - return $sub; + $subs = array(); + + while ($sub->fetch()) { + $subs[] = clone($sub); + } + + return $subs; + } + + /** + * Flush cached subscriptions when subscription is updated + * + * Because we cache subscriptions, it's useful to flush them + * here. + * + * @param mixed $orig Original version of object + * + * @return boolean success flag. + */ + + function update($orig=null) + { + $result = parent::update($orig); + + self::blow('subscription:by-subscriber:'.$this->subscriber); + self::blow('subscription:by-subscribed:'.$this->subscribed); + + return $result; } } |