Clojure 胭脂红';是否使用wcar宏?
我不知道怎么打卡门电话。我找到了中描述的Clojure 胭脂红';是否使用wcar宏?,clojure,redis,carmine,Clojure,Redis,Carmine,我不知道怎么打卡门电话。我找到了中描述的wcar宏: 除了redis命令之外,我真的需要每次与redis通话时都调用wcar?或者我可以一开始就说一次吗?如果是,怎么做 这是tavisrudd的redis库中的一些代码的样子(来自我的玩具url shortener项目的测试套件): 现在我只能这样写,才能让它与《胭脂红》一起工作: (deftest test_shorten_doesnt_exist_create_new_next (wcar (car/set "url_counter" 5
wcar
宏:
除了redis命令之外,我真的需要每次与redis通话时都调用wcar
?或者我可以一开始就说一次吗?如果是,怎么做
这是tavisrudd的redis库中的一些代码的样子(来自我的玩具url shortener项目的测试套件):
现在我只能这样写,才能让它与《胭脂红》一起工作:
(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")))))
那么,使用它的正确方式是什么?我没有得到什么基本概念?别担心,你已经在正确地使用它了 Redis请求函数(如上面使用的get和set)都通过另一个函数路由,该函数依赖于动态绑定的
*上下文*
来提供连接。尝试在没有该上下文的情况下调用这些Redis命令中的任何一个都将失败,并出现“无上下文”错误。宏(用于wcar
)设置该上下文并提供连接
然后,wcar
宏只是的一个薄薄包装,conn
假设您将对所有Redis请求使用相同的连接详细信息
到目前为止,这一切都非常类似于陆克文的工作方式
所以,现在的问题是,为什么Carmine需要多个wcar
,而Redis Clojure只需要一个带有服务器的
答案是,事实并非如此。除了有时,当它发生的时候。Carmine'swith conn
使用Redis's以相同的连接发送多个请求,然后将响应打包成一个向量。自述文件中的示例说明了这一点
(wcar (car/ping)
(car/set "foo" "bar")
(car/get "foo"))
=> ["PONG" "OK" "bar"]
在这里,您将看到ping
、set
和get
只与发送请求有关,将响应的接收留给wcar
。这排除了wcar内部的断言(或任何结果访问),并导致分离请求和您拥有的多个wcar
调用。Dan的解释是正确的
默认情况下,Carmine
使用响应管道,而redis clojure
要求您在需要时请求管道(使用pipeline
宏)
您希望使用管道的主要原因是为了性能。Redis速度如此之快,使用它的瓶颈往往是请求+响应在网络上传输所需的时间
提供了一种处理流水线响应的方便方法,但它确实需要以不同的方式编写代码,以redis clojure
。我编写示例的方式是这样的(我假设您的shorten
fn有副作用,需要在GET
s之前调用):
因此,我们将第一个(SET
)请求发送到Redis并等待回复(我不确定这里是否真的需要)。然后,我们一次发送下两个(GET
)请求,允许Redis将响应排队,然后将它们作为一个向量一次性接收回来,我们将对其进行分解
起初,这似乎是不必要的额外工作,因为它要求您明确何时接收排队响应,但它带来了很多好处,包括性能、清晰度和可用性
我会在GITHUB上查看试金石,如果你正在寻找一个我认为惯用的代码“代码>卡迈恩< /Cord>”的例子(只需搜索<代码> WCAR < /COD>调用)。(很抱歉,因此阻止我包含另一个链接)
否则,如果您有任何其他问题,请向我发送电子邮件(或提交GitHub问题)。谢谢。有没有办法让redis clojure的功能与胭脂红类似?也就是说,对于每一大块代码,我只想说一次我想使用哪一个redis上下文?比如在测试用例的例子中?有点。但你可能对此不满意。您可以将除断言之外的所有断言放在wcar块中。Redis的响应将以向量的形式从wcar返回,您的断言将需要对此采取行动。我无法从代码中看出您的shorten
函数实现了什么,但您应该可以在wcar中运行该函数(以及任何其他函数)。我应该补充一点,即使这是可能的,但这并不意味着我推荐它。我真的建议保持wcar范围尽可能小。非常感谢。现在我明白了为什么这种方法更好了,因为当连接实际发生时,它会让事情变得显而易见。
(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")))))
(wcar (car/ping)
(car/set "foo" "bar")
(car/get "foo"))
=> ["PONG" "OK" "bar"]
(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))))