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

2019-10-20 11:06:28 +08:00
 hhh798

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

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

你什么破烂数据库连这个的原子性都不能保证?
ech0x
2019-10-20 14:40:14 +08:00
@reus 说的对啊,这个不需要这么麻烦的吧,数据库可以保证原子性的啊……
你不会先读了,然后在程序里+1,再 update 回去了吧。
hhh798
2019-10-20 16:35:55 +08:00
@ech0x 我就是这么干的啊。。,先读,➕1,再 update
@reus 我后台用的 eggjs+sequelize,数据库是 mariadb,你说的这种操作不知道代码咋写。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/611079

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX