0

我正在使用 taoensso.carmine redis 客户端并希望实现以下目标:给定 sequence s,获取 redis 中不存在的所有元素。(我的意思是redis的EXISTS命令返回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)))
4

2 回答 2

0

你的remove函数是惰性的,所以它不会做任何事情。您也不能在wcar宏内部进行数据操作,所以我会这样:

(let [keys ["exists" "not-existing"]]
  (zipmap keys
          (mapv pos?
                (car/wcar redis-db
                          (mapv (fn [key]
                                  (car/exists key))
                                keys)))))
于 2016-09-30T07:40:20.743 回答
-1

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

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

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

于 2016-09-28T15:58:59.567 回答