当前位置: 首页 > 知识库问答 >
问题:

带有cacheManager的spring-data-redis

桑睿识
2023-03-14

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

第一个问题是当我使用cache annation将数据加载到redis时,但我无法通过redisTemplate获取值,代码如下:

@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;
}

用户服务作为流:

@Cacheable("allUsers")
public List<UserModel> getAllUsers() {
    logger.info("execute getAllUsers!");
    return Arrays.asList(new UserModel("jason"), new UserModel("david"));
}

我的测试代码是:

@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设置了一个调用“mykey”的键,并设置了值“mykey”,而且我也不能通过java代码获取空值,我可以通过Commond获取值。这是怎么回事?如果这两个问题是同一个问题?有人知道这些吗?谢谢你提前 ^. ^ .

更新我的代码版本是:Spring 4.1.6、
spring-data-redis 1.7.0、
Jedis 2.8.1
redis 3.2.3

共有1个答案

费朗
2023-03-14

在没有重新序列化器的情况下初始化重新序列化模板,默认模板使用jdkserializationredisializer。因此,生成的键不是普通的字符串值,而是类似于xac\x00\x05t\x00\x0bcache-key-1的值。

您可以使用字符串重新序列化器作为键序列化器来拥有普通的字符串键。

RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
template.setKeySerializer(new StringRedisSerializer());
 类似资料:
  • 我有一个名为和的类,其中拥有作为引用的。当它不是列表时,我可以传递URI引用以及以下示例。但我怎么做当一个清单?如果有人能帮助我,我很感激 没有getter和setter的实体 细静脉 阿根西亚 静脉储存库 Agencia存储库

  • 目前,我正在使用带有Ehcache的@缓存来使用Spring cache。我将使用Spring Data Redis 2.0.3用Redis替换Ehcache。我在网上看到的所有示例都是基于旧版本的,但是新版本有不同格式的构造函数。 这是我当前的cacheManager配置: 基于旧版本使用Redis的示例如下: 新版本中的构造函数与旧版本完全不同,新版本的所有示例都像这样手动将所有内容放入缓存:

  • 问题内容: 这是我正在尝试使用Spring Data JPA实现类似解决方案的代码。 CustomerDbConfig.java(第一个数据源连接) CustomerDbConfig.java(第二个数据源) Order.java(模型) … CustomerRepository.java 最后,Application.java 在启动过程中会引发以下异常: 预先感谢你的帮助。 问题答案: 通过使

  • 我试图在我的Spring Boot应用程序上实现查询DSL,该应用程序使用Spring Data Mongo&Gradle。我正在使用Spring工具套件在本地运行它。 我从包括Spring数据文档在内的多个来源中找到了以下步骤: null null 之后,更新了注释接口,如下所示。注意:我还将片段存储库FragmentOrderRepository用于一些自定义查询。 然后在controller

  • 我正在尝试配置我的应用程序上下文,以便能够在我的应用程序中使用带有嵌入式图形的Neo4j服务器,但没有多大成功。我同时使用Spring数据(Mongo和Neo4j存储库方法)。这是我的应用程序上下文,未运行: 如果我不使用这种方法,只指定存储目录(注释行),那么一切都可以正常运行。我怀疑这是SDN和neo4j服务器之间的版本问题。这是我的POM: 它的父项作为依赖项Spring(核心、上下文、测试

  • 这里的问题是映射,我需要强制转换结果或手动检查一切。即使有更好的映射能力,我也不敢相信没有更好的方法来做到这一点。 我也试过这样做:https://stackoverflow.com/a/36329166/840315,但您需要将类路径硬编码到查询中以使其工作,而且我仍然需要将对象映射到不可变的对象。 使用JdbcTemplate,您可以使用(src): spring data JPA是否有类似的