SpringDataRedis删除条目(散列),但保留索引

SpringDataRedis删除条目(散列),但保留索引,redis,spring-data,spring-data-redis,Redis,Spring Data,Spring Data Redis,在Redis中使用Spring数据时,我遇到这样的情况:它在#findAll调用中提供空对象 在实体上调用#deleteAll时,有时:idx键不会被删除 对我来说,Spring数据似乎正在为#findAll使用二级索引,无法获取对象,因为它已经在Redis中被删除 我们发现,@EnableRedisRepositories(enableKeyspaceEvents=RedisKeyValueAdapter.enableKeyspaceEvents.ON_STARTUP)可能会有所帮助,但我想问

在Redis中使用Spring数据时,我遇到这样的情况:它在
#findAll
调用中提供空对象

在实体上调用
#deleteAll
时,有时
:idx
键不会被删除

对我来说,Spring数据似乎正在为
#findAll
使用二级索引,无法获取对象,因为它已经在Redis中被删除

我们发现,
@EnableRedisRepositories(enableKeyspaceEvents=RedisKeyValueAdapter.enableKeyspaceEvents.ON_STARTUP)
可能会有所帮助,但我想问您是否可以解释发生了什么,并提供任何其他解决方案,因为我对Redis不太熟悉

在Redis中直接删除时,也会出现同样的情况。看起来像这样:

127.0.0.1:6379> keys *
 1) "entry:key:testKey3"
 2) "entry:1234_testKey1"
 3) "entry:eid:1234"
 4) "entry"
 5) "entry:1234_testKey3"
 6) "entry:1234_testKey1:idx"
 7) "entry:key:testKey2"
 8) "entry:1234_testKey2:idx"
 9) "entry:1234_testKey2"
10) "entry:key:testKey1"
11) "entry:1234_testKey3:idx"
127.0.0.1:6379> del entry:1234_testKey1
(integer) 1
@RedisHash("entry")
public class Entry {

    @Id
    private String id;
    @Indexed
    private String key;
    @Indexed
    private String eid;
而且,正如您所看到的那样,
entry:1234\u testKey1:idx
索引尚未删除

 1) "entry:key:testKey3"
 2) "entry:eid:1234"
 3) "entry"
 4) "entry:1234_testKey3"
 5) "entry:1234_testKey1:idx"
 6) "entry:key:testKey2"
 7) "entry:1234_testKey2:idx"
 8) "entry:1234_testKey2"
 9) "entry:key:testKey1"
10) "entry:1234_testKey3:idx"
也许在redis中有某种设置,我可以在删除条目时设置为清除索引?我找不到关于那件事的任何信息

实体类如下所示:

127.0.0.1:6379> keys *
 1) "entry:key:testKey3"
 2) "entry:1234_testKey1"
 3) "entry:eid:1234"
 4) "entry"
 5) "entry:1234_testKey3"
 6) "entry:1234_testKey1:idx"
 7) "entry:key:testKey2"
 8) "entry:1234_testKey2:idx"
 9) "entry:1234_testKey2"
10) "entry:key:testKey1"
11) "entry:1234_testKey3:idx"
127.0.0.1:6379> del entry:1234_testKey1
(integer) 1
@RedisHash("entry")
public class Entry {

    @Id
    private String id;
    @Indexed
    private String key;
    @Indexed
    private String eid;

我们只需在
crudepository
上使用
#save
#deleteAll
#deleteById
,我已经在cli上进行了测试,请查看以下结果:

127.0.0.1:6379> SET test1 redis
OK
127.0.0.1:6379> SET test2 redis
OK
127.0.0.1:6379> keys *
1) "test2"
2) "test1"
3) "PawanTest"
4) "test"
127.0.0.1:6379> DEL test1
(integer) 1
127.0.0.1:6379> keys *
1) "test2"
2) "PawanTest"
3) "test"
127.0.0.1:6379>
如您所见,我向redis添加了一些数据,然后使用
DEL
命令删除了一个键,它已经被删除了

PS:我还没有在我的系统上对redis进行任何配置。刚刚使用
sudo-apt-get-install-redis-server安装,运行良好


注意:如果它不工作,那么您可以尝试使用
FLUSHALL
清理所有数据集,然后清理一些数据,然后重试

我已经在cli上进行了测试,请查看以下结果:

127.0.0.1:6379> SET test1 redis
OK
127.0.0.1:6379> SET test2 redis
OK
127.0.0.1:6379> keys *
1) "test2"
2) "test1"
3) "PawanTest"
4) "test"
127.0.0.1:6379> DEL test1
(integer) 1
127.0.0.1:6379> keys *
1) "test2"
2) "PawanTest"
3) "test"
127.0.0.1:6379>
如您所见,我向redis添加了一些数据,然后使用
DEL
命令删除了一个键,它已经被删除了

PS:我还没有在我的系统上对redis进行任何配置。刚刚使用
sudo-apt-get-install-redis-server安装,运行良好


注意:如果它不工作,那么您可以尝试使用
FLUSHALL
清理所有数据集,然后清理一些数据,然后重试

只是一个建议。尝试使用redis cli从redis中删除数据。如果密钥在删除后存在,那么这是一个问题,否则请将您的代码粘贴到这里。这也直接发生在redis中,但我仍然不知道为什么。也许在redis中有某种设置,我可以在删除条目时设置为清除索引?我找不到任何有关这方面的信息。请在这里添加代码片段。@MicD你能找到这个吗?给出的答案仅用于测试redis。不过,我猜SpringDataRedis中还有一些其他的设置正在这样做。你知道怎么解决这个问题吗?谢谢,我还没有找到解决这个问题的好办法。尝试使用redis配置自动删除孤立项,但效果不理想。简单的非空筛选解决了这个问题。不是很完美,我也不是很满意,但很有效。只是一个建议。尝试使用redis cli从redis中删除数据。如果密钥在删除后存在,那么这是一个问题,否则请将您的代码粘贴到这里。这也直接发生在redis中,但我仍然不知道为什么。也许在redis中有某种设置,我可以在删除条目时设置为清除索引?我找不到任何有关这方面的信息。请在这里添加代码片段。@MicD你能找到这个吗?给出的答案仅用于测试redis。不过,我猜SpringDataRedis中还有一些其他的设置正在这样做。你知道怎么解决这个问题吗?谢谢,我还没有找到解决这个问题的好办法。尝试使用redis配置自动删除孤立项,但效果不理想。简单的非空筛选解决了这个问题。不是很完美,我也不是很满意,但是很有效。谢谢你的测试!我认为我的场景有点不同,因为我创建了带有索引的redis散列,这是由spring数据完成的。哈希已正确删除,但索引
:idx
项未与哈希一起删除。感谢您的测试!我认为我的场景有点不同,因为我创建了带有索引的redis散列,这是由spring数据完成的。哈希已正确删除,但索引
:idx
项不会与哈希一起删除。