1

memcached を初めて使用しようとしていますが、動的変数を使用したクエリに関していくつか質問があります。

これはこれまでの私のコードのサンプルです。すべてが機能しましたが、コードに誤りがあればお知らせください。

    <cfoutput>
    <cfset variables.memcachedFactory = createObject("component","memcachedfactory").init("127.0.0.1:11211")>
    <cfset variables.memcached = variables.memcachedFactory.getmemcached()>

    <cfset email = "sbcglobal"> //Pretend that this is a list with multiple choices for the user to choose from. 


//The query below would have multiple outputs based on the selection of the user above 
    <cfquery name="test" datasource="#ds#">
        select top 10 * from contact where email like '%#email#%'
    </cfquery>

//Setting the key
    <cfset set100 = variables.memcached.set(key="queryTest2",value=test,expiry="5000")>

//Getting the key
    <Cfset test6 = variables.memcached.get("queryTest2")>

    <br><br>this is the query test - did we retrieve it correctly?  - <br />

    <Cfdump var="#Test6#"><br />

    </cfoutput>

さて、クエリのすべての可能な結果に対してキーを設定する必要がありますか? (私の場合、考えられるすべての結果をカバーするには数百のキーになります)私の理解では、memcached は最初のリクエストの後に値をキーに保存し、その後は db 呼び出しなしで出力を取得します。私の場合に memcached を使用すると、ユーザーの選択に基づいて各クエリが異なるため、コードの無駄になりますか?

また、出力が変更された場合にキャッシュ内の値をどのように更新しますか? これは私が手動でしなければならないことですか?私のデータベースは毎日数百件のトランザクションを取得します。select * from contacts午前 10 時に、午後 5 時に同じ出力が得られません。

4

1 に答える 1

1

キャッシュ (この場合) の背後にある考え方は、最初に memcached をチェックし、キーが存在する場合はキャッシュからデータを取得することです。存在しない場合は、データベースに移動してデータを取得し、memcached に貼り付けてから、ユーザーに返します。

ここでのユース ケースでは、返す一意のレコード セットごとに一意のキーが必要です。あなたの例を見てください。レコード セットを識別するために使用している一意のキーがメール アドレスである場合は、それを memcached のキーとして使用します。擬似コード:

<cfset results = variables.memcached.set(key="foo_#email#",value=test,expiry="5000")>

foo_ を使用すると、memcached に入れるキーに「名前空間」を提供できます。これにより、キーの衝突の管理と回避が容易になります。

于 2013-01-16T17:09:43.443 に答える