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

简介: 无锁内存nosql---Yac的实战      最近在工作使用了yac,所以比较了下Memcache和Yac的高并发读写性能测试,发现Yac要比Memcache快很多(这里没有比较Yac和Apc的性能情况, 不过据说Yac要比Apc快很多,Apc比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

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)

谋胆并重
目录
相关文章
|
1月前
|
编译器 程序员 C语言
C语言从入门到实战——动态内存管理
在C语言中,动态内存管理是指程序运行时,通过调用特定的函数动态地分配和释放内存空间。动态内存管理允许程序在运行时根据实际需要来分配内存,避免了静态内存分配在编译时就确定固定大小的限制。
45 0
|
3月前
|
缓存 监控 算法
jvm性能调优实战 - 39一次大促导致的内存泄漏和Full GC优化
jvm性能调优实战 - 39一次大促导致的内存泄漏和Full GC优化
71 0
|
5月前
|
存储 缓存 安全
高并发内存池实战:用C++构建高性能服务器(下)
高并发内存池实战:用C++构建高性能服务器
高并发内存池实战:用C++构建高性能服务器(下)
|
7月前
|
算法 PHP 数据安全/隐私保护
【实战】php goto解密工具,无需安装php环境,直接解密
php goto解密方法,php解密工具,goto解密,php微擎解密,代码可读性,代码可维护性
387 1
|
3月前
|
存储 Java 数据库
jvm性能调优 - 06线上应用部署JVM实战_堆内存预估与设置
jvm性能调优 - 06线上应用部署JVM实战_堆内存预估与设置
61 0
|
30天前
|
缓存 移动开发 Java
构建高效Android应用:内存优化实战指南
在移动开发领域,性能优化是提升用户体验的关键因素之一。特别是对于Android应用而言,由于设备和版本的多样性,内存管理成为开发者面临的一大挑战。本文将深入探讨Android内存优化的策略和技术,包括内存泄漏的诊断与解决、合理的数据结构选择、以及有效的资源释放机制。通过实际案例分析,我们旨在为开发者提供一套实用的内存优化工具和方法,以构建更加流畅和高效的Android应用。
|
1月前
|
存储 小程序 编译器
C语言从入门到实战——数据在内存中的存储方式
数据在内存中的存储方式是以二进制形式存储的。计算机中的内存由一系列存储单元组成,每个存储单元都有一个唯一的地址,用于标识它在内存中的位置。计算机可以通过这些地址来定位并访问内存中的数据。 数据在内存中的存储方式取决于数据的类型。数值类型的数据(例如整数、浮点数等)以二进制形式存储,并根据类型的不同分配不同的存储空间。字符串和字符数据由ASCII码存储在内存中。数据结构(例如数组、结构体、链表等)的存储方式也取决于其类型和组织结构。 总之,数据在内存中以二进制形式存储,并根据其类型和组织方式分配不同的存储空间。
43 0
|
1月前
|
C语言
C语言从入门到实战——常用内存函数的了解和模拟实现
内存函数(memory functions)指的是控制计算机内存操作的函数
21 0
|
1月前
|
NoSQL 测试技术 文件存储
内存泄漏治理实战:TDengine 研发团队使用 Windbg 的经验分享
内存泄漏是一种常见的问题,它会导致程序的内存占用逐渐增加,最终导致系统资源耗尽或程序崩溃。这次内存泄漏问题发生在 Windows 下,TDengine 研发选择使用 Windbg 来解决问题。结果证明,在 Windows 下,使用 Windbg 也是一个不错的选择。
31 0
|
7月前
|
XML 存储 监控
JVM记一次PermGen space内存溢出实战案例
JVM记一次PermGen space内存溢出实战案例
56 0

热门文章

最新文章