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

  1. 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的实战的更多相关文章

  1. boost 无锁队列

    一哥们翻译的boost的无锁队列的官方文档 原文地址:http://blog.csdn.net/great3779/article/details/8765103 Boost_1_53_0终于迎来了久 ...

  2. 【实战Java高并发程序设计6】挑战无锁算法:无锁的Vector实现

    [实战Java高并发程序设计 1]Java中的指针:Unsafe类 [实战Java高并发程序设计 2]无锁的对象引用:AtomicReference [实战Java高并发程序设计 3]带有时间戳的对象 ...

  3. Nah Lock: 一个无锁的内存分配器

    概述 我实现了两个完全无锁的内存分配器:_nalloc 和 nalloc.  我用benchmark工具对它们进行了一组综合性测试,并比较了它们的指标值. 与libc(glibc malloc)相比, ...

  4. 理解 Memory barrier(内存屏障)无锁环形队列

    原文:https://www.cnblogs.com/my_life/articles/5220172.html Memory barrier 简介 程序在运行时内存实际的访问顺序和程序代码编写的访问 ...

  5. GO安全并发之无锁原子操作

    声明:本文是<Go并发编程实战>的样章,禁止以任何形式转载此文. 摘要: 我们已经知道,原子操作即是进行过程中不能被中断的操作.也就是说,针对某个值的原子操作在被进行的过程当中,CPU绝不 ...

  6. 高性能无锁队列 Disruptor 初体验

    原文地址: haifeiWu和他朋友们的博客 博客地址:www.hchstudio.cn 欢迎转载,转载请注明作者及出处,谢谢! 最近一直在研究队列的一些问题,今天楼主要分享一个高性能的队列 Disr ...

  7. C++性能榨汁机之无锁编程

    C++性能榨汁机之无锁编程 来源 http://irootlee.com/juicer_lock_free/ 前言 私以为个人的技术水平应该是一个螺旋式上升的过程:先从书本去了解一个大概,然后在实践中 ...

  8. 如何在高并发环境下设计出无锁的数据库操作(Java版本)

    一个在线2k的游戏,每秒钟并发都吓死人.传统的hibernate直接插库基本上是不可行的.我就一步步推导出一个无锁的数据库操作. 1. 并发中如何无锁. 一个很简单的思路,把并发转化成为单线程.Jav ...

  9. [转]透过 Linux 内核看无锁编程

    非阻塞型同步 (Non-blocking Synchronization) 简介 如何正确有效的保护共享数据是编写并行程序必须面临的一个难题,通常的手段就是同步.同步可分为阻塞型同步(Blocking ...

随机推荐

  1. lufylegend库 LGraphics

    lufylegend库 LGraphics <!DOCTYPE html> <html lang="en"> <head> <meta c ...

  2. Java 导出Excel的各种尝试

    最近的一个项目比较忙,一直没时间过来跟新博客.今天过来分享一下在此项目中遇到的一个小问题:导出Excel:相信导出Excel这个功能是特别常见的,也有很多的方式.好了,不多说了,直接说说自己遇到的各种 ...

  3. 【求Java工程师/专家】大型互联网公司急招

    互联网行业排名Top公司,目前项目扩张阶段,需求数量较多的JAVA中高端后台开发人员,需要有分布式系统开发经验,年后有找工作的同学可以联系我了. 工作地点:杭州 岗位要求: 1.精通Java SE和J ...

  4. 启动activity与使用Intent通信机制解析

    我们都知道,一个activity启动另一个activity最简单的方式就是使用startActivity方法: public void startActivity (Intent intent) 但是 ...

  5. PHP编码规范实例

    <?php   /**   * 符合psr-1,2的编程实例   *   * @author 作者 描述   */       namespace Standard; // 顶部命名空间   / ...

  6. Spark RDD算子介绍

    Spark学习笔记总结 01. Spark基础 1. 介绍 Spark可以用于批处理.交互式查询(Spark SQL).实时流处理(Spark Streaming).机器学习(Spark MLlib) ...

  7. Java用自定义的类型作为HashMap的key

      需要重写hashCode()和equals()方法才可以实现自定义键在HashMap中的查找. public class PhoneNumber { private int prefix; //区 ...

  8. iis7.0 ExtensionlessUrlHandler-Integrated-4.0解决方法

    IIS7.0上部署网站,打开后500错误: 处理程序“ExtensionlessUrlHandler-Integrated-4.0” 在其模块列表中有一个错误模块“ManagedPipelineHan ...

  9. c#访问存储过程

    // 2015/07/04 // 访问存储过程 using System; using System.Collections.Generic; using System.Linq; using Sys ...

  10. [Spark] - HashPartitioner & RangePartitioner 区别

    Spark RDD的宽依赖中存在Shuffle过程,Spark的Shuffle过程同MapReduce,也依赖于Partitioner数据分区器,Partitioner类的代码依赖结构主要如下所示: ...