我将Spring Redis与@Cacheable通知一起用于两个方法。当我调用一个方法时,我会得到另一个方法的缓存结果。
当我使用@Cachebale注释为每个方法配置不同的缓存时,我怎么会从错误的缓存中获得结果呢?
设置: Spring版本4.1.6。Redis data 1.5和Redis client 2.7.0。
示例代码:
@Cacheable("test1")
public List<String> findSgsns() {
}
@Cacheable("test2")
public List<String> findSgsns2() {
}发布于 2015-04-16 19:46:32
通过将以下设置添加到弹簧配置(设置usePrefix),解决了该问题:
<bean
id="cacheManager"
class="org.springframework.data.redis.cache.RedisCacheManager"
c:template-ref="redisTemplate">
<property name="usePrefix" value="true" />
</bean>发布于 2017-10-27 23:35:05
默认情况下,如果您没有在@Cacheable注释中指定密钥,Spring将使用SimpleKeyGenerator生成密钥。
public class SimpleKeyGenerator implements KeyGenerator {
@Override
public Object generate(Object target, Method method, Object... params)
{
return generateKey(params);
}
/**
* Generate a key based on the specified parameters.
*/
public static Object generateKey(Object... params) {
if (params.length == 0) {
return SimpleKey.EMPTY;
}
if (params.length == 1) {
Object param = params[0];
if (param != null && !param.getClass().isArray()) {
return param;
}
}
return new SimpleKey(params);
}
}由于您的两个方法(findSgsns() and findSgsns2())中都没有方法参数,因此它实际上将为两个方法生成相同的缓存键。
您已经找到了一个解决方案,它基本上利用了Redis bean中的usePrefix属性,当它在redisTemplate中形成缓存键时,它实际上添加了您在@Cacheable注释中指定的值(即"test1“和"test2")。为了完整起见,我想在这里再提两个选择:
@Cacheable(value = "test1",key = "key1")公有列表findSgsns() {} @Cacheable(value = "test2",key = "key2")公有列表findSgsns2() {}
CachingConfigurerSupport类自动生效):@Configuration公共类RedisConfig扩展CachingConfigurerSupport { @Bean public KeyGenerator keyGenerator() { return new KeyGenerator() { @Override public Object generate(Object target,Method method,Object...参数){ StringBuilder sb =新建StringBuilder();sb.append(target.getClass().getName());sb.append(method.getName());for (Object obj : params) { sb.append(obj.toString());} return sb.toString();} };}
https://stackoverflow.com/questions/29672112
复制相似问题