首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Coding
V2EX  ›  程序员

大家看看这段抽奖代码有没有安全隐患

  •  
  •   TypeErrorNone · 26 天前 · 2322 次点击

    自增的方式是 redis 的 incr 方法。 服务是集群,redis 是单机。

    image

    15 回复  |  直到 2019-11-19 18:27:11 +08:00
        1
    qq316107934   26 天前
    第一次获取当前兑奖次数是不是多余了
        2
    bk201   26 天前
    这是什么语言的语法
        3
    projectceiling   26 天前 via Android
    @bk201 #2 go
        4
    TypeErrorNone   26 天前
    @qq316107934 是多余,只为求个心安
        5
    tyrantZhao   26 天前
    没啥问题啊
        6
    mengzhuo   26 天前
    大哥,这压根不是抽奖吧,只是检查库存而已?
        7
    scukmh   26 天前
    不要用 this,人家都提示了、
        8
    mamahaha   26 天前
    这个:=只有 go 语言在用吧?
        9
    KaynW   26 天前   ♥ 1
    @mamahaha python 也用
        10
    KaynW   26 天前
    @scukmh 同, 黄线都飙出来了
        11
    picone   26 天前
    你这个是实现原子+1 吧,为啥不用 atomic
        12
    zjsxwc   26 天前
    @picone 楼主说了多机集群
        13
    andyhuzhill   26 天前   ♥ 1
    @mamahaha #8 Pascal VHDL 都有用
        14
    Vegetable   26 天前   ♥ 1
    这个 this 看的我浑身难受...
    整体上这个思路我觉得不太对
    你这是一个检查方法?canDosth,但是你在内部通过 incr 操作了 redis,意思库存在这就给扣掉了,所以你的检查操作不是幂等的,这样的设计有些反直觉了。

    基于 incr 设计的方法,#1 楼说的对,你第一步检查是多余的,假如实现一个幂等的检查方法,这个方法在不做事务处理时必然是不安全的,而做了事务处理的话,检查方法又失去了意义。所以去掉第一步检查,这方法改为扣库存,通过扣库存是否成功来判断是否执行下一步就行了。

    so,方法名改一下,去掉第一个检查库存,如果有必要为后边的判断不通过的情况加上回滚
        15
    trustbutverify   26 天前 via Android   ♥ 1
    @mamahaha py3.8 开始用
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2259 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 26ms · UTC 10:49 · PVG 18:49 · LAX 02:49 · JFK 05:49
    ♥ Do have faith in what you're doing.