Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 胭脂红';是否使用wcar宏?_Clojure_Redis_Carmine - Fatal编程技术网

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's
with 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))))