首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >spring-data-redis与cacheManager

spring-data-redis与cacheManager
EN

Stack Overflow用户
提问于 2016-08-29 21:24:53
回答 1查看 3K关注 0票数 0

当我使用spring-data-redis时,它遇到了两个问题。

第一个问题是,当我使用缓存声明将数据加载到redis时,但我无法通过redisTemplate获得值,代码为流:

代码语言:javascript
复制
@Bean
RedisTemplate<Object, Object> redisTemplate() {
    RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<Object, Object>();
    redisTemplate.setConnectionFactory(jedisConnectionFactory());
    return redisTemplate;
}

@Bean
public RedisConnectionFactory jedisConnectionFactory() {

    JedisConnectionFactory factory = new JedisConnectionFactory();
    factory.setHostName("localhost");
    factory.setPort(6379);
    factory.setUsePool(true);

    return factory;
}

@Bean
CacheManager cacheManager() {
    RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate());
    cacheManager.setDefaultExpiration(86400);
    return cacheManager;
}

UserService as flows:

代码语言:javascript
复制
@Cacheable("allUsers")
public List<UserModel> getAllUsers() {
    logger.info("execute getAllUsers!");
    return Arrays.asList(new UserModel("jason"), new UserModel("david"));
}

我的测试代码是:

代码语言:javascript
复制
@Test
public void testCache() {
    redisTemplate.delete("allUsers");

    userService.getAllUsers();  // load user data
    List<Object> users = redisTemplate.opsForList().range("allUsers", 0, -1); // get allUsers from redis

    logger.info("get from template");
    for(Object user : users) {
        logger.info(((UserModel)user).getUsername());
    }

    logger.info("get from service");
    for(UserModel user : userService.getAllUsers()) {
        logger.info(user.getUsername());
    }

而且,我发现redis中的缓存"allUsers“是allUsers~ key,但我也不能通过这个键获取值,我如何通过redisTemplate获取值,以及为什么这个键是redis中的allUsers~ key。

第二个问题是我通过commond设置了一个key调用"mykey",并设置了"mykey“的值,而且我也不能通过java代码得到空值,我可以通过commond得到值。怎么会这样呢?如果这两个问题是同一个问题呢?有人知道这些吗?感谢您提前^。^。

更新我的代码版本是: spring 4.1.6,

spring-data-redis 1.7.0,

Jedis 2.8.1

redis 3.2.3

EN

回答 1

Stack Overflow用户

发布于 2016-08-31 14:46:37

在不使用RedisSerializer的情况下初始化RedisTemplate会默认模板使用JdkSerializationRedisSerializer。因此,生成的键不是普通的String值,而是类似于\xac\xed\x00\x05t\x00\x0bcache-key-1的值。

您可以使用StringRedisSerializer作为keySerializer来拥有普通的String密钥。

代码语言:javascript
复制
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
template.setKeySerializer(new StringRedisSerializer());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39207450

复制
相关文章

相似问题

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