Создайте пустой отсортированный набор в Redis

Есть ли простой способ создать пустой отсортированный набор в Redis? В документации указано

Если ключ не существует, создается новый отсортированный набор с указанными элементами в качестве единственных элементов, как если бы отсортированный набор был пустым. Если ключ существует, но не содержит отсортированного множества, возвращается ошибка.

Однако это не говорит о том, что вы можете создать пустой отсортированный набор. Следующее не создает пустой отсортированный набор:

127.0.0.1:6379> zadd likes:0 1 one
(integer) 1
127.0.0.1:6379> exists likes:0
(integer) 1
127.0.0.1:6379> zcard likes:0
(integer) 1
127.0.0.1:6379> dbsize
(integer) 1
127.0.0.1:6379> zrem likes:0 one
(integer) 1
127.0.0.1:6379> exists likes:0
(integer) 0

Вариант использования — надежный перенос данных из другой базы данных в Redis, а именно в Postgres:

  1. Когда сообщение создано, создайте пустой отсортированный набор likes:<postId>
  2. Когда лайк создан, выполните zadd likes:<postId> <createdAt> <userId>, если exists likes:<postId. В противном случае запросите у Postgres лайки и сохраните их в likes:<postId>.

Создание пустого отсортированного набора включает утверждение, которое удаляет избыточный запрос к Postgres при первом лайке этого сообщения, но по-прежнему поддерживает сообщения, которые еще не были перенесены в Redis. Эта оптимизация сэкономит нашей базе данных более 100 000 чтений в день.


person Garrett    schedule 26.03.2015    source источник


Ответы (1)


Если ключ не существует, он ведет себя как пустой экземпляр любого типа. В вашем случае вы можете избежать вызова EXISTS likes:<postId> и предположить, что ключ есть, потому что результирующее поведение будет таким же: когда вы добавляете члена, список будет создан, если он не существовал до этого момента.

person soveran    schedule 26.03.2015
comment
Это не отличается от случая, когда список пуст, потому что (1) в нем не должно быть никаких данных и (2) он еще не заполнен данными. Смысл в том, что EXISTS likes:<postId> возвращает 1 для пустого, но инициализированного ключа, заключается в том, чтобы избежать повторного запроса к постоянному хранилищу, когда это было сделано раньше. - person Garrett; 07.04.2015
comment
Возможно, вам нужно растровое изображение идентификаторов, которые вы уже перенесли. Вы не сможете использовать EXISTS в пустом списке. Дайте мне знать, если вам нужно объяснение того, как использовать растровые изображения для вашего варианта использования. - person soveran; 08.04.2015
comment
Допустим, у вас есть ключ с именем migrated:posts. Вы можете использовать SETBIT и GETBIT, чтобы отслеживать, было ли сообщение перенесено. Команда SETBIT migrated:posts <postId> 1 пометит запись как перенесенную. Чтобы получить значение, используйте GETBIT migrated:posts <postId>. Если вы получаете 1, это означает, что он был перенесен, иначе вы получите 0. Ознакомьтесь с этими командами для получения дополнительной информации и не стесняйтесь обращаться ко мне за разъяснениями. - person soveran; 09.04.2015
comment
@soveran обожаю это :) - person Itamar Haber; 09.04.2015
comment
Блестяще :D Спасибо! - person Garrett; 10.04.2015