zoukankan      html  css  js  c++  java
  • PHP无锁内存nosql---Yac的实战

    无锁内存nosql---Yac的实战

      

      最近在工作使用了yac,所以比较了下Memcache和Yac的高并发读写性能测试,发现Yac要比Memcache快很多(这里没有比较Yac和Apc的性能情况, 不过据说Yac要比Apc快很多,Apc比Memcache快一倍)。

      首先说下,Yac是无锁的、共享内存的Cache,因此可以减少CPU的消耗,而Memcache压力测试时CPU直接飙升到 ~100%。。。。

      想学习的同学可以参考鸟哥@laruence的博客: http://www.laruence.com/2013/03/18/2846.html    github 地址:https://github.com/laruence/yac

    下面简单介绍下安装:

    1. wgethttps://pecl.php.net/get/yac-0.9.2.tgz
    2. tar -zxvf yac-0.9.2.tgz
    3. cd yac-0.9.2
    4. phpize
    5. ./config --prefix=/usr/local/yac --with-php-config=/usr/local/php/bin/php-config
    6. sudo make && make install

    接下来配置php.ini文件:

    1. vim /etc/php.ini
    2. //添加一下内容
    3. extension=php-yac.so
    4. [yac]
    5. yac.enable = 1 //是否开启yac,1表示开启, 0表示关闭
    6. yac.keys_memory_size = 4M //4M可以得到32768个key, 32M可以得到262144个key
    7. yac.values_memory_size = 64M //申请的最大value内存
    8. yac.compress_threshold = -1 //是否压缩数据
    9. yac.enable_cli = 0 //关闭在cli下使用yac

    最后重启Web Server服务器即可, windows下面安装yac扩展网上教程一大推,自己去搜索吧,这里不再赘余。。。

    Yac的应用场景

    1. 让PHP进程之间共享一些简单的数据
    2. 高效地缓存一些页面结果

    Yac的限制

    1. 缓存的键长度不能超过48字节,太长的话可以md5结果后再使用
    2. Value的最大长度不能超过64M,压缩后的长度不能超过1M
    3. 当内存不够的时候, Yac会有比较明显的踢出率 (所以如果要使用Yac, 那么尽量多给点内存...)

    Yac vs Memcache

    下面对Yac和Memcache进行性能比较:

    yac测试代码:

    1. //test-yac.php
    2. <?php
    3. $yac = new Yac();
    4. for($i = 1; $i <= 100; $i++){
    5. $key = 'key_' . $i;
    6. $value = mt_rand(0, 10000);
    7. if( ! $yac->set($key, $value))
    8. var_dump("Yac set error: $key --> $value");
    9. }
    10. for($i = 1; $i <= 100; $i++){
    11. $key = 'key_' . $i;
    12. $value = $yac->get($key);
    13. if($value === false){
    14. var_dump("Yac get error: $key not found");
    15. }
    16. }
    17. ?>

    memcache测试代码:

    1. //test-mem.php
    2. <?php
    3. $mem = new Memcache();
    4. $mem->connect('localhost', 11211) or die('memcache connected error...');
    5. for($i = 1; $i <= 100; $i++){
    6. $key = 'key_' . $i;
    7. $value = mt_rand(0, 10000);
    8. if( ! $mem->set($key, $value))
    9. var_dump("Memcache set error: $key --> $value");
    10. }
    11. for($i = 1; $i <= 100; $i++){
    12. $key = 'key_' . $i;
    13. $value = $mem->get($key);
    14. if($value === false){
    15. var_dump("Memcache get error: $key not found");
    16. }
    17. }
    18. ?>

    然后对test-yac.php和test-mem.php文件分别进行ab压力测试:

    1. ab -n 10000 -c 100 http://localhost/demo/test-yac.php

    pic

    1. ab -n 10000 -c 100 http://localhost/demo/test-mem.php

    pic

    从上面的图中,可以看出结论了,Yac要比Memcache快很多,而且出错率很低,所以说Yac还是很不错的。


    小结

      Yac很高效,但还是要注意一些方面,由于Yac是作为PHP的extension形式存在的,所以Yac只能在单机的多个进程之间共享缓存的,这一点一定要注意,一般用作第1级缓存。而在真实的生产环境下,由于服务器有很多,并且有可能是作为分布式集群形式存在,那个时候使用Memcache缓存服务器集群还是更好的选择或者作为第2级缓存(或者使用其他分布式缓存数据库,比如Redis等NoSQL非关系型数据库)。

      实际使用中,还是yac的高速+mc集群高可用高稳定+redis的高灵活的组合方式来实现大部分的基础功能。

    (end)

  • 相关阅读:
    URAL 1998 The old Padawan 二分
    URAL 1997 Those are not the droids you're looking for 二分图最大匹配
    URAL 1995 Illegal spices 贪心构造
    URAL 1993 This cheeseburger you don't need 模拟题
    URAL 1992 CVS
    URAL 1991 The battle near the swamp 水题
    Codeforces Beta Round #92 (Div. 1 Only) A. Prime Permutation 暴力
    Codeforces Beta Round #7 D. Palindrome Degree hash
    Codeforces Beta Round #7 C. Line Exgcd
    Codeforces Beta Round #7 B. Memory Manager 模拟题
  • 原文地址:https://www.cnblogs.com/sunsky303/p/6554888.html
Copyright © 2011-2022 走看看