]> source.dussan.org Git - nextcloud-server.git/commitdiff
Add layer to select fast or slow cache for storing values
authorBart Visscher <bartv@thisnet.nl>
Wed, 6 Jun 2012 19:58:36 +0000 (21:58 +0200)
committerBart Visscher <bartv@thisnet.nl>
Wed, 6 Jun 2012 20:41:36 +0000 (22:41 +0200)
lib/cache.php
lib/cache/broker.php [new file with mode: 0644]

index 70f11f35518c551f6b0e88d8a8425e55f8076dbe..55d5b064c41efe893b8511a47ba18a27949c0264 100644 (file)
@@ -10,7 +10,17 @@ class OC_Cache {
        static protected $cache;
 
        static protected function init() {
+               $fast_cache = null;
+               if (!$fast_cache && function_exists('xcache_set')) {
+                       $fast_cache = new OC_Cache_XCache();
+               }
+               if (!$fast_cache && function_exists('apc_store')) {
+                       $fast_cache = new OC_Cache_APC();
+               }
                self::$cache = new OC_Cache_File();
+               if ($fast_cache) {
+                       self::$cache = new OC_Cache_Broker($fast_cache, self::$cache);
+               }
        }
 
        static public function get($key) {
diff --git a/lib/cache/broker.php b/lib/cache/broker.php
new file mode 100644 (file)
index 0000000..62a7cd9
--- /dev/null
@@ -0,0 +1,55 @@
+<?php
+/**
+ * Copyright (c) 2012 Bart Visscher <bartv@thisnet.nl>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+class OC_Cache_Broker {
+       protected $fast_cache;
+       protected $slow_cache;
+
+       public function __construct($fast_cache, $slow_cache) {
+               $this->fast_cache = $fast_cache;
+               $this->slow_cache = $slow_cache;
+       }
+
+       public function get($key) {
+               if ($r = $this->fast_cache->get($key)) {
+                       return $r;
+               }
+               return $this->slow_cache->get($key);
+       }
+
+       public function set($key, $value, $ttl=0) {
+               $set_slow = strlen($value) > 8192;
+               if ($set_slow) {
+                       if ($this->fast_cache->hasKey($key)) {
+                               $this->fast_cache->remove($key);
+                       }
+                       $this->slow_cache->set($key, $value, $ttl);
+               } else {
+                       $this->fast_cache->set($key, $value, $ttl);
+               }
+       }
+
+       public function hasKey($key) {
+               if ($this->fast_cache->hasKey($key)) {
+                       return true;
+               }
+               return $this->slow_cache->hasKey($key);
+       }
+
+       public function remove($key) {
+               if ($this->fast_cache->remove($key)) {
+                       return true;
+               }
+               return $this->slow_cache->remove($key);
+       }
+
+       public function clear(){
+               $this->fast_cache->clear();
+               $this->slow_cache->clear();
+       }
+}