首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >spring redis错误的结果

spring redis错误的结果
EN

Stack Overflow用户
提问于 2015-04-16 18:33:15
回答 2查看 750关注 0票数 0

我将Spring Redis与@Cacheable通知一起用于两个方法。当我调用一个方法时,我会得到另一个方法的缓存结果。

当我使用@Cachebale注释为每个方法配置不同的缓存时,我怎么会从错误的缓存中获得结果呢?

设置: Spring版本4.1.6。Redis data 1.5和Redis client 2.7.0。

示例代码:

代码语言:javascript
运行
复制
@Cacheable("test1")
    public List<String> findSgsns() {
}

@Cacheable("test2")
    public List<String> findSgsns2() {
}
EN

回答 2

Stack Overflow用户

发布于 2015-04-16 19:46:32

通过将以下设置添加到弹簧配置(设置usePrefix),解决了该问题:

代码语言:javascript
运行
复制
<bean
    id="cacheManager"
    class="org.springframework.data.redis.cache.RedisCacheManager"
    c:template-ref="redisTemplate">
    <property name="usePrefix" value="true" />
</bean>
票数 0
EN

Stack Overflow用户

发布于 2017-10-27 23:35:05

默认情况下,如果您没有在@Cacheable注释中指定密钥,Spring将使用SimpleKeyGenerator生成密钥。

代码语言:javascript
运行
复制
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")。为了完整起见,我想在这里再提两个选择:

  1. 为每个方法指定您自己的密钥(注意:您可以使用Spring EL指定您的密钥):

@Cacheable(value = "test1",key = "key1")公有列表findSgsns() {} @Cacheable(value = "test2",key = "key2")公有列表findSgsns2() {}

  • 构建自定义密钥生成器,下面是示例密钥生成器,将方法名带入redis缓存密钥生成(注意:自定义密钥生成器会通过扩展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();} };}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29672112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档