gpt4 book ai didi

java - Spring缓存,不同缓存上相同的key

转载 作者:行者123 更新时间:2023-11-30 06:49:18 24 4
gpt4 key购买 nike

我正在尝试使用两个缓存来存储具有相同 ID 的两个不同项目(用户和组)。我希望我应该得到不同的值,因为它们是两个不同的缓存。但事实并非如此。

@Bean
public JedisConnectionFactory jedisConnectionFactory() {
LOG.debug("redis host: {}, redis port: {}", redisHost, redisPort);
JedisConnectionFactory factory = new JedisConnectionFactory();
factory.setUseSsl(true);
factory.setHostName(redisHost);
factory.setPort(redisPort);
factory.setUsePool(true);
factory.setPassword(primaryKey);
return factory;
}

/**
*
* @return
*/
@Bean(name = "redisTemplate")
public RedisTemplate redisTemplate() {
RedisTemplate template = new RedisTemplate();
template.setConnectionFactory(jedisConnectionFactory());
return template;
}

/**
*
* @return
*/
@Bean
public CacheManager cacheManager() {
RedisCacheManager manager = new RedisCacheManager(redisTemplate());
manager.setCacheNames(Arrays.asList("users", "groups"));
return manager;
}

@Cacheable(cacheNames = "users", key = "#id")
public User findUserById(String id) {
return null;
}

@Cacheable(cacheNames = "users", key = "#user.id")
public User updateUser(User user) {
return user;
}

@Cacheable(cacheNames = "groups", key = "#id")
public Group findGroupById(String id) {
return null;
}

@CachePut(cacheNames = "groups", key = "#group.id")
public Group updateGroup(Group group) {
return group;
}

JUnit。

    service.removeCaches();

User user = new User();
user.setName("oldUser");
user.setId("1");


// USER
assertNull(service.findUserById("1"));

service.updateUser(user);

User userCached = service.findUserById("1");
LOG.debug(userCached);
assertNotNull(userCached);
assertEquals(userCached.getName(), "oldUser");

// GROUP
assertNull(service.findGroupById("1")); // <== here, im actually getting user instead of null. cache has been cleared before the test starts.

也许我在这里误解了不同缓存的概念。或者即使在不同的缓存中, key 也应该是唯一的?

日志

 Results :

Tests in error:
testCache(TestRedisServiceImpl): User cannot be cast to Group

这基本上表明用户已从缓存中返回。

最佳答案

实际上,CacheManager.setCacheNames()为同一个缓存提供别名,并不是两个不同的缓存。你可以看看API here :

void setCacheNames(Collection cacheNames) Specify the set of cache names for this CacheManager's 'static' mode.

您可以认为 CacheManager 就像一个 Map 对象,其中一个键仅存储一个对象(作为值),因此当您尝试使用相同的键插入第二个对象时,第一个对象将被第二个对象替换。

因此,发生的情况是 CacheManager 中的 user 对象被 group 对象替换,因为它们都被存储用同一把 key 。

要使缓存键在缓存管理器中唯一,您可以使用cacheManager.setUsePrefix(),以便每个键都以各自的缓存名称为前缀,并且值将不会被替换。

关于java - Spring缓存,不同缓存上相同的key,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43057059/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com