21

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

我知道至少有两种方法:

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

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

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

有没有更好的方法呢?

4

3 回答 3

17

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

有关更多信息,请参阅此博客文章:https ://redislabs.com/blog/benchmark-shared-vs-dedicated-redis-instances

于 2014-11-30T21:09:07.050 回答
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
于 2021-10-02T05:20:12.057 回答
0

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

@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-10-30T17:41:01.997 回答