При использовании 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
.