gpt4 book ai didi

clojure - Carmine的wcar宏应该如何使用?

转载 作者:IT王子 更新时间:2023-10-29 05:55:30 26 4
gpt4 key购买 nike

我对应该如何使用胭脂红进行调用感到困惑。我在 carmine's docs 中找到了 wcar 宏:

(defmacro wcar [& body] `(car/with-conn pool spec-server1 ~@body))

除了 redis 命令之外,每次我想与 redis 对话时,我真的必须调用 wcar 吗?或者我可以在开始时只调用一次吗?如果是怎么办?

这是 tavisrudd 的 redis 库的一些代码的样子(来 self 的玩具 url 缩短器项目的测试套件):

(deftest test_shorten_doesnt_exist_create_new_next 
(redis/with-server test-server
(redis/set "url_counter" 51)
(shorten test-url)
(is (= "1g" (redis/get (str "urls|" test-url))))
(is (= test-url (redis/get "shorts|1g")))))

现在我只能通过这样写来让它与胭脂红一起工作:

(deftest test_shorten_doesnt_exist_create_new_next
(wcar (car/set "url_counter" 51))
(shorten test-url)
(is (= "1g" (wcar (car/get (str "urls|" test-url)))))
(is (= test-url (wcar (car/get "shorts|1g")))))

那么正确的使用方法是什么?我没有理解什么基本概念?

最佳答案

丹的解释是正确的。

Carmine 默认使用响应流水线,而 redis-clojure 需要您在需要时请求流水线(使用 pipeline 宏).

您需要流水线的主要原因是为了提高性能。 Redis 的速度如此之快,以至于使用它的瓶颈通常是请求+响应通过网络传输所花费的时间。

Clojure destructuring提供了一种处理流水线响应的便捷方法,但它确实需要编写与 redis-clojure 不同的代码。我写你的例子的方式是这样的(我假设你的 shorten fn 有副作用,需要在 GET 之前调用):

(deftest test_shorten_doesnt_exist_create_new_next
(wcar (car/set "url_counter" 51))
(shorten test-url)
(let [[response1 response2] (wcar (car/get (str "urls|" test-url))
(car/get "shorts|1g"))]
(is (= "1g" response1))
(is (= test-url response2))))

所以我们向 Redis 发送第一个 (SET) 请求并等待回复(我不确定这是否真的有必要)。然后,我们立即发送接下来的两个 (GET) 请求,允许 Redis 对响应进行排队,然后立即将它们全部接收回来,作为我们将解构的向量。

起初这似乎是不必要的额外工作,因为它要求您明确说明何时接收排队的响应,但它带来了很多好处,包括性能、清晰度和 composable commands .

如果您正在寻找我认为惯用的 Carmine 使用的示例,我会在 GitHub 上查看 Touchstone(只需搜索 wcar 调用) . (抱歉,SO 阻止我包含另一个链接)。

否则,如果您有任何其他问题,请给我发送电子邮件(或提交 GitHub 问题)。

关于clojure - Carmine的wcar宏应该如何使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14295548/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com