diff --git a/spec/meta_test.js b/spec/meta_test.js
index 264e8d226526e89c1eb3517681f531cae4f62606..4ff9221bd67a5a69d45ab55028387c3d3cf24edd 100644
--- a/spec/meta_test.js
+++ b/spec/meta_test.js
@@ -73,6 +73,7 @@ describe('Responses contain custom headers', function () {
     })
 
     it('does not have metadata from ui service when unavailable', async function () {
+      await import('../src/cache.js').then(({ clear }) => clear())
       const response = await request(app).get('/meta')
       expect(response.statusCode).to.equal(200)
       expect(response.body).to.not.deep.contain({
@@ -81,4 +82,36 @@ describe('Responses contain custom headers', function () {
       })
     })
   })
+
+  describe('without redis disabled', function () {
+    let prevConfig
+
+    beforeEach(async function () {
+      td.reset()
+      mockConfig({ urls: ['http://ui-server/'] })
+      mockFetch(fetchConfig = {
+        'http://ui-server': {
+          '/manifest.json': generateSimpleViteManifest({
+            'example.js': {}
+          }),
+          '/example.js': () => new Response('this is example', { headers: { 'content-type': 'application/javascript' } }),
+          '/meta.json': { name: 'sample-service', version: '1.0' }
+        }
+      })
+      app = await mockApp()
+    })
+
+    afterEach(function () {
+      fetchConfig['http://ui-server'] = prevConfig
+    })
+
+    it('has metadata', async function () {
+      const response = await request(app).get('/meta')
+      expect(response.statusCode).to.equal(200)
+      expect(response.body).to.deep.contain({
+        name: 'sample-service',
+        version: '1.0'
+      })
+    })
+  })
 })
diff --git a/src/cache.js b/src/cache.js
index 523b798b3f2004f992caafc299d811b18f1f7ddd..a781e291a7f6aa8449006c082cba1947efe75953 100644
--- a/src/cache.js
+++ b/src/cache.js
@@ -14,6 +14,12 @@ export async function getBuffer (key) {
   return get(key, { method: 'getBuffer' })
 }
 
+export async function clear () {
+  for (const prop of Object.getOwnPropertyNames(cache)) {
+    delete cache[prop]
+  }
+}
+
 export async function get (key, { method = 'get' } = {}) {
   if (cache[key]) return cache[key]
 
diff --git a/src/meta.js b/src/meta.js
index 5aadcc1db2361bb92d24485e934120a4b6238492..3bc63ab752ee6f2acad705b98e2e095106fe76bd 100644
--- a/src/meta.js
+++ b/src/meta.js
@@ -1,10 +1,10 @@
 import { config } from './config.js'
 import fetch from 'node-fetch'
-import { client } from './redis.js'
+import * as cache from './cache.js'
 import { getRedisKey } from './util.js'
 
 export async function getMergedMetadata ({ version }) {
-  const metadata = await client.get(getRedisKey({ version, name: 'mergedMetadata' }))
+  const metadata = await cache.get(getRedisKey({ version, name: 'mergedMetadata' }))
   if (metadata) return JSON.parse(metadata)
 
   await config.load()
@@ -29,6 +29,6 @@ export async function getMergedMetadata ({ version }) {
 
   // only return when contains data
   const filtered = newMetadata.filter(Boolean)
-  await client.set(getRedisKey({ version, name: 'mergedMetadata' }), JSON.stringify(filtered))
+  await cache.set(getRedisKey({ version, name: 'mergedMetadata' }), JSON.stringify(filtered))
   return filtered
 }