Используйте taoensso.carmine, чтобы проверить наличие нескольких ключей

Я использую клиент redis taoensso.carmine и хочу добиться следующего: заданная последовательность s, получить все его элементы, которые не существуют в Redis. (Я имею в виду, для которого команда EXISTS Redis возвращает false)

Сначала я подумал сделать следующее:

(wcar conn
  (remove #(car/exists %) s))

но он возвращает последовательность авто / существующих ответов, а не фильтрует мою последовательность по ним

(remove #(wcar conn (car exists %)) s)

Выполняет работу, но занимает много времени, потому что нет конвейера и каждый раз используется новое соединение.

Итак, я заканчиваю некоторые запутанные манипуляции с картой ниже, но я считаю, что должен быть более простой способ добиться этого. Как?

(let [s (range 1 100)
      existance (wcar conn
                      (doall
                       (for [i s]
                         (car/exists i))))
      existance-map (zipmap s existance)]
  (mapv first (remove (fn [[k v]] (= v 1)) existance-map)))

2 ответа

Ваш remove функция ленива, поэтому она ничего не сделает. Вы также не можете манипулировать данными внутри wcar макрос, так что я бы так что-то вроде этого:

(let [keys ["exists" "not-existing"]]
  (zipmap keys
          (mapv pos?
                (car/wcar redis-db
                          (mapv (fn [key]
                                  (car/exists key))
                                keys)))))

Не могли бы вы пересмотреть свое первое решение? Я не знаю что wcar делает, но этот пример показывает, что вы на правильном пути:

> (remove #(odd? %) (range 9))
(0 2 4 6 8)

Анонимная функция #(odd? %) либо возвращает true или же false результаты, которые используются, чтобы определить, какие цифры сохранить. Тем не менее, это оригинальные цифры, которые возвращаются (remove...), не правда / ложь.

Другие вопросы по тегам