• 请不要在回答技术问题时复制粘贴 AI 生成的内容
hhh798
V2EX  ›  程序员

菜鸟求助,怎么解决并发问题

  •  
  •   hhh798 · Oct 20, 2019 · 4184 views
    This topic created in 2399 days ago, the information mentioned may be changed or developed.

    这样一个场景 文章表有个点赞数字段,每当有人点赞就将点赞数+1,但是多人同时点就会导致,表里的点赞数小于实际点赞次数。这种应该如何处理呢

    30 replies    2019-10-21 12:42:14 +08:00
    learnshare
        1
    learnshare  
       Oct 20, 2019 via Android
    点赞不区分来源么
    zhuzhibin
        2
    zhuzhibin  
       Oct 20, 2019 via iPhone
    最直接的加锁先 防止并发入库多或少 然后如果很夸张 可以异步处理 扔队列
    malusama
        3
    malusama  
       Oct 20, 2019
    扔队列
    renmu123
        4
    renmu123  
       Oct 20, 2019
    可以去参考一下微博点赞机制的设计,网上有相应的文章
    zhilincom
        5
    zhilincom  
       Oct 20, 2019 via Android
    最简单的,加个乐观锁。数据库撑不住就扔队列慢慢处理。
    watzds
        6
    watzds  
       Oct 20, 2019 via Android
    update 点赞表 set 点赞数=点赞数+1
    watzds
        7
    watzds  
       Oct 20, 2019 via Android
    update 文章表 set 点赞数=点赞数+1
    k9990009
        8
    k9990009  
       Oct 20, 2019 via Android
    并发大就数据库撑不住就 Redi 里读,写的话先写缓存,然后队列异步楼上那样+1,也不用考虑顺序
    opengps
        9
    opengps  
       Oct 20, 2019 via Android
    内存里操作递增,单机用普通的代码锁静态变量就行,最好是用 Redis 的分布式锁,然后定时或者用队列写库
    delectate
        10
    delectate  
       Oct 20, 2019
    keyword: redis 乐观锁
    areless
        11
    areless  
       Oct 20, 2019
    那个,如果访问都爆了。请求都堵塞了。谈什么数据库写入?队列,常驻的静态变量,或者 KV 结构内存型 NOSQL 好解决,请求应该给个校验及延时,然后把请求时间平摊一下。
    BCy66drFCvk1Ou87
        12
    BCy66drFCvk1Ou87  
       Oct 20, 2019 via Android
    redis
    dearmymy
        13
    dearmymy  
       Oct 20, 2019
    肯定不能每次点赞都去数据库查询更改一次。用 redis 内存记录
    tedcon
        14
    tedcon  
       Oct 20, 2019 via iPhone
    最简单用队列处理啊
    hhh798
        15
    hhh798  
    OP
       Oct 20, 2019
    我大概知道搜索方向了,感谢大家
    mingl0280
        16
    mingl0280  
       Oct 20, 2019
    @nioncodotcom 做个写入队列就行了
    kidtest
        17
    kidtest  
       Oct 20, 2019
    redis incr
    reus
        18
    reus  
       Oct 20, 2019   ❤️ 2
    update c = c + 1

    你什么破烂数据库连这个的原子性都不能保证?
    ech0x
        19
    ech0x  
       Oct 20, 2019 via iPhone
    @reus 说的对啊,这个不需要这么麻烦的吧,数据库可以保证原子性的啊……
    你不会先读了,然后在程序里+1,再 update 回去了吧。
    hhh798
        20
    hhh798  
    OP
       Oct 20, 2019
    @ech0x 我就是这么干的啊。。,先读,➕1,再 update
    @reus 我后台用的 eggjs+sequelize,数据库是 mariadb,你说的这种操作不知道代码咋写。。
    iPhoneXI
        21
    iPhoneXI  
       Oct 20, 2019 via Android
    @nioncodotcom 不就是一条 SQL 的事
    hhh798
        22
    hhh798  
    OP
       Oct 20, 2019
    @iPhoneXI
    post 表点赞字段是 applause_count, SQL 这么写:update post set applause_count=applause_count+1 where id=XX?
    iPhoneXI
        23
    iPhoneXI  
       Oct 20, 2019 via Android
    @nioncodotcom 我觉得这么写没啥问题
    mingmeng
        24
    mingmeng  
       Oct 20, 2019 via Android
    @nioncodotcom 你是先查出来结果,添加之后再入库?这样不就构成了脏数据么。。。
    ech0x
        25
    ech0x  
       Oct 20, 2019 via iPhone
    @nioncodotcom 对啊,就是这样写啊……不然呢。
    ech0x
        26
    ech0x  
       Oct 20, 2019 via iPhone
    @nioncodotcom 你先读再 update 就得自己维持原子性了。
    hhh798
        27
    hhh798  
    OP
       Oct 20, 2019
    @ech0x @iPhoneXI 了解了,感谢
    @mingmeng 这就是脏数据啊,长知识了。。
    mingmeng
        28
    mingmeng  
       Oct 20, 2019 via Android
    @nioncodotcom 该补一下课了,数据库 ACID 原子性,一致性,隔离性,持久性~
    Kontinue
        29
    Kontinue  
       Oct 21, 2019
    楼上说的都对,根据方案可以再去搜对应的博客。
    当前前提得看你的并发量不是?如果仅仅只是考虑到这个问题或并发量不大,直接 update 乐观锁搞定(毕竟编码简单),并发量高的才考虑设计使用队列 redis etc.
    Raymon111111
        30
    Raymon111111  
       Oct 21, 2019
    如果是只要数量的话用 redis ++ 就可以了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1143 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 67ms · UTC 23:37 · PVG 07:37 · LAX 16:37 · JFK 19:37
    ♥ Do have faith in what you're doing.