php中判断memcache中key,value是否存在

1.memcache简介

memcache是一套分布式高速缓存软件,用于数据缓存及分布式网站session存储等。使用key=>value方式存储,支持数据压缩存储处理及数据过期处理。
value只支持string,如需要其他格式,可以先转换为json再保存。

使用方法:

<code class="hljs xml has-numbering"><span class="php"><span class="hljs-preprocessor"><?php</span>
<span class="hljs-variable">$m</span> = <span class="hljs-keyword">new</span> Memcache;
<span class="hljs-variable">$m</span>->connect(<span class="hljs-string">'localhost'</span>, <span class="hljs-number">11211</span>);

<span class="hljs-variable">$m</span>->set(<span class="hljs-string">'foo'</span>, <span class="hljs-number">100</span>); <span class="hljs-comment">// 保存数据</span>
<span class="hljs-keyword">echo</span> <span class="hljs-variable">$m</span>->get(<span class="hljs-string">'foo'</span>); <span class="hljs-comment">// 读取数据</span>
<span class="hljs-preprocessor">?></span></span></code><code class="hljs xml has-numbering"><span class="php"><span class="hljs-preprocessor"></span></span></code><ul class="pre-numbering" style=""><li><pre class="prettyprint" name="code"><code class="hljs xml has-numbering"><span class="php"><span class="hljs-preprocessor"><?php</span>
<span class="hljs-variable">$m</span> = <span class="hljs-keyword">new</span> Memcache;
<span class="hljs-variable">$m</span>->connect(<span class="hljs-string">'localhost'</span>, <span class="hljs-number">11211</span>);

<span class="hljs-variable">$m</span>->set(<span class="hljs-string">'foo'</span>, <span class="hljs-number">100</span>); <span class="hljs-comment">// 保存数据</span>
<span class="hljs-keyword">echo</span> <span class="hljs-variable">$m</span>->get(<span class="hljs-string">'foo'</span>); <span class="hljs-comment">// 读取数据</span>
<span class="hljs-preprocessor">?></span></span></code>
    <code class="hljs xml has-numbering"><span class="php"><span class="hljs-preprocessor"><?php</span>
    <span class="hljs-variable">$m</span> = <span class="hljs-keyword">new</span> Memcache;
    <span class="hljs-variable">$m</span>->connect(<span class="hljs-string">'localhost'</span>, <span class="hljs-number">11211</span>);
    
    <span class="hljs-variable">$m</span>->set(<span class="hljs-string">'foo'</span>, <span class="hljs-number">100</span>); <span class="hljs-comment">// 保存数据</span>
    <span class="hljs-keyword">echo</span> <span class="hljs-variable">$m</span>->get(<span class="hljs-string">'foo'</span>); <span class="hljs-comment">// 读取数据</span>
    <span class="hljs-preprocessor">?></span></span></code>
     
    

    用memcache作为数据缓存,步骤一般是 1.判断memcache是否有数据,如果有则直接返回,否则从数据源中获取数据。 2.从数据源获取数据后,写入memcache作为缓存,留待下次请求时使用。

    2.判断memcache数据是否存在

    判断memcache是否有数据,一般是通过get方法获取数据,根据数据是否false来判断。

    <code class="hljs xml has-numbering"><span class="php"><span class="hljs-preprocessor"><?php</span>
    <span class="hljs-variable">$m</span> = <span class="hljs-keyword">new</span> Memcache;
    <span class="hljs-variable">$m</span>->connect(<span class="hljs-string">'localhost'</span>, <span class="hljs-number">11211</span>);
    
    <span class="hljs-variable">$m</span>->set(<span class="hljs-string">'foo'</span>, <span class="hljs-number">100</span>);
    <span class="hljs-keyword">if</span>(<span class="hljs-variable">$m</span>->get(<span class="hljs-string">'foo'</span>)){
        <span class="hljs-keyword">echo</span> <span class="hljs-string">'foo 存在<br>'</span>;
    }<span class="hljs-keyword">else</span>{
        <span class="hljs-keyword">echo</span> <span class="hljs-string">'foo 不存在<br>'</span>;
    }
    
    <span class="hljs-variable">$m</span>->delete(<span class="hljs-string">'foo'</span>);
    <span class="hljs-keyword">if</span>(<span class="hljs-variable">$m</span>->get(<span class="hljs-string">'foo'</span>)){
        <span class="hljs-keyword">echo</span> <span class="hljs-string">'foo 存在<br>'</span>;
    }<span class="hljs-keyword">else</span>{
        <span class="hljs-keyword">echo</span> <span class="hljs-string">'foo 不存在<br>'</span>;
    }
    <span class="hljs-preprocessor">
    </span></span></code><pre class="prettyprint" name="code"><code class="hljs xml has-numbering"><span class="php"><span class="hljs-preprocessor"><?php</span>
    <span class="hljs-variable">$m</span> = <span class="hljs-keyword">new</span> Memcache;
    <span class="hljs-variable">$m</span>->connect(<span class="hljs-string">'localhost'</span>, <span class="hljs-number">11211</span>);
    
    <span class="hljs-variable">$m</span>->set(<span class="hljs-string">'foo'</span>, <span class="hljs-number">100</span>);
    <span class="hljs-keyword">if</span>(<span class="hljs-variable">$m</span>->get(<span class="hljs-string">'foo'</span>)){
        <span class="hljs-keyword">echo</span> <span class="hljs-string">'foo 存在<br>'</span>;
    }<span class="hljs-keyword">else</span>{
        <span class="hljs-keyword">echo</span> <span class="hljs-string">'foo 不存在<br>'</span>;
    }
    
    <span class="hljs-variable">$m</span>->delete(<span class="hljs-string">'foo'</span>);
    <span class="hljs-keyword">if</span>(<span class="hljs-variable">$m</span>->get(<span class="hljs-string">'foo'</span>)){
        <span class="hljs-keyword">echo</span> <span class="hljs-string">'foo 存在<br>'</span>;
    }<span class="hljs-keyword">else</span>{
        <span class="hljs-keyword">echo</span> <span class="hljs-string">'foo 不存在<br>'</span>;
    }
    <span class="hljs-preprocessor">?></span></span></code>

     
    

    但这样判断不够严谨,如果value是false或null时则会被判断为不存在,我们可以通过判断key是否存在来判断数据是否存在。

    3.判断memcache key是否存在

    <code class="hljs xml has-numbering"><span class="php"><span class="hljs-preprocessor"><?php</span>
    <span class="hljs-variable">$m</span> = <span class="hljs-keyword">new</span> Memcache;
    <span class="hljs-variable">$m</span>->connect(<span class="hljs-string">'localhost'</span>, <span class="hljs-number">11211</span>);
    
    <span class="hljs-comment">// 正常值判断</span>
    <span class="hljs-keyword">echo</span> <span class="hljs-string">'正常值判断:'</span>;
    <span class="hljs-variable">$m</span>->set(<span class="hljs-string">'foo'</span>, <span class="hljs-number">100</span>);
    <span class="hljs-keyword">if</span>(check_key_exists(<span class="hljs-variable">$m</span>, <span class="hljs-string">'foo'</span>)){
        <span class="hljs-keyword">echo</span> <span class="hljs-string">'foo key存在<br>'</span>;
    }<span class="hljs-keyword">else</span>{
        <span class="hljs-keyword">echo</span> <span class="hljs-string">'foo key不存在<br>'</span>;
    }
    
    <span class="hljs-comment">// false判断</span>
    <span class="hljs-keyword">echo</span> <span class="hljs-string">'false判断:'</span>;
    <span class="hljs-variable">$m</span>->set(<span class="hljs-string">'foo'</span>, <span class="hljs-keyword">false</span>);
    <span class="hljs-keyword">if</span>(check_key_exists(<span class="hljs-variable">$m</span>, <span class="hljs-string">'foo'</span>)){
        <span class="hljs-keyword">echo</span> <span class="hljs-string">'foo key存在<br>'</span>;
    }<span class="hljs-keyword">else</span>{
        <span class="hljs-keyword">echo</span> <span class="hljs-string">'foo key不存在<br>'</span>;
    }
    
    <span class="hljs-comment">// null判断</span>
    <span class="hljs-keyword">echo</span> <span class="hljs-string">'null判断:'</span>;
    <span class="hljs-variable">$m</span>->set(<span class="hljs-string">'foo'</span>, <span class="hljs-keyword">null</span>);
    <span class="hljs-keyword">if</span>(check_key_exists(<span class="hljs-variable">$m</span>, <span class="hljs-string">'foo'</span>)){
        <span class="hljs-keyword">echo</span> <span class="hljs-string">'foo key存在<br>'</span>;
    }<span class="hljs-keyword">else</span>{
        <span class="hljs-keyword">echo</span> <span class="hljs-string">'foo key不存在<br>'</span>;
    }
    
    <span class="hljs-comment">// 数据过期后判断,1秒后过期</span>
    <span class="hljs-keyword">echo</span> <span class="hljs-string">'过期判断:'</span>;
    <span class="hljs-variable">$m</span>->set(<span class="hljs-string">'foo'</span>, <span class="hljs-number">100</span>, <span class="hljs-number">0</span>, <span class="hljs-number">1</span>);
    sleep(<span class="hljs-number">2</span>);
    <span class="hljs-keyword">if</span>(check_key_exists(<span class="hljs-variable">$m</span>, <span class="hljs-string">'foo'</span>)){
        <span class="hljs-keyword">echo</span> <span class="hljs-string">'foo key存在<br>'</span>;
    }<span class="hljs-keyword">else</span>{
        <span class="hljs-keyword">echo</span> <span class="hljs-string">'foo key不存在<br>'</span>;
    }
    
    <span class="hljs-comment">// delete后判断</span>
    <span class="hljs-keyword">echo</span> <span class="hljs-string">'delete后判断:'</span>;
    <span class="hljs-variable">$m</span>->set(<span class="hljs-string">'foo'</span>, <span class="hljs-number">100</span>);
    <span class="hljs-variable">$m</span>->delete(<span class="hljs-string">'foo'</span>);
    <span class="hljs-keyword">if</span>(check_key_exists(<span class="hljs-variable">$m</span>, <span class="hljs-string">'foo'</span>)){
        <span class="hljs-keyword">echo</span> <span class="hljs-string">'foo key存在<br>'</span>;
    }<span class="hljs-keyword">else</span>{
        <span class="hljs-keyword">echo</span> <span class="hljs-string">'foo key不存在<br>'</span>;
    }
    
    <span class="hljs-comment">/**
     *<span class="hljs-phpdoc"> @param</span> Obj      $m    memcache obj
     *<span class="hljs-phpdoc"> @param</span> String   $name key name
     *<span class="hljs-phpdoc"> @return</span> Boolean
     */</span>
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">check_key_exists</span><span class="hljs-params">(<span class="hljs-variable">$m</span>, <span class="hljs-variable">$name</span>)</span>{</span>
        <span class="hljs-variable">$data</span> = <span class="hljs-variable">$m</span>->get(<span class="hljs-variable">$name</span>);
        <span class="hljs-keyword">return</span> <span class="hljs-variable">$data</span>!==<span class="hljs-keyword">false</span>;
    }
    <span class="hljs-preprocessor">?></span></span></code>

    输出:
    正常值判断:foo key存在
    false判断:foo key存在
    null判断:foo key存在
    过期判断:foo key不存在
    delete后判断:foo key不存在


    只有key被delete已经过期才判断为不存在,其他情况即使value为null/false,都是存在的。

    注意:如果value的值是false,使用memcache get方法获取到的是“”空字符串,因为memcache只能保存string数据,所以false在保存时被转为空字符串了。

    • 0
      点赞
    • 0
      收藏
      觉得还不错? 一键收藏
    • 0
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值