使用taoensso.carmine检查多个键的存在

时间:2016-09-28 14:26:07

标签: clojure redis carmine

我正在使用taoensso.carmine redis客户端并希望实现以下内容:给定序列s,获取其在redis中不存在的所有元素。 (我的意思是redis&#39的EXISTS命令返回false)

起初我想做以下事情:

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

但它会返回car / exists响应的序列,而不是按照它们过滤我的序列

(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 个答案:

答案 0 :(得分:0)

您的remove功能很懒,所以它不会做任何事情。您也无法在wcar宏中进行数据操作,所以我会这样:

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

答案 1 :(得分:-1)

你能重新检查一下你是第一个解决方案吗?我不知道wcar做了什么,但是这个例子表明你正走在正确的轨道上:

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

匿名函数#(odd? %)会返回truefalse个结果,这些结果用于确定要保留的数字。但是,它是(remove...)返回的原始数字,而不是真/假。