docs: def get_cache(self, cache_name, miss_fn):
          """
          Get an L{AsyncLRUCache} object with the given name.  If such an object
          does not exist, it will be created.  Since the cache is permanent, this
          method can be called only once, e.g., in C{startService}, and it value
          stored indefinitely.
  
          @param cache_name: name of the cache (usually the name of the type of
          object it stores)
          @param miss_fn: miss function for the cache; see L{AsyncLRUCache}
          constructor.
          @returns: L{AsyncLRUCache} instance
          """
          try:
              return self._caches[cache_name]
          except KeyError:
              max_size = self.config.get(cache_name, self.DEFAULT_CACHE_SIZE)
              assert max_size >= 1
              c = self._caches[cache_name] = lru.AsyncLRUCache(miss_fn, max_size)
              return c