workerman 使用redis存储遇到的诡异问题






如上图所示, 问题有三:

    []:11269 --> 即数字11269前为何会多出个冒号来?[/]

    [] 不同的客户端为何查询到了相同的数据,比如图示 11271;[/]

    [] 如何避免上述2提到的现象? [/]
已邀请:

walkor

赞同来自:

workerman分为主进程和子进程,如果主进程中创建了redis连接,在fork时子进程会继承redis连接,这样会导致redis返回数据时所有子进程都可读,导致数据错乱。所以不能在主进程创建mysql redis等连接资源。这部分在手册必读里有讲 http://doc.workerman.net/315119。

如果连接资源先于Worker::runAll()运行前创建,那么就属于主进程。所以最好是在onWorkerStart回调创建连接资源。如果一定要在主进程使用一次redis,则必须在使用完毕销毁它,避免被子进程继承使用。

blogdaren - 乐于分享的PHP码农【http://www.blogdaren.com】

赞同来自:

去掉了初始化redis实例的主进程代码【即去掉了图1中第22~25行代码】之后,发现图示诸如带冒号的诡异数据消失了,但是依然会出现不同的客户端读取到多条相同的数据,这个现象正常吗? 或者代码的编写逻辑还存在问题? 谢谢~~

maq

赞同来自:

你程序里的 incr 和 get 并不是一个原子操作,实际运行时可能出现多个进程分别执行了 incr,然后再分别执行 get,就会得到相同的数值。不过总体来看计数是不会错的。

事实上,incr 返回的就是自增之后的值,所以其实你根本不需要再 get 一次。

要回复问题请先登录注册