Используйте 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...)
, не правда / ложь.