Caching 一个缓存与多个缓存

Caching 一个缓存与多个缓存,caching,web-applications,playframework-2.0,Caching,Web Applications,Playframework 2.0,我正在使用PlayFramework2,它使用EHcache。现在api只有Cache.set和Cache.get,所以我认为有一个大的缓存 如果有多个缓存,不是效率更高吗?例如,一个缓存用于ip地址,一个缓存用于用户名等 你能给我一些优点/缺点吗?游戏中的缓存对象的目的是拥有一个通用的缓存系统 您可以通过扩展实际缓存并使用特定前缀来专门化缓存: class UserCache { public static final String PREFIX = "UserCache";

我正在使用PlayFramework2,它使用EHcache。现在api只有
Cache.set
Cache.get
,所以我认为有一个大的缓存

如果有多个缓存,不是效率更高吗?例如,一个缓存用于ip地址,一个缓存用于用户名等


你能给我一些优点/缺点吗?

游戏中的缓存对象的目的是拥有一个通用的缓存系统

您可以通过扩展实际缓存并使用特定前缀来专门化缓存:

class UserCache {

    public static final String PREFIX = "UserCache";

    public static void set(String key, User value) {

        Cache.set(PREFIX + key, value);
    }

    public static User get(String key) {
        return (User)Cache.get(PREFIX + key);

    }


}

正在使用的缓存对象的目的是具有通用缓存系统

您可以通过扩展实际缓存并使用特定前缀来专门化缓存:

class UserCache {

    public static final String PREFIX = "UserCache";

    public static void set(String key, User value) {

        Cache.set(PREFIX + key, value);
    }

    public static User get(String key) {
        return (User)Cache.get(PREFIX + key);

    }


}

考虑最一般意义上的缓存。通常,允许缓存增长到某个大小限制,然后根据上次访问项目的时间将其从缓存中删除

假设你想同时缓存苹果和梨,你有足够的空间在缓存中保存20个项目。如果你把它分成一个苹果缓存和另一个梨缓存,它看起来分割得很好。但是,如果您的客户使用了大量苹果,但几乎没有使用任何梨,那么您的苹果缓存很快就会满,因此最近使用过的苹果将从苹果缓存中删除,而长期未使用的梨可以留在梨缓存中,因为它没有满


您可以看到,如果您只有一个可以存储苹果或梨的缓存,那么您正在缓存最近使用的对象,因此总体上可能会更高效。因此,从性能角度来看,通常最好尽可能少地使用缓存。

考虑最一般意义上的缓存。通常,允许缓存增长到某个大小限制,然后根据上次访问项目的时间将其从缓存中删除

假设你想同时缓存苹果和梨,你有足够的空间在缓存中保存20个项目。如果你把它分成一个苹果缓存和另一个梨缓存,它看起来分割得很好。但是,如果您的客户使用了大量苹果,但几乎没有使用任何梨,那么您的苹果缓存很快就会满,因此最近使用过的苹果将从苹果缓存中删除,而长期未使用的梨可以留在梨缓存中,因为它没有满


您可以看到,如果您只有一个可以存储苹果或梨的缓存,那么您正在缓存最近使用的对象,因此总体上可能会更高效。因此,从性能的角度来看,缓存越少越好。

是的,我已经采用了类似的方法。但假设我们的缓存有1000个条目。我们尝试查找特定的用户。如果用户不在缓存中,我们将得到1000次未命中。如果我们有一个只有用户的特定缓存,那么缓存会小得多,例如100个条目->更好的性能。还是我错了?对于这类数字,差异是最小的(访问内存中的hashmap)。是的,我已经做了类似的方法。但假设我们的缓存有1000个条目。我们尝试查找特定的用户。如果用户不在缓存中,我们将得到1000次未命中。如果我们有一个只有用户的特定缓存,那么缓存会小得多,例如100个条目->更好的性能。还是我错了?对于这类数字,差异是最小的(访问内存中的hashmap)。