设为首页 收藏本站
查看: 1237|回复: 0

[经验分享] 无锁内存nosql---Yac的实战

[复制链接]

尚未签到

发表于 2017-12-30 12:34:17 | 显示全部楼层 |阅读模式
无锁内存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
  下面简单介绍下安装:

  • wgethttps://pecl.php.net/get/yac-0.9.2.tgz
  • tar -zxvf yac-0.9.2.tgz
  • cd yac-0.9.2
  • phpize
  • ./config --prefix=/usr/local/yac --with-php-config=/usr/local/php/bin/php-config
  • sudo make && make install
  接下来配置php.ini文件:

  • vim /etc/php.ini
  • //添加一下内容
  • extension=php-yac.so
  • [yac]
  • yac.enable = 1 //是否开启yac,1表示开启, 0表示关闭
  • yac.keys_memory_size = 4M //4M可以得到32768个key, 32M可以得到262144个key
  • yac.values_memory_size = 64M //申请的最大value内存
  • yac.compress_threshold = -1 //是否压缩数据
  • yac.enable_cli = 0 //关闭在cli下使用yac
  最后重启Web Server服务器即可, windows下面安装yac扩展网上教程一大推,自己去搜索吧,这里不再赘余。。。
Yac的应用场景

  • 让PHP进程之间共享一些简单的数据
  • 高效地缓存一些页面结果
Yac的限制

  • 缓存的键长度不能超过48字节,太长的话可以md5结果后再使用
  • Value的最大长度不能超过64M,压缩后的长度不能超过1M
  • 当内存不够的时候, Yac会有比较明显的踢出率 (所以如果要使用Yac, 那么尽量多给点内存...)
Yac vs Memcache
  下面对Yac和Memcache进行性能比较:
  yac测试代码:

  • //test-yac.php
  • <?php
  • $yac = new Yac();
  • for($i = 1; $i <= 100; $i++){
  • $key = 'key_' . $i;
  • $value = mt_rand(0, 10000);
  • if( ! $yac->set($key, $value))
  • var_dump("Yac set error: $key --> $value");
  • }

  • for($i = 1; $i <= 100; $i++){
  • $key = 'key_' . $i;
  • $value = $yac->get($key);
  • if($value === false){
  • var_dump("Yac get error: $key not found");
  • }
  • }
  • ?>
  memcache测试代码:

  • //test-mem.php
  • <?php
  • $mem = new Memcache();
  • $mem->connect('localhost', 11211) or die('memcache connected error...');

  • for($i = 1; $i <= 100; $i++){
  • $key = 'key_' . $i;
  • $value = mt_rand(0, 10000);
  • if( ! $mem->set($key, $value))
  • var_dump("Memcache set error: $key --> $value");
  • }

  • for($i = 1; $i <= 100; $i++){
  • $key = 'key_' . $i;
  • $value = $mem->get($key);
  • if($value === false){
  • var_dump("Memcache get error: $key not found");
  • }
  • }
  • ?>
  然后对test-yac.php和test-mem.php文件分别进行ab压力测试:

  • ab -n 10000 -c 100 http://localhost/demo/test-yac.php
DSC0000.jpg


  • ab -n 10000 -c 100 http://localhost/demo/test-mem.php
DSC0001.jpg

  从上面的图中,可以看出结论了,Yac要比Memcache快很多,而且出错率很低,所以说Yac还是很不错的。
小结
  Yac很高效,但还是要注意一些方面,由于Yac是作为PHP的extension形式存在的,所以Yac只能在单机的多个进程之间共享缓存的,这一点一定要注意,一般用作第1级缓存。而在真实的生产环境下,由于服务器有很多,并且有可能是作为分布式集群形式存在,那个时候使用Memcache缓存服务器集群还是更好的选择或者作为第2级缓存(或者使用其他分布式缓存数据库,比如Redis等NoSQL非关系型数据库)。
  实际使用中,还是yac的高速+mc集群高可用高稳定+redis的高灵活的组合方式来实现大部分的基础功能。
  (end)

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-429659-1-1.html 上篇帖子: php 高并发解决方案(用于抢购) 转载 下篇帖子: PHP PSR 代码规范基本介绍
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表