V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
hhh798
V2EX  ›  程序员

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

  •  
  •   hhh798 · 2019-10-20 11:06:28 +08:00 · 3728 次点击
    这是一个创建于 1896 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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