Есть ли простой способ создать пустой отсортированный набор в 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:
- Когда сообщение создано, создайте пустой отсортированный набор
likes:<postId>
- Когда лайк создан, выполните
zadd likes:<postId> <createdAt> <userId>
, еслиexists likes:<postId
. В противном случае запросите у Postgres лайки и сохраните их вlikes:<postId>
.
Создание пустого отсортированного набора включает утверждение, которое удаляет избыточный запрос к Postgres при первом лайке этого сообщения, но по-прежнему поддерживает сообщения, которые еще не были перенесены в Redis. Эта оптимизация сэкономит нашей базе данных более 100 000 чтений в день.