Redis - 过期索引不会被删除

时间:2018-01-22 10:18:29

标签: java spring-boot redis spring-data-redis

我发现了以下关于Redis中索引到期问题的问题(Spring Redis - Indexes not deleted after main entry expires)。

问题是主要和:phantom条目过期并被正确删除,但相应的:idx条目在Redis中幸存下来。

建议的解决方案之一是启用KeyspaceEvents,以便Redis在清理作业期间自动删除过期条目的索引。

不幸的是,这个解决方案对我们的Spring Boot应用程序不起作用,因为我们使用Redis Enterprise作为云环境中提供的服务,这不允许我们进行任何配置更改(CONFIG命令被禁用)

这是我试过的:

@Configuration
@EnableRedisRepositories(enableKeyspaceEvents = RedisKeyValueAdapter.EnableKeyspaceEvents.ON_STARTUP)
public class RedisConfiguration {...}

修改
我认为这对我当地的Redis码头工作图有效,但我错了!在我们提供的Redis(企业)服务上,甚至无法使用以下消息进行设置:
Caused by: redis.clients.jedis.exceptions.JedisDataException: ERR unknown command 'CONFIG'...

有人可以给我一些关于如何删除索引的提示吗?

我们目前没有多个:idx条目,但它们必须/应与:phantom条目一起删除,以避免保留任何“孤立”条目。

提前致谢。

1 个答案:

答案 0 :(得分:3)

我可以找到删除键:phantom :idx 的解决方案。

在Redis配置类中,应放置以下内容:

@Configuration
@EnableRedisRepositories(enableKeyspaceEvents = EnableKeyspaceEvents.ON_STARTUP, basePackages = {
    "com.aaaaa.bbbbb.persistence.model.repository" }, keyspaceNotificationsConfigParameter = "")

当您将“ keyspaceNotificationsConfigParameter”属性设置为空字符串时,将不会执行在AWS Redis中不起作用的CONFIG命令,但是会实例化Expiration Event Listener。

此属性带来一个默认值(Ex),这将导致执行CONFIG命令。

这是通过以下春季代码发生的:

public void init() {
    if (StringUtils.hasText(keyspaceNotificationsConfigParameter)) {
        RedisConnection connection = listenerContainer.getConnectionFactory().getConnection();

        try {
            Properties config = connection.getConfig("notify-keyspace-events");

            if (!StringUtils.hasText(config.getProperty("notify-keyspace-events"))) {
                connection.setConfig("notify-keyspace-events", keyspaceNotificationsConfigParameter);
            }

        } finally {
            connection.close();
        }
    }
    doRegister(listenerContainer);
}

不满足此条件的方式

if (StringUtils.hasText(keyspaceNotificationsConfigParameter)) {

未执行CONFIG命令。

我认为Spring应该基于设置带有空字符串的属性来改善这一点,而不是那样做。

唯一需要做的是,在AWS ElastiCache(Redis)中,将一个值设置为“ notify-keyspace-events”参数,例如AKE,这意味着将通知所有事件。