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 是否只是浪费代码,因为每个查询都会根据用户的选择而有所不同?

另外,如果输出发生变化,如何更新缓存中的值?这是我必须手动做的事情吗?我的数据库每天有 100 笔交易,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_ lets you provide a "namespace" for the keys you are putting into memcached, which makes it easier to manage and avoid key collisions.

于 2013-01-16T17:09:43.443 回答