docs: public static synchronized Cache getCache(final String cacheName) {
          LOGGER.log(Level.INFO, "Constructing cache [name={0}]....", cacheName);
  
          Cache ret = CACHES.get(cacheName);
  
          try {
              if (null == ret) {
                  Class<Cache> cacheClass;
                  switch (Latkes.getRuntimeCache()) {
                      case LOCAL_LRU:
                          cacheClass = (Class<Cache>) Class.forName("org.b3log.latke.cache.caffeine.CaffeineCache");
  
                          break;
                      case REDIS:
                          cacheClass = (Class<Cache>) Class.forName("org.b3log.latke.cache.redis.RedisCache");
  
                          break;
                      case NONE:
                          cacheClass = (Class<Cache>) Class.forName("org.b3log.latke.cache.NoneCache");
  
                          break;
                      default:
                          throw new RuntimeException("Latke runs in the hell.... Please set the environment correctly");
                  }
  
                  ret = cacheClass.newInstance();
  
                  ret.setName(cacheName);
                  CACHES.put(cacheName, ret);
              }
          } catch (final Exception e) {
              throw new RuntimeException("Can not get cache: " + e.getMessage(), e);
          }
  
          LOGGER.log(Level.INFO, "Constructed cache [name={0}, runtime={1}]", cacheName, Latkes.getRuntimeCache());
  
          return ret;
      }