Spring Data Redis删除条目(哈希),但保留索引

时间:2019-04-08 05:42:58

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

将Spring Data与Redis一起使用时,遇到一种情况,它在#findAll调用中提供空对象。

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

对我来说,Spring Data似乎正在为#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

而且,如您所见,entry:1234_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中有一些设置可以删除条目时设置为清理索引?我找不到有关此的任何信息。

实体类如下:

@RedisHash("entry")
public class Entry {

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

我们只在#save上使用#deleteAll#deleteByIdCrudRepository

1 个答案:

答案 0 :(得分:0)

我已经在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清除所有数据集,然后再清除一些数据,然后重试。