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 ...
随机推荐
- lufylegend库 LGraphics
lufylegend库 LGraphics <!DOCTYPE html> <html lang="en"> <head> <meta c ...
- Java 导出Excel的各种尝试
最近的一个项目比较忙,一直没时间过来跟新博客.今天过来分享一下在此项目中遇到的一个小问题:导出Excel:相信导出Excel这个功能是特别常见的,也有很多的方式.好了,不多说了,直接说说自己遇到的各种 ...
- 【求Java工程师/专家】大型互联网公司急招
互联网行业排名Top公司,目前项目扩张阶段,需求数量较多的JAVA中高端后台开发人员,需要有分布式系统开发经验,年后有找工作的同学可以联系我了. 工作地点:杭州 岗位要求: 1.精通Java SE和J ...
- 启动activity与使用Intent通信机制解析
我们都知道,一个activity启动另一个activity最简单的方式就是使用startActivity方法: public void startActivity (Intent intent) 但是 ...
- PHP编码规范实例
<?php /** * 符合psr-1,2的编程实例 * * @author 作者 描述 */ namespace Standard; // 顶部命名空间 / ...
- Spark RDD算子介绍
Spark学习笔记总结 01. Spark基础 1. 介绍 Spark可以用于批处理.交互式查询(Spark SQL).实时流处理(Spark Streaming).机器学习(Spark MLlib) ...
- Java用自定义的类型作为HashMap的key
需要重写hashCode()和equals()方法才可以实现自定义键在HashMap中的查找. public class PhoneNumber { private int prefix; //区 ...
- iis7.0 ExtensionlessUrlHandler-Integrated-4.0解决方法
IIS7.0上部署网站,打开后500错误: 处理程序“ExtensionlessUrlHandler-Integrated-4.0” 在其模块列表中有一个错误模块“ManagedPipelineHan ...
- c#访问存储过程
// 2015/07/04 // 访问存储过程 using System; using System.Collections.Generic; using System.Linq; using Sys ...
- [Spark] - HashPartitioner & RangePartitioner 区别
Spark RDD的宽依赖中存在Shuffle过程,Spark的Shuffle过程同MapReduce,也依赖于Partitioner数据分区器,Partitioner类的代码依赖结构主要如下所示: ...