YAC高速无锁缓存,PHP的YAC扩展详解及安装

介绍

Yac 是一个同族进程间(典型的如PHP-FPM及其子进程)共享数据的无锁的缓存,无锁的目的是提高CPU多进程的效率。据说 Apc 的效率是 Memcached 的一倍以上,而 Yac 比 Apc 更快。这就是它最大的特点

而解决无锁的数据一致性问题主要靠两个方面

1.读锁的替代方案: 返回数据前的校验机制(CRC校验)
2.写锁的替代方案: 启动时就确定key空间的分布,写操作将数据哈希到对应的slot,对同一个slot写操作冲突问题,客观上允许这种操作的存在,但主观上忽略之(鸟哥自己的测试脚本(脚本地址)结果是千万分之一)

注意事项

1.因为是php进程之间共享,所以它是单机的缓存,多台机器时还是用memcached或者redis更好。但是它可以和redis等形成互补,比如当缓存key比较大,使用又频繁,将缓存迁移到yac降低redis的压力。
2.yac是无锁的缓存,所以要尽量避免多个进程设置相同key。同时它还意味着有可能获取cache的时候拿到错误的数据,取决于分配了多少密钥槽和存储了多少密钥, 1/10000000(千万分之一)的概率会发生
3.Yac使用部分crc校验,最好重新安排你的缓存内容,把最易变的字节放在头或尾
相关方法

具体的方法使用,可以看https://github.com/laruence/yac

需要说明的几点:
1.是可以一次性设置多个key的,但他们的过期时间都是一样的。
2.没有获取key过期时间的方法
3.flush方法,并不会释放任何资源,只是将所有项标记为无效

info具体含义:

  1. Array
  2. (
  3. [memory_size] => 71303168
  4. [slots_memory_size] => 4194304
  5. [values_memory_size] => 67108864
  6. [segment_size] => 4194304
  7. [segment_num] => 16
  8. [miss] => 23
  9. [hits] => 90
  10. [fails] => 0
  11. [kicks] => 0
  12. [recycles] => 0
  13. [slots_size] => 32768
  14. [slots_used] => 17
  15. )

1.miss代表没有命中的次数,hits缓存命中的次数,slots_size是key slot个数,也就是能存多少key,slots_used是已使用的key slot数,也就是当前key的个数。
2.memory_size:yac总共占用的内存,默认68M,slots_memory_size:key槽占用的内存默认4M,配置yac.keys_memory_size = 4M,4M有30K的key槽, 32M有100K的key槽,values_memory_size:value值占用的内存,配置yac.values_memory_size = 64M,默认64M,单位都是byte。 3.kicks被踢出的次数,recycles内存重新分配的次数。

php扩展Yac的安装

  1. 1. git clone https://github.com/laruence/yac
  2. cd yac
  3. 2.
  4. phpize //生成configure
  5. 3.
  6. ./configure --with-php-config=/usr/local/php/bin/php-config
  7. 4.
  8. make && make install
  9. 5.修改php.ini 加一句
  10. extension = yac.so
  11. 然后重启服务器 重启 php

php -m 查看yac扩展

参考

yac的github地址: 鸟哥的博客

点赞 ( 0 )

1 条评论

  1. When I initially commented I clicked the "Notify me when new comments are added" checkbox and now each time a comment is added I get four e-mails with the same comment. Is there any way you can remove people from that service? Thank you!

发表评论

人生在世,错别字在所难免,无需纠正。

插入图片
s
返回顶部