美文网首页
记录一个使用skynet过程中的伪并发问题

记录一个使用skynet过程中的伪并发问题

作者: 我帅的不忍直视 | 来源:发表于2020-03-11 12:54 被阅读0次

问题描述:

在对一个玩家充值时,如果此时玩家不在线,内存中也没有缓存数据,此时需要从db(先从redis中查询,如果未命中,则去mysql中获取)中读取玩家数据,记录readdb1。由于有充值活动,活动的配置数据是在一个redis服务中读取的,记录为readrdb2,读取成功后根据两次读取结果操作剩余逻辑。 问题就出在这里。

如下流程:

        skynet.call(readdb1())    --阻塞式读取

      拿到玩家参与活动flag

       skynet.call(readrdb2())    --阻塞式读取

        if 玩家还未参与过活动flag==0 

            给玩家发送活动礼包

        end

        setflag   flag=1     //非阻塞式,设置已经参加过活动标识

        givemoney //非阻塞式,给钱

;以上流程当readrdb2阻塞等待时(这个redis服务繁忙),此时如果有第二笔充值订单进来,拿到的flag仍为0未参加活动,这就会导致重复赠送玩家礼包。

所以在一个逻辑里面,有多个call时,要注意这样的并发问题。至于这个问题的解决办法很简单:在本服务中,永久记录一个玩家的活动状态就好了,就是读内存数据

相关文章

  • 记录一个使用skynet过程中的伪并发问题

    问题描述: 在对一个玩家充值时,如果此时玩家不在线,内存中也没有缓存数据,此时需要从db(先从redis中查询,如...

  • skynet源代码阅读(1)

    启动 skynet 使用的指令 ./skynet example/config 实际上就是调用 skynet-sr...

  • skynet.call的使用

    最近的工作一直围绕这云风的skynet,仅以此片记录自己在学习中遇到的问题的解决。skynet.call("服务名...

  • Linuxmint记录

    记录使用Manjaro过程中遇到的问题,与“Linux命令记录”,“Manjaro记录”相关。

  • MySql和Oracle的使用

    本文档是一个记录文档,会不定时更新使用过程中遇到的差异问题本文档记录MySql和Oracle在使用中要注意的问题,...

  • Manjaro记录

    记录使用Manjaro过程中遇到的问题,与“Linux命令记录”,“Linuxmint记录”相关。 打印系统信息 ...

  • Java Concurrent Map

    前言 HashMap是我们生产过程中使用较多的一个数据结构,平时非并发场景使用的HashMap,并发场景下使用的H...

  • 并发中的伪共享问题

    伪共享问题的表现是:并发的修改操作,在CPU的底层实际上是串行的在执行! 这个涉及到 MESI(缓存一致性协议),...

  • sql目录

    记录MySQL使用过程中(工作或者开发过程中遇到的问题) MySQL导出文件中遇到的问题 MySQL使用索引提高查...

  • 如何应对Redis并发访问带来的问题

    我们在使用Redis的过程中,难免会遇到并发访问及数据更新的问题。但很多场景对数据的并发修改是很敏感的,比如库存数...

网友评论

      本文标题:记录一个使用skynet过程中的伪并发问题

      本文链接:https://www.haomeiwen.com/subject/wowqjhtx.html