• 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)

  • 相关阅读:
    如何避免delete和delete[]的尴尬?
    笔面集锦:判断单链表里面是否有环及相关扩展题(转)
    各排序算法的C++实现与性能测试(转)
    五个好的C语言编程实践
    Reviewboard管理员指南(5.5)—— Permission Groups(重要)
    Jenkins CLI getjob与RoleBased Strategy的那点事
    Reviewboard管理员指南(5.4)—— Default Reviewers(重要)
    Reviewboard管理员指南(4.2)—— Administrator Dashboard
    Maven Nexus admin密码重置的方法
    Reviewboard管理员指南(5.2)—— Access Control(重要)
  • 原文地址:https://www.cnblogs.com/sunsky303/p/6554888.html
Copyright © 2020-2023  润新知