10

カーマインとの呼び出しがどのように行われるべきかについて私は混乱しています。私はcarmineのドキュメントwcarで説明されているマクロを見つけました:

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

wcarredisコマンドに加えてredisと話したいときは、本当に電話をかける必要がありますか?それとも、最初に一度だけ呼び出すことはできますか?もしそうなら、どのように?

これは、tavisruddのredisライブラリを含むいくつかのコードがどのように見えるかです(私のおもちゃの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")))))

それで、それを使用する正しい方法は何ですか、そして私が得ていない根本的な概念は何ですか?

4

2 に答える 2

9

ダンの説明は正しい。

Carmineデフォルトでは応答パイプラインを使用しますが、redis-clojure必要なときに(pipelineマクロを使用して)パイプラインを要求する必要があります。

パイプライン処理が必要な主な理由は、パフォーマンスのためです。Redisは非常に高速であるため、Redisを使用する際のボトルネックは、多くの場合、要求と応答がネットワーク上を移動するのにかかる時間です。

Clojureの破棄は、パイプライン化された応答を処理する便利な方法を提供しますが、コードをとは異なる方法で記述する必要がありますredis-clojure。私があなたの例を書く方法は次のようなものです(あなたのshortenfnには副作用があり、GETsの前に呼び出す必要があると思います):

(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))))

そのため、最初の(SET)リクエストをRedisに送信し、応答を待っています(ここで実際に必要かどうかはわかりません)。次に、次の2つの(GET)リクエストを一度に送信し、Redisがレスポンスをキューに入れることを許可してから、デストラクチャリングするベクターとしてそれらすべてを一度に受信します。

キューに入れられた応答をいつ受信するかを明示する必要があるため、最初は不必要な余分な作業のように見えるかもしれませんが、パフォーマンス、明快さ、構成可能なコマンドなど、多くの利点があります。

慣用的な使用法の例を探している場合は、GitHubでTouchstoneをチェックしてください(呼び出しCarmineを検索するだけです)。wcar(申し訳ありませんが、SOは私が別のリンクを含めることを妨げています)。

それ以外の場合は、他に質問がある場合は、私にメールを送信してください(またはGitHubの問題を提出してください)。

于 2013-01-16T08:09:18.797 に答える
6

心配しないでください、あなたはすでにそれを正しい方法で使用しています。

Redisリクエスト関数(上記で使用しているgetやsetなど)はすべてsend-request!、動的にバインドされて接続を提供することに依存する別の関数を介してルーティングされ*context*ます。そのコンテキストなしでこれらのRedisコマンドのいずれかを呼び出そうとすると、「コンテキストなし」エラーで失敗します。with-connマクロ(で使用される)は、そのwcarコンテキストを設定し、接続を提供します。

この場合、マクロは、すべてのRedisリクエストに同じ接続の詳細を使用することを前提としたwcar単なる薄いラッパーです。with-conn

これまでのところ、これはすべてTavisRuddのredis-clojureの動作と非常によく似ています。

wcarでは、問題は、Redis-Clojureが1つしか必要としないのに、なぜCarmineが複数を必要とするのwith-serverかということです。

そして答えは、そうではないということです。時々は別として、そうするとき。Carmine'swith-connは、Redisの「パイプライン」を使用して、同じ接続で複数のリクエストを送信し、応答をベクターにパッケージ化します。READMEの例は、これが実際に動作していることを示しています。

(wcar (car/ping)
      (car/set "foo" "bar")
      (car/get "foo"))
=> ["PONG" "OK" "bar"]

ここでは、が表示され、ping要求の送信のみに関係し、応答の受信は最大でになります。これにより、wcarの内部からのアサート(または結果へのアクセス)が排除され、要求と複数の呼び出しが分離されます。setgetwcarwcar

于 2013-01-13T01:58:46.427 に答える