Jos*_*eph 2 java spring caching
我试图有两个缓存来存储两个不同的项目,用户和组,具有相同的 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;
}
Run Code Online (Sandbox Code Playgroud)
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.
Run Code Online (Sandbox Code Playgroud)
也许我在这里误解了不同缓存的概念。或者即使在不同的缓存中,key 也应该是唯一的?
日志
Results :
Tests in error:
testCache(TestRedisServiceImpl): User cannot be cast to Group
Run Code Online (Sandbox Code Playgroud)
这基本上表明用户从缓存中返回。
其实CacheManager.setCacheNames()就是为同一个缓存提供别名,不是两个不同的缓存。您可以在此处查看 API :
void setCacheNames(Collection cacheNames) 为此 CacheManager 的“静态”模式指定缓存名称集。
您可以认为CacheManager 就像一个Map对象,其中一个键仅存储一个对象(作为值),因此当您尝试插入具有相同键的第二个对象时,第一个对象将被第二个对象替换。
因此,正在发生的事情是 中的user对象CacheManager正在被group对象替换, 因为它们都使用相同的键存储。
要使缓存管理器中的缓存键唯一,您可以使用,cacheManager.setUsePrefix()以便每个键都以各自的缓存名称为前缀,并且值不会被替换。
| 归档时间: |
|
| 查看次数: |
2971 次 |
| 最近记录: |