将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
,#deleteById
,CrudRepository
。
答案 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
清除所有数据集,然后再清除一些数据,然后重试。