redis优点主要是内存读取和本地持久化,但提供的数据类型太简单,只能字符串和一维key的操作。所以做做简单的存储和并发检索还是可以的,但是要想更复杂的功能,我们就要基于redis做封装。 那么,如果用workerman来开发仿造一个redis,php-frm直接连接worker进程中的内存变量,两者都是常驻内存,数据也都是在内存中的,就像Gateway::bindUid一样的原理,岂不是更爽。 暂且不管redis的...
进程A和B都设置了5个子进程,进程A里放了一个定时器,同一时间去redis中查询5条数据并立刻批量删除,然后调用AsyncTcpConnection执行进程B,redis是用的zset类型。 问题: 1、redis虽然是单进程,但是因为5个定时器同时执行了进程A,导致redis还没删除之前,就被其他子进程也查询到了值,导致进程A有几率会执行2~3次,但我只想让进程A执行一次。我知道可以设置$worker->id...
需求是这样的,在onWorkerStart中,定时检测并异步执行耗时任务,当有客户端连接ws时,可以实时获取该进程任务的执行日志。 目前我采用的方案是文件和redis这样的中间件。我在想,既然timer和websocket同属于一个进程,那么能否不用中间件,直接在onWorkerStart里发送send给客户端呢?...
由于邮件发送比较耗时,所以我用AsyncTcpConnection异步任务,但由于workerman是多进程单线程,那么在如下场景中,该如何提高并发效率呢? 场景: 有2个耗时任务需要在同一时间执行,其中一个是邮件群发,假设要发送1000个邮件,任务进程100个。 方案疑问: 1、1000个邮件分别通过AsyncTcpConnection发送给100个进程。这种方案会因为100个进程被占满,而导致另一个任务必须等待1...
不知道哪里写的不对,设置了4个进程,同时打开3个网页,每个等待10s,结果总时长需要30s,求大神帮忙解释下,谢谢了 下图是http: 下图是websocket ...
下面两个图是我分别重启后截图,默认都是从client_id=1开始递增。 这样是不是一旦项目上线后,就不能关闭重启了,只能通过平滑重启,不然clietn_id与数据库的uid对不上了?或者有没有其他解决办法? 查看源码发现,client_id是通过ip+端口+connection_id的16进制,connection_id是当前连接数,所以workerman重启后,connection_id就从1重新开始计算了。 /...