【问题标题】:set expire key at specific time when using Spring caching with Redis在 Redis 中使用 Spring 缓存时在特定时间设置过期键
【发布时间】:2018-08-02 18:33:14
【问题描述】:

我正在 Spring 缓存抽象注释以将缓存应用于我的服务方法。

由于我使用 Redis 作为缓存存储,我想使用在特定时间过期缓存的选项,因为 Redis 支持该选项。 redis 中的 expireat 命令可用于设置将来的过期时间。

我不确定在使用 RedisCache 时如何对缓存中的键执行此操作。

我尝试通过创建一个 bean 来自定义 RedisCacheManager。

我看到有一个公开的 getNativeCache() 方法。但我没有找到任何方法来使用它来设置 expireat 的值。

如果有办法自定义 RedisCacheManager 以便特定缓存的所有键使用与到期相同的时间,请告诉我。

【问题讨论】:

    标签: redis spring-data-redis spring-cache


    【解决方案1】:
    @Bean (name="cacheManager")
    public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
        RedisCacheConfiguration conf_ready_info = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofMillis(50000));
    
        RedisCacheConfiguration conf_base_info = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofMillis(60000));
    
        Map<String, RedisCacheConfiguration> cacheConfigurations = new HashMap<String, RedisCacheConfiguration>();
        cacheConfigurations.put("base_info", conf_base_info);
        cacheConfigurations.put("ready_info", conf_ready_info);
    
        return RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(connectionFactory)
                .withInitialCacheConfigurations(cacheConfigurations).build();
    }
    
    
    @Cacheable(value = "ready_info", key = "#aid")
    public String  findByAid(String aid) throws Exception { 
        String readyInfo = "";
        return readyInfo;
    }
    

    【讨论】:

    • 节省我的时间!谢谢!我添加一个办公室描述:可以通过 RedisCacheManager.RedisCacheManagerBuilder.withInitialCacheConfigurations(Map) 指定需要与默认配置不同的 RedisCacheConfiguration 的缓存。
    【解决方案2】:

    其实是有的。请检查以下内容:

    RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig()
                .disableCachingNullValues()
                .entryTtl(<your duration>)
                .computePrefixWith(CacheKeyPrefix.simple())
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
    RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(redisConnectionFactory)
                .cacheDefaults(configuration)
                .build();
    

    我使用的是 2.0.4.RELEASE 版本的 spring boot。如果您使用的是旧版本,您可以这样做:

    RedisCacheManager cacheManager =
                new RedisCacheManager(
                        redisTemplate,//redis template
                        Arrays.asList("my-cahce"),//loads these caches at startup
                        false);//Do not allow null values
        cacheManager.setLoadRemoteCachesOnStartup(true);
        cacheManager.setCachePrefix(new DefaultRedisCachePrefix());
        cacheManager.setDefaultExpiration(TimeUnit.SECONDS.convert(365, TimeUnit.DAYS));
    

    【讨论】:

    • 如何解决在特定时间而不是持续时间到期的问题?
    • 感谢您的回复。但是,这不是我问的。我想在绝对时间而不是在经过/完成几秒钟后使缓存过期。我想通过 Spring Cache Manager 来利用 Redis expirat 工具。
    • 抱歉没有正确理解问题
    猜你喜欢
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 2020-06-18
    • 2022-09-23
    • 1970-01-01
    • 2022-01-05
    • 2021-12-25
    • 2017-05-17
    相关资源
    最近更新 更多