Press "Enter" to skip to content

Yac 2.1 升级说明

Yac (Yet Another cache)也是之前我在微博的时候开发的一个为PHP使用的,Lock-free, Shared Memory, User Data Cache,用来替代当时微博在PHP机器上装的本地Memcache和APC,因为当时的需求特点,最初做了完全无锁的设计,但是这样有一个隐患就是用户有可能获得“错误”的数据,虽然之前的测试概率非常非常低。 关于Yac的设计,可以参考我7年前写的Yac (Yet Another Cache) - 无锁共享内存Cache

作为我的Ya全家桶的重要一员, 在我优化完一轮Yaf, Yar, Yaconf以后,Yac当然也不能少了。

2.1.0主要做了如下的优化:

  • 使用cas原子操作,保护对key的读写,在Yac中,为了避免冲突,key中包含了很多信息,包括最重要的对内容的crc校验,这次升级采用了cas原子操作, 在保证lock-free, 和性能的前提下,只对key的读写做了保护,从而可以大幅降低冲突的概率,继而大幅降低获取到错误数据的可能。

    当然,这么做以后,会带来一个副作用, 为了不让cas一直死等,我设置了一定的尝试次数,如果失败就返回。 那就可能带来一个问题就是Yac->set可能会失败,所以如果你需要对于一些特别重要的内容,需要保证它一定能被set,那你可能需要:

    <?php
    while(!($yac->set("important", "value")));
    ?>
    
  • 使用SSE4.2的内建crc32指令,取代原来的crc32,这样Yac中大量调用的crc32来验证数据正确性的性能有非常明显的性能提升。 (多说一句,这个CRC32指令实现的是CRC32-C,和我们使用的常规的CRC-32-IEEE 802.3不同,不过在Yac的场景下,CRC32只是用来自我验证,所以没有问题)
  • 一些内存优化,降低内存占用

经过这次全新的升级,Yac的稳定性会得到很大的提升,可以用来在PHP中做一些跨PHP进程的内容交换和Cache。

Yac 2.1 已经发布: Yac At PECL
使用文档以及使用中有任何问题,来Github: Yac At Github

enjoy!

12 Comments

  1. Arkin
    Arkin April 17, 2021

    如楼上andy评论. 期待鸟哥共享连接池这块yap的实现.
    代理规则由第三方如mysql-proxy实现.

  2. Garvin
    Garvin February 18, 2021

    鸟哥,请问下cas原子操作进行数据读写,不是已经解决数据冲突问题了?还可能会读到错误数据吗?

  3. t rex game
    t rex game December 31, 2020

    I really appreciate this wonderful post that you have provided for us. I feel strongly that love and read more on this topic. I have spent a lot of my spare time reading your content. Thank you a lot.

  4. andy
    andy November 3, 2020

    php世界现在最需要的是一个连接池。性能损耗最大的地方,其他损耗和别的编程语言在高io场景都摊平了。

    期待会有一个 Yap

  5. xiami
    xiami September 2, 2020

    已经升级了,用来做单机,一级缓存效果非常好。

  6. Zbin
    Zbin June 12, 2020

    鸟哥,我在Cli模式下,能缓存成功,但是获取不到缓存,请问一下是什么原因呢?

    • laruence
      laruence June 12, 2020

      github上提问的也是你吧?在github上回复了

  7. adskyfly
    adskyfly April 7, 2020

    鸟哥,请问下yac可以在swoole的task间共享缓存吗

    • Laruence
      Laruence April 7, 2020

      应该可以吧,如果是多进程模型

  8. 奶嘴
    奶嘴 March 27, 2020

    目前只用过Yaconf(#^.^#),有机会要试试Yac

Comments are closed.