这样一个场景 文章表有个点赞数字段,每当有人点赞就将点赞数+1,但是多人同时点就会导致,表里的点赞数小于实际点赞次数。这种应该如何处理呢
1
learnshare 2019-10-20 11:10:41 +08:00 via Android
点赞不区分来源么
|
2
zhuzhibin 2019-10-20 11:13:48 +08:00 via iPhone
最直接的加锁先 防止并发入库多或少 然后如果很夸张 可以异步处理 扔队列
|
3
malusama 2019-10-20 11:14:47 +08:00
扔队列
|
4
renmu123 2019-10-20 11:15:28 +08:00
可以去参考一下微博点赞机制的设计,网上有相应的文章
|
5
zhilincom 2019-10-20 11:19:44 +08:00 via Android
最简单的,加个乐观锁。数据库撑不住就扔队列慢慢处理。
|
6
watzds 2019-10-20 11:25:58 +08:00 via Android
update 点赞表 set 点赞数=点赞数+1
|
7
watzds 2019-10-20 11:26:37 +08:00 via Android
update 文章表 set 点赞数=点赞数+1
|
8
k9990009 2019-10-20 11:31:07 +08:00 via Android
并发大就数据库撑不住就 Redi 里读,写的话先写缓存,然后队列异步楼上那样+1,也不用考虑顺序
|
9
opengps 2019-10-20 11:44:06 +08:00 via Android
内存里操作递增,单机用普通的代码锁静态变量就行,最好是用 Redis 的分布式锁,然后定时或者用队列写库
|
10
delectate 2019-10-20 11:53:56 +08:00
keyword: redis 乐观锁
|
11
areless 2019-10-20 11:55:19 +08:00
那个,如果访问都爆了。请求都堵塞了。谈什么数据库写入?队列,常驻的静态变量,或者 KV 结构内存型 NOSQL 好解决,请求应该给个校验及延时,然后把请求时间平摊一下。
|
12
HuasLeung 2019-10-20 11:59:26 +08:00 via Android
redis
|
13
dearmymy 2019-10-20 12:06:25 +08:00
肯定不能每次点赞都去数据库查询更改一次。用 redis 内存记录
|
14
tedcon 2019-10-20 12:07:27 +08:00 via iPhone
最简单用队列处理啊
|
15
hhh798 OP 我大概知道搜索方向了,感谢大家
|
16
mingl0280 2019-10-20 12:30:08 +08:00
@nioncodotcom 做个写入队列就行了
|
17
kidtest 2019-10-20 12:32:55 +08:00
redis incr
|
18
reus 2019-10-20 13:51:39 +08:00 2
update c = c + 1
你什么破烂数据库连这个的原子性都不能保证? |
19
ech0x 2019-10-20 14:40:14 +08:00 via iPhone
@reus 说的对啊,这个不需要这么麻烦的吧,数据库可以保证原子性的啊……
你不会先读了,然后在程序里+1,再 update 回去了吧。 |
20
hhh798 OP |
21
iPhoneXI 2019-10-20 16:39:55 +08:00 via Android
@nioncodotcom 不就是一条 SQL 的事
|
22
hhh798 OP @iPhoneXI
post 表点赞字段是 applause_count, SQL 这么写:update post set applause_count=applause_count+1 where id=XX? |
23
iPhoneXI 2019-10-20 17:40:49 +08:00 via Android
@nioncodotcom 我觉得这么写没啥问题
|
24
mingmeng 2019-10-20 18:09:19 +08:00 via Android
@nioncodotcom 你是先查出来结果,添加之后再入库?这样不就构成了脏数据么。。。
|
25
ech0x 2019-10-20 18:12:51 +08:00 via iPhone
@nioncodotcom 对啊,就是这样写啊……不然呢。
|
26
ech0x 2019-10-20 18:19:07 +08:00 via iPhone
@nioncodotcom 你先读再 update 就得自己维持原子性了。
|
28
mingmeng 2019-10-20 21:05:05 +08:00 via Android
@nioncodotcom 该补一下课了,数据库 ACID 原子性,一致性,隔离性,持久性~
|
29
Kontinue 2019-10-21 08:41:26 +08:00
楼上说的都对,根据方案可以再去搜对应的博客。
当前前提得看你的并发量不是?如果仅仅只是考虑到这个问题或并发量不大,直接 update 乐观锁搞定(毕竟编码简单),并发量高的才考虑设计使用队列 redis etc. |
30
Raymon111111 2019-10-21 12:42:14 +08:00
如果是只要数量的话用 redis ++ 就可以了
|