Java Redis-过期索引不会被删除
我发现了以下关于Redis中索引过期问题的问题() 问题是主条目和Java Redis-过期索引不会被删除,java,spring-boot,redis,spring-data-redis,Java,Spring Boot,Redis,Spring Data Redis,我发现了以下关于Redis中索引过期问题的问题() 问题是主条目和:phantom条目过期并被正确删除,但相应的:idx条目在Redis中仍然是孤立的 建议的解决方案之一是启用KeyspaceEvents,以便Redis在清理作业期间自动删除过期条目的索引 不幸的是,这个解决方案不适用于我们的Spring Boot应用程序,因为我们在云环境中使用Redis Enterprise作为提供的服务,这不允许我们进行任何配置更改(CONFIG命令被禁用) 以下是我所尝试的: @Configuration
:phantom
条目过期并被正确删除,但相应的:idx
条目在Redis中仍然是孤立的
建议的解决方案之一是启用KeyspaceEvents,以便Redis在清理作业期间自动删除过期条目的索引
不幸的是,这个解决方案不适用于我们的Spring Boot应用程序,因为我们在云环境中使用Redis Enterprise作为提供的服务,这不允许我们进行任何配置更改(CONFIG
命令被禁用)
以下是我所尝试的:
@Configuration
@EnableRedisRepositories(enableKeyspaceEvents = RedisKeyValueAdapter.EnableKeyspaceEvents.ON_STARTUP)
public class RedisConfiguration {...}
编辑:我以为这对我当地的Redis docker形象有用,但我错了!在我们提供的Redis(企业)服务上,甚至无法设置以下消息:
原因:redis.clients.jedis.exceptions.jedisdataetexception:ERR未知命令'CONFIG'…
谁能告诉我如何删除索引
我们目前没有太多的:idx
条目,但它们必须/应该与:phantom
条目一起删除,以避免保留任何“孤立”条目
提前感谢。我可以找到删除键:phantom和:idx的解决方案 在Redis配置类中,应放置以下内容:
@Configuration
@EnableRedisRepositories(enableKeyspaceEvents = EnableKeyspaceEvents.ON_STARTUP, basePackages = {
"com.aaaaa.bbbbb.persistence.model.repository" }, keyspaceNotificationsConfigParameter = "")
将“keyspaceNotificationsConfigParameter”属性设置为空字符串时,不会执行在AWS Redis中不起作用的CONFIG命令,但通过这种方式,将实例化过期事件侦听器
此属性带来一个默认值(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,这意味着所有事件都将被通知。我可以找到删除键的解决方案:phantom和:idx 在Redis配置类中,应放置以下内容:
@Configuration
@EnableRedisRepositories(enableKeyspaceEvents = EnableKeyspaceEvents.ON_STARTUP, basePackages = {
"com.aaaaa.bbbbb.persistence.model.repository" }, keyspaceNotificationsConfigParameter = "")
将“keyspaceNotificationsConfigParameter”属性设置为空字符串时,不会执行在AWS Redis中不起作用的CONFIG命令,但通过这种方式,将实例化过期事件侦听器
此属性带来一个默认值(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,这意味着将通知所有事件。AFAIK密钥空间通知在企业版中受支持-最好将此问题直接发送到support@redislabs.com提供您正在使用的服务提供商和云环境的详细信息。谢谢,我一定会写出来的!关键是,启用KeyspaceEvents需要启用
CONFIG
命令,而对于受保护的Redis环境,情况并非如此…:-/企业版支持AFAIK密钥空间通知-最好将此问题直接提交给support@redislabs.com提供您正在使用的服务提供商和云环境的详细信息。谢谢,我一定会写出来的!关键是,启用KeyspaceEvents需要启用CONFIG
命令,而对于受保护的Redis环境,情况并非如此…:-/我试过这个。我在启动过程中并没有遇到错误,但它并没有清理SpringDataRedis创建的索引。你知道怎么修吗?我试过了。我在启动过程中并没有遇到错误,但它并没有清理SpringDataRedis创建的索引。你知道怎么解决这个问题吗?