aboutsummaryrefslogtreecommitdiffstats
path: root/lib/private/Memcache
diff options
context:
space:
mode:
authorRobin Appelman <robin@icewind.nl>2023-02-09 15:05:34 +0100
committerRobin Appelman <robin@icewind.nl>2023-02-10 12:25:23 +0100
commit853ec60f3eadceebc3955893d6ed4960f5697058 (patch)
treeb5e7a833f81cc00511d57ac017a8b014ad85ac6d /lib/private/Memcache
parent7341d339eb7a1aa20c6b35e8edb40c1cd7946b96 (diff)
downloadnextcloud-server-853ec60f3eadceebc3955893d6ed4960f5697058.tar.gz
nextcloud-server-853ec60f3eadceebc3955893d6ed4960f5697058.zip
also cache backend for user in memory instead of always going to redis
Signed-off-by: Robin Appelman <robin@icewind.nl>
Diffstat (limited to 'lib/private/Memcache')
-rw-r--r--lib/private/Memcache/WithLocalCache.php54
1 files changed, 54 insertions, 0 deletions
diff --git a/lib/private/Memcache/WithLocalCache.php b/lib/private/Memcache/WithLocalCache.php
new file mode 100644
index 00000000000..5b7ccc10e39
--- /dev/null
+++ b/lib/private/Memcache/WithLocalCache.php
@@ -0,0 +1,54 @@
+<?php
+
+namespace OC\Memcache;
+
+use OCP\Cache\CappedMemoryCache;
+use OCP\ICache;
+
+/**
+ * Wrap a cache instance with an extra later of local, in-memory caching
+ */
+class WithLocalCache implements ICache {
+ private ICache $inner;
+ private CappedMemoryCache $cached;
+
+ public function __construct(ICache $inner, int $localCapacity = 512) {
+ $this->inner = $inner;
+ $this->cached = new CappedMemoryCache($localCapacity);
+ }
+
+ public function get($key) {
+ if (isset($this->cached[$key])) {
+ return $this->cached[$key];
+ } else {
+ $value = $this->inner->get($key);
+ if (!is_null($value)) {
+ $this->cached[$key] = $value;
+ }
+ return $value;
+ }
+ }
+
+ public function set($key, $value, $ttl = 0) {
+ $this->cached[$key] = $value;
+ return $this->inner->set($key, $value, $ttl);
+ }
+
+ public function hasKey($key) {
+ return isset($this->cached[$key]) || $this->inner->hasKey($key);
+ }
+
+ public function remove($key) {
+ unset($this->cached[$key]);
+ return $this->inner->remove($key);
+ }
+
+ public function clear($prefix = '') {
+ $this->cached->clear();
+ return $this->inner->clear($prefix);
+ }
+
+ public static function isAvailable(): bool {
+ return false;
+ }
+}