From ff672b11e2e9628fd721b097e6712f99cb9883f8 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Wed, 11 Oct 2023 13:29:21 +0200 Subject: [PATCH] feat: Add factory method for in-memory caches Signed-off-by: Christoph Wurst --- lib/private/Memcache/Factory.php | 5 +++++ lib/public/ICacheFactory.php | 16 ++++++++++++++++ tests/lib/Memcache/FactoryTest.php | 11 +++++++++++ 3 files changed, 32 insertions(+) diff --git a/lib/private/Memcache/Factory.php b/lib/private/Memcache/Factory.php index fa2dfeb75dd5b..16d6ae32f72a0 100644 --- a/lib/private/Memcache/Factory.php +++ b/lib/private/Memcache/Factory.php @@ -31,6 +31,7 @@ */ namespace OC\Memcache; +use OCP\Cache\CappedMemoryCache; use OCP\Profiler\IProfiler; use OCP\ICache; use OCP\ICacheFactory; @@ -184,6 +185,10 @@ public function isAvailable(): bool { return $this->distributedCacheClass !== self::NULL_CACHE; } + public function createInMemory(int $capacity = 512): ICache { + return new CappedMemoryCache($capacity); + } + /** * Check if a local memory cache backend is available * diff --git a/lib/public/ICacheFactory.php b/lib/public/ICacheFactory.php index d70a836aa5255..70ad955849da1 100644 --- a/lib/public/ICacheFactory.php +++ b/lib/public/ICacheFactory.php @@ -75,4 +75,20 @@ public function createDistributed(string $prefix = ''): ICache; * @since 13.0.0 */ public function createLocal(string $prefix = ''): ICache; + + /** + * Create an in-memory cache instance + * + * Useful for remembering values inside one process. Cache memory is cleared + * when the object is garbage-collected. Implementation may also expire keys + * earlier when the TTL is reached or too much memory is consumed. + * + * Cache keys are local to the cache object. When building two in-memory + * caches, there is no data exchange between the instances. + * + * @param int $capacity maximum number of cache keys + * @return ICache + * @since 28.0.0 + */ + public function createInMemory(int $capacity = 512): ICache; } diff --git a/tests/lib/Memcache/FactoryTest.php b/tests/lib/Memcache/FactoryTest.php index 9cdd7058ffac2..5f13a94eacde8 100644 --- a/tests/lib/Memcache/FactoryTest.php +++ b/tests/lib/Memcache/FactoryTest.php @@ -140,4 +140,15 @@ public function testCacheNotAvailableException($localCache, $distributedCache) { $profiler = $this->getMockBuilder(IProfiler::class)->getMock(); new \OC\Memcache\Factory('abc', $logger, $profiler, $localCache, $distributedCache); } + + public function testCreateInMemory(): void { + $logger = $this->getMockBuilder(LoggerInterface::class)->getMock(); + $profiler = $this->getMockBuilder(IProfiler::class)->getMock(); + $factory = new \OC\Memcache\Factory('abc', $logger, $profiler, null, null, null); + + $cache = $factory->createInMemory(); + $cache->set('test', 48); + + self::assertSame(48, $cache->get('test')); + } }