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在保存时被转为空字符串了。