【问题标题】:Using Redis as a cache storage for for multiple application on the same server使用 Redis 作为同一服务器上多个应用程序的缓存存储
【发布时间】:2014-11-30 19:53:09
【问题描述】:

我想将 Redis 用作同一物理机上多个应用程序的缓存存储。

我至少知道两种方法:

  1. 通过在不同端口上运行多个 Redis 实例;
  2. 为不同的应用程序使用不同的 Redis 数据库。

但我不知道哪个更适合我。

这些方法的优缺点是什么?

有没有更好的方法?

【问题讨论】:

    标签: redis redis-server


    【解决方案1】:

    通常,您应该更喜欢第一种方法,即专用 Redis 服务器。共享数据库由同一个 Redis 进程管理,因此可以相互阻塞。此外,共享数据库共享相同的配置(尽管在您的情况下这可能不是问题,因为所有数据库都用于缓存)。最后,Redis Cluster 不支持共享数据库。

    更多信息请参考这篇博文:https://redislabs.com/blog/benchmark-shared-vs-dedicated-redis-instances

    【讨论】:

    • 另外,dump 的管理方式也不一样,最好有不同的 dump,不能用 db 隔离 rdb。
    【解决方案2】:

    我们通过命名空间键解决了这个问题。最初,我们尝试使用每个数据库 ID 将用于特定应用程序的数据库。但是,由于数据库数量有限,该想法不可扩展,而且在高级产品中(例如启用了分片的 Azure Cache for Redis 高级实例)没有使用数据库的概念。

    我们使用的解决方案是为所有键附加一个唯一的前缀。每个应用程序都将使用唯一的名字对象进行注释,该名字对象将在每个键的前面添加前缀。

    为了减少客户流失,我们构建了一个框架 (URP)。如果您使用的是 StackExchange.Redis,那么您将能够直接使用 URP SDK。如果有帮助,我已经添加了一些参考资料。

    1. 源代码和文档 - https://github.com/microsoft/UnifiedRedisPlatform.Core/wiki/Management-Console
    2. 博文(想法)-https://www.devcompost.com/post/__urp

    【讨论】:

    • URP 是否适用于其他非 Azure Redis 集群?
    • 是的,应该。 URP 与 Redis 连接字符串一起使用,因此任何 REDIS 连接字符串都可以使用。
    【解决方案3】:

    您可以为每个应用程序使用不同的缓存管理器,它的工作方式与我使用的方式相同。 喜欢:

    @Bean(name = "myCacheManager")
        public CacheManager cacheManager(RedisTemplate<String, Object> redisTemplate) {
            RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
            return cacheManager;
        }
    
        @Bean(name ="customKeyGenerator")
        public KeyGenerator keyGenerator() {
            return new KeyGenerator() {
                @Override
                public Object generate(Object o, Method method, Object... objects) {
                    // This will generate a unique key of the class name, the method name,
                    // and all method parameters appended.
                    StringBuilder sb = new StringBuilder();
                    sb.append(o.getClass().getName());
                    sb.append(method.getName());
                    for (Object obj : objects) {
                        sb.append(obj.toString());
                    }
                    return sb.toString();
                }
            };
        }
    

    【讨论】:

      猜你喜欢
      • 2019-01-06
      • 1970-01-01
      • 1970-01-01
      • 2019-10-23
      • 1970-01-01
      • 1970-01-01
      • 2011-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多