Home  >  Article  >  Backend Development  >  Memcache caching is actually not as good as direct File file caching?

Memcache caching is actually not as good as direct File file caching?

WBOY
WBOYOriginal
2016-07-30 13:30:591021browse

Use the local environment to test cache read and write 100,000 times and 1 million times. The test environment and results are as follows.

Environment

<code>W<span>in</span>7 x64 AMD7750双核 内存<span>8</span>G
Apache <span>2.4</span>.<span>9</span>
PHP <span>5.5</span>.<span>12</span> ts vc11 
memcache <span>2.2</span>.<span>7</span></code>

Code

<code><span><?php</span><span><span>function</span><span>convert</span><span>(<span>$size</span>)</span>
{</span><span>$unit</span> = <span>array</span>(<span>'b'</span>, <span>'kb'</span>, <span>'mb'</span>, <span>'gb'</span>, <span>'tb'</span>, <span>'pb'</span>);

    <span>return</span> @round(<span>$size</span> / pow(<span>1024</span>, (<span>$i</span> = floor(log(<span>$size</span>, <span>1024</span>)))), <span>2</span>) . <span>' '</span> . <span>$unit</span>[<span>$i</span>];
}

<span><span>function</span><span>cacheFile</span><span>(<span>$key</span>)</span>
{</span><span>$dir</span> = <span>'cache'</span>;
    <span>if</span> (!is_dir(<span>$dir</span>) && !mkdir(<span>$dir</span>)) {
        <span>throw</span><span>new</span><span>Exception</span>(<span>" can't make dir $dir"</span>);
    }

    <span>$filepath</span> = <span>$dir</span> . DIRECTORY_SEPARATOR . sprintf(<span>'%x'</span>, crc32(<span>$key</span>));

    <span>if</span> (!(file_exists(<span>$filepath</span>) && (<span>$data</span> = file_get_contents(<span>$filepath</span>)) && !<span>empty</span>(<span>$data</span>))) {
        <span>$data</span> = date(<span>'Y-m-d H:i:s'</span>);
        file_put_contents(<span>$filepath</span>, <span>$data</span>);
    }

    <span>return</span><span>$data</span>;
}


<span><span>function</span><span>cacheMem</span><span>(<span>$key</span>)</span>
{</span><span>$mem</span> = <span>new</span> Memcache();
    <span>$mem</span>->connect(<span>'127.0.0.1'</span>, <span>11211</span>);
    <span>$data</span> = <span>$mem</span>->get(<span>$key</span>);
    <span>if</span> (<span>empty</span>(<span>$data</span>)) {
        <span>$data</span> = date(<span>'Y-m-d H:i:s'</span>);
        <span>$mem</span>->set(<span>$key</span>, <span>$data</span>);
    }

    <span>return</span><span>$data</span>;
}


<span>$t1</span> = microtime(<span>true</span>);
<span>$i</span> = <span>0</span>;
<span>$limit</span> = <span>1000</span> * <span>100</span>; <span>//10 万次</span><span>$data</span> = <span>null</span>;
<span>while</span> (<span>$i</span> < <span>$limit</span>) {
<span>//    $data = cacheFile($i);</span><span>$data</span> = cacheMem(<span>$i</span>);
    <span>$i</span>++;
}
<span>$timeUse</span> = microtime(<span>true</span>) - <span>$t1</span>;
<span>$arr</span> = [
    <span>'cost'</span> => sprintf(<span>'%.7fs'</span>, <span>$timeUse</span>),
    <span>'mem'</span> => convert(memory_get_usage())
];
var_dump(<span>$arr</span>);
</span></code>

Result 10,000 times

<code>            花费时间           内存耗费
File        <span>1.9</span><span>sec</span><span>250</span>kb
Memcache    <span>11</span><span>sec</span><span>250</span>kb</code>

Result 100,000 times

<code>            花费时间    内存耗费
<span>File</span><span>94</span>s        <span>251.18</span>KB
Memcache    超时<span>120</span>s 报错 
</code>

Memcache 100,000 times the test failed, the error message is as follows

<code>Warning: Memcache::connect(): <span>in</span> D:\localhost\speed.php <span><span>on</span><span>line</span><span>37</span></span>
Warning: Memcache::<span>get</span>(): No servers added <span>to</span> memcache connection <span>in</span> D:\localhost\speed.php
Warning: Memcache::<span>set</span>(): No servers added <span>to</span> memcache connection <span>in</span> D:\localhost\speed.php <span><span>on</span><span>line</span><span>41</span></span>
Fatal error: Maximum execution <span>time</span><span>of</span><span>120</span><span>seconds</span> exceeded <span>in</span> D:\localhost\speed.php <span><span>on</span><span>line</span><span>38</span></span></code>

Conclusion

memcache is used for caching but not yet Direct File file caching is fast. The reason why I did this test is because during the interview, I answered that I did not use this memcache for caching, but directly used File file caching (single server). The result was directly recognized by the technical officer as Very good Rookie . But I passed this test, even though it is under win, why is the performance of Memcahe not as good as File?
Or is there something wrong with the way I tested? Solution default.fu@foxmail.com

Copyright statement: This article is an original article by the blogger and may not be reproduced without the blogger's permission.

The above has introduced that Memcache caching is not as good as direct File file caching? , including relevant content, I hope it will be helpful to friends who are interested in PHP tutorials.

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn