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
下面简单介绍下安装:
wgethttps://pecl.php.net/get/yac-0.9.2.tgztar -zxvf yac-0.9.2.tgzcd yac-0.9.2phpize./config --prefix=/usr/local/yac --with-php-config=/usr/local/php/bin/php-configsudo 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个keyyac.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

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

从上面的图中,可以看出结论了,Yac要比Memcache快很多,而且出错率很低,所以说Yac还是很不错的。
小结
Yac很高效,但还是要注意一些方面,由于Yac是作为PHP的extension形式存在的,所以Yac只能在单机的多个进程之间共享缓存的,这一点一定要注意,一般用作第1级缓存。而在真实的生产环境下,由于服务器有很多,并且有可能是作为分布式集群形式存在,那个时候使用Memcache缓存服务器集群还是更好的选择或者作为第2级缓存(或者使用其他分布式缓存数据库,比如Redis等NoSQL非关系型数据库)。
实际使用中,还是yac的高速+mc集群高可用高稳定+redis的高灵活的组合方式来实现大部分的基础功能。
(end)
PHP无锁内存nosql---Yac的实战的更多相关文章
- boost 无锁队列
一哥们翻译的boost的无锁队列的官方文档 原文地址:http://blog.csdn.net/great3779/article/details/8765103 Boost_1_53_0终于迎来了久 ...
- 【实战Java高并发程序设计6】挑战无锁算法:无锁的Vector实现
[实战Java高并发程序设计 1]Java中的指针:Unsafe类 [实战Java高并发程序设计 2]无锁的对象引用:AtomicReference [实战Java高并发程序设计 3]带有时间戳的对象 ...
- Nah Lock: 一个无锁的内存分配器
概述 我实现了两个完全无锁的内存分配器:_nalloc 和 nalloc. 我用benchmark工具对它们进行了一组综合性测试,并比较了它们的指标值. 与libc(glibc malloc)相比, ...
- 理解 Memory barrier(内存屏障)无锁环形队列
原文:https://www.cnblogs.com/my_life/articles/5220172.html Memory barrier 简介 程序在运行时内存实际的访问顺序和程序代码编写的访问 ...
- GO安全并发之无锁原子操作
声明:本文是<Go并发编程实战>的样章,禁止以任何形式转载此文. 摘要: 我们已经知道,原子操作即是进行过程中不能被中断的操作.也就是说,针对某个值的原子操作在被进行的过程当中,CPU绝不 ...
- 高性能无锁队列 Disruptor 初体验
原文地址: haifeiWu和他朋友们的博客 博客地址:www.hchstudio.cn 欢迎转载,转载请注明作者及出处,谢谢! 最近一直在研究队列的一些问题,今天楼主要分享一个高性能的队列 Disr ...
- C++性能榨汁机之无锁编程
C++性能榨汁机之无锁编程 来源 http://irootlee.com/juicer_lock_free/ 前言 私以为个人的技术水平应该是一个螺旋式上升的过程:先从书本去了解一个大概,然后在实践中 ...
- 如何在高并发环境下设计出无锁的数据库操作(Java版本)
一个在线2k的游戏,每秒钟并发都吓死人.传统的hibernate直接插库基本上是不可行的.我就一步步推导出一个无锁的数据库操作. 1. 并发中如何无锁. 一个很简单的思路,把并发转化成为单线程.Jav ...
- [转]透过 Linux 内核看无锁编程
非阻塞型同步 (Non-blocking Synchronization) 简介 如何正确有效的保护共享数据是编写并行程序必须面临的一个难题,通常的手段就是同步.同步可分为阻塞型同步(Blocking ...
随机推荐
- Eclipse中TODO的分类,以及自动去除
Window-Preference-Java-Compiler-Task Tags; 这里面进行TaskTag标签的定义,默认支持FIXME.TODO.XXX三种:优先级高的在taskview中 会显 ...
- ArcGIS10.2直连PostgreSQL存在问题
现象: 将下载到的libeay32.dll, libiconv-2.dll, libintl-8.dll, libpq.dll, ssleay32.dll文件拷贝到Desktop 安装目录的bin目录 ...
- java连接ms sql server各类问题解析
首先先来说下使用微软自己开发的架包进行ms sql server数据库的连接时,sql 2000与sql 2005的连接方式略有不同: 1.首先驱动不一样,sql 2000的连接驱动包有三个,分别是: ...
- easyui datagrid的json格式
easyui datagrid的json格式: {"columns":[[{"field":"one","title": ...
- iOS之内存分析
静态内存分析(Product->Analyze) 静态内存分析是不运行程序,直接对代码进行分析. 但是没有真正分配内存,根据代码的上下文的语法结构,来分析是否有内存泄露 缺点:不一定准确,但是如 ...
- 关于echarts地图下钻。
在去年十二月份,前端老大交代个任务,关于地图下钻.这里做了个简单的青岛地图下钻,初学echarts,做的不精,凑合看看吧. 第一步呢,先引入echarts等文件,这是最基本的. 第二步,到官网下载 ...
- 学习计划(一)——JavaScript
一:与前端之缘 大一时除了上课和社团外不知道要学点什么,但是又不想睡觉打游戏,常常就是啥都想学,photoshop,premiere,After Effects都学,但始终没有明确的目标. 大二时一直 ...
- sqlcmd命令导入大容量的SQL本地文件至SQL server 2008
由于开发工作在测试环境,需要构造测试数据,经常遇到100+M大小的*.sql文件需要导入到测试库的情况,由于SSMS里对导入文件的大小有限制: 会出现上图的报错!上网查了下,超过80M的文件是不能在S ...
- SQLSERVER 中实现类似Mysql的 INSERT ON DUPLICATE KEY UPDATE
通过SQLServer创建索引时,有一个IGNORE_DUP_KEY的选项,可以类似实现. IGNORE_DUP_KEY = { ON | OFF } 指定对唯一聚集索引或唯一非聚集索引执行多行插入操 ...
- vs生成配置release自动恢复成debug无法配置的问题
软件为visual studio 2015,右键单个项目选属性,设置“生成配置”release,保存后,再次右键属性,却发现又自动恢复成debug,怎么回事?是无法配置吗?点击生成试试,果然2b了. ...