同步锁
减少同步锁的使用
在多线程并发运行中,应该在保证线程安全的情况下,尽量少使用线程同步锁,因为线程同步对多线程并发运行的性能影响很大
比如日志输出可以不要求实时同步,那么就可以把线程同步输出日志改为异步输出
减少同步锁同步范围
如果一定要使用线程同步锁,那么应该尽量减少线程同步的代码范围,只对必须保证线程安全的代码加线程同步锁
分布式同步锁
虽然在代码中可以使用同步锁保证线程安全,使数据库中不出现重复的脏数据,但是却影响了多线程并发时的性能
此种线程安全只能适用单个应用服务器节点的部署情况,如果是分布式的多个节点部署方案,则此种同步锁无法奏效
一般需要借助分布式同步锁,比如借助Redis
、ZooKeeper
实现分布式同步锁
但是使用分布式同步锁,其并发性能一般也很低效
数据库唯一索引
除了使用同步锁来保证数据不重复插入这种方式外,还可以使用数据库的唯一索引来保证数据库的数据唯一,确保不重复插入
虽然使用唯一索引后,数据库肯定会有性能消耗,但是在数据量不是非常大的时候,这种方式性能效果应该更佳,而且数据库数据查询可以通过建立索引来提高查询效率
针对数据库中数据量非常大的情况,可以采用分表的方案
比如可以针对唯一字段基于某种算法做分表处理,确保唯一字段采用算法计算时每次都是进入同一个表中,这样还是可以对每张表中唯一字段建立唯一索引来提高性能