分享一下我们的workerman项目+apcu案例,性能秒杀Redis

army

前言: 我们的项目要频繁读写遍历缓存,起初用的Redis,CPU占用20%左右,显然不理想。
当接触到php自带的apcu后,简直就是神一样,单机效率超Redis几十甚至上百倍,
利用workerman的text协议来搭配apcu 也能秒Redis 2倍以上,
关键是...关键是...关键是CPU消耗不足redis十分之一,
上测试截图:

//走tcp

3110 8 7
8个评论

luohonen

真的假的,比redis都高?

army

如果只作为单纯的进程间共享变量函数以及类,可说是非常完美,高Redis百倍性能。
如果作为kv缓存的话有一些特殊情况,大致根据自己项目情况来选择,
第一种:对单key的过期时间有要求的,在遍历全部key会包含已过期的key且无法分辨过期和未过期。
第二种:对遍历全部key只要有效key的话,单key无法自动过期。
对于key未设置过期的不影响,这些是运行在cli下才有的问题,fpm下不存在能完美Redis特性并秒杀百倍性能。

  • army 2023-04-01

    对于以上的问题已解决,用git仓库源码编译(pecl.php.net下载的不行),需配置use_request_time=0,灰常的奈斯

smile1

redis 有io的呀

  • 暂无评论
chaz6chez

apcu实际上已经边缘化了,只能单进程,整体的设计更适合fpm,在cli下面有挺多问题的,包括过期时间等,甚至不如shmop,早期shmop是为cli下设计的;
不考虑分布式、持久化容错的话,用shmop会更好,memcache也可以,性能都比redis更好;毕竟webman/workerman都常驻内存了,连接可以持久化。
早期实现过shmop/apcu + 边车定时器进程进行过期时间处理,实话实说,那个性能没法看,尤其是堆积数据过大的时候,时间复杂度毕竟是O(n),而且单进程的定时器在堆积数据过大的情况下也存在延时。

当然,这样玩一玩,了解实践一些服务层的知识肯定是好处,有益的

  • chaz6chez 2023-04-03

    而且其实这里面我们还得出一个实践,用持久化连接的SQLite3的memory也非常快,和缓存是类似的,用file也可以达到redis的持久化效果,而且还带事务,当然肯定和纯内存是没办法比的;我们后续的很多小组件都是通过RPC + SQLite3进行的数据存储和缓存处理,相当稳定。

  • chaz6chez 2023-04-03

    最主要的是SQLite3非常稳定,切具备工业化标准,PHP自带该拓展库无需额外安装及配置

  • army 2023-04-03

    cli下和fpm使用一致,并没有过期时间的问题,pecl.php.net下载的存在时间过期问题,从仓库拉源码编译是正常的,当然我们修改了源码增加了一个时间字段来遍历时更好的过滤失效key,我们已应用在生产环境。不考虑分布式以及持久化,只用简单的kv缓存的话,apcu就是神一样的存在。

  • army 2023-04-03

    在单机下,apcu可以完美替代workerman提供的globalData 实现多进程变量共享,且是globalData的几十倍效率。

  • chaz6chez 2023-04-03

    不考虑持久化和分布式的话,其实常驻内存框架可以直接用php的静态变量,其中还可以使用Spl的一些数据结构,比如堆、优先队列,在处理包含资源类型的缓存的时候比apcu更有竞争力,而且性能更好,你们可以在8.0及以上的php版本测试一下,效果是比apcu更好的

army

下图是我们生产环境中的各种方案,起初我们把后端用go+redis和go+自写cache,并发上来后都不如fpm+apcu,后来又使用了workerman+redis,起初也一样,无法完美使用apcu,导致Redis有些扛不住,又切换到了fpm+apcu,然后我们前端APP要websocket,没办法又用回了workerman+redis,不死心去研究了下apcu源码,最后就是workerman+apcu,终于比fpm+apcu强了。

  • 暂无评论
fenger

Redis 为 127.0.0.1 本机,该服务端的Redis还存在IO瓶颈吗? 手动狗头

  • 暂无评论
artisan

NB关注一下

  • 暂无评论
fengchujun

关注一下

  • 暂无评论

army

620
积分
0
获赞数
0
粉丝数
2023-03-01 加入
🔝