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

小编 2026-07-07 阅读:1445 评论:0
无锁内存nosql---Yac的实战    最近在工作使用了yac,所以比较了下Memcache...

无锁内存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

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

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

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

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


小结

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

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

(end)

谋胆并重
版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

上一篇:C++与JAVA的区别 下一篇:git上传github
热门文章
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
标签列表