workerman使用redis存储遇到的“脏数据读”问题

blogdaren 2018-04-13 抢沙发 438人次

33.png


44.png

如上图所示, 问题有三:

(1) ":11269" ---> 即数字11269前为何会多出个冒号来【所谓的脏数据】?

(2)如何避免上述1提到的现象?

(3)不同的客户端为何查询到了相同的数据?比如图示 11271;

(4)如何避免上述2提到的现象?

问题产生原因以及解决方案:

(1)问题原因: workerman分为主进程和子进程,如果主进程中创建了redis连接,在fork时子进程会继承redis连接,这样会导致redis返回数据时所有子进程都可读,导致数据错乱。所以不能在主进程创建mysql redis等连接资源。

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

(3)问题原因: 不同的客户端查询到了相同的数据, 这是因为示例中的 redis get 操作并不是一个原子操作,实际运行时可能出现多个进程分别并发执行了get,就会得到相同的数值。

(4)解决方案: 事实上,incr返回的就是自增之后的值。即incr是自增性原子操作。


#workerman##redis#

版权声明:除非注明,本文由( blogdaren )原创,转载请保留文章出处。

本文链接:workerman使用redis存储遇到的“脏数据读”问题

发表评论:

您的昵称:
电子邮件:
个人主页: