数据库:通过分槽减少计数字段的竞争

一个红人发了一个帖子,每秒对这个帖子的“赞”数可能会很高。如果这些赞请求都落到数据库中的同一条记录上,会导致对同一条记录过高的临界访问(因为有锁),导致排队。

解决办法是把这1条记录拆成100条记录,更新赞数时可能会更新到其中任意一条记录上。这样并发访问的竞争就会松很多。当需要显示总赞数时,临时把100条记录的总赞数累加起来即可。

对于NoSQL数据库和关系数据库,实现这种分槽(slot)机制都不难。对于MySQL数据库,最简单的做法是:

insert into post_like_counter(post_id, slot, like_count)
    values (100, rand() * 100, 1)
    on duplicate key update like_count = like_count + 1

其中slot是槽号(1-100).  <post_id, slot>组成一个唯一键。

Leave a Comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.