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

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

  •  
  •   nioncodotcom · 23 天前 · 2372 次点击

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

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

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