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

时间:2022-12-20 10:02: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​

下面简单介绍下安装:


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. ​​=newYac();​​
4. ​​for($i =1;<=100;++){​​
5. ​​='key_'.;​​
6. ​​=(0,10000);​​
7. ​​if(!->set($key,))​​
8. ​​("Yac set error: $key --> $value");​​
9. ​​}​​
10.
11. ​​for($i =1;<=100;++){​​
12. ​​='key_'.;​​
13. ​​=->get($key);​​
14. ​​if($value ===false){​​
15. ​​("Yac get error: $key not found");​​
16. ​​}​​
17. ​​}​​
18. ​​?>​​

memcache测试代码:


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

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

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

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


小结

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

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

(end)

作者:​​sunsky303​​