我发现了以下关于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
条目一起删除,以避免保留任何“孤立”条目。
提前致谢。
答案 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,这意味着将通知所有事件。