Spring Data Redis удаляет записи (хэши), но оставляет индексы - PullRequest
0 голосов
/ 08 апреля 2019

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

1 Ответ

0 голосов
/ 08 апреля 2019

Я проверил на своем клиенте, пожалуйста, посмотрите на результат ниже:

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 для очистки всех ваших наборов данных, затем некоторые данные, а затем повторите попытку.

...