我想将 Redis 用作同一物理机上多个应用程序的缓存存储。
我知道至少有两种方法:
- 通过在不同端口上运行多个 Redis 实例;
- 通过为不同的应用程序使用不同的 Redis 数据库。
但我不知道哪个更适合我。
这些方法的优点和缺点是什么?
有没有更好的方法呢?
我想将 Redis 用作同一物理机上多个应用程序的缓存存储。
我知道至少有两种方法:
但我不知道哪个更适合我。
这些方法的优点和缺点是什么?
有没有更好的方法呢?
通常,您应该更喜欢第一种方法,即专用 Redis 服务器。共享数据库由同一个 Redis 进程管理,因此可以相互阻塞。此外,共享数据库共享相同的配置(尽管在您的情况下这可能不是问题,因为所有数据库都用于缓存)。最后,Redis Cluster 不支持共享数据库。
有关更多信息,请参阅此博客文章:https ://redislabs.com/blog/benchmark-shared-vs-dedicated-redis-instances
我们通过命名空间键解决了这个问题。最初,我们尝试使用每个数据库 ID 将用于特定应用程序的数据库。然而,这个想法是不可扩展的,因为数据库数量有限,而且在高级产品(如启用分片的 Azure Cache for Redis 高级实例)中,没有使用数据库的概念。
我们使用的解决方案是为所有键附加一个唯一的前缀。每个应用程序都将使用一个唯一的名字对象进行注释,该名字对象将在每个键的前面添加前缀。
为了减少客户流失,我们构建了一个框架 (URP)。如果您使用的是 StackExchange.Redis,那么您将能够直接使用 URP SDK。如果有帮助,我添加了一些参考资料。
您可以为每个应用程序使用不同的缓存管理器,也可以使用与我相同的方式工作。喜欢 :
@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();
}
};
}