我们经常会遇到新增数据,一次增加的量会比较大的情况,都会进行批量的插入数据,insert into A(id,key1,key2,key3..)values(...),会进行一次大批量的插入操作。如果id不会重复,而且表A,仅仅是以,id为主键,其他唯一性索引没有的情况,这种插入操作不会有问题,但是当A中出现唯一性索引,(key1,key2,key3)的时候,那么在高并发的插入操作中,就出现一些异常的情况,会出现大量插入操作,等待,触发锁超时,长时间占用了大量的数据库连接。
那么为什么呢?因为mysql进行唯一性检测的时候,使用的是S锁,就是共享锁,mysql的锁,从大的分类上有共享锁S和排他锁X,共享锁,顾名思义,就是其他的S型锁,也可以完成加锁操作。那么好理解,这就是多个mysql连接,出现了重复的数据,都是去进行唯一性检测,申请共享锁,这样的话,就会造成比较多的mysql连接超时,数据库吞吐下降。
那么如何进行优化,避免这种情况呢?
那么就是redis分布式锁+db查询,进行流量的消减。首先是根据唯一性索引构造一个key,然后使用redis的setnx(key,value,timeout),不通过,那么直接返回掉,通过则进行db查询,将如果没有数据,执行插入操作,如果有数据,则返回掉,经过两步的处理,能够挡掉很多重复的数据流
![c74b5b16438dddcfeaae560db19c773d.png](https://i-blog.csdnimg.cn/blog_migrate/037e79c0f0d3e4643b5b3f8e635cceed.jpeg)