大型网站及应用都是分布式部署的,在分布式环境中的数据一致性问题一直是一个比较重要的话题,如何保证数据的一致性,那就离不开分布式锁。那么问题也就接踵而至。分布式锁有基于数据库的行数、redis以及zookeeper三种实现方式,一样是分布式锁,三者的区别何在?各自适用什么场景?
一.场景mysql
- 电商场景中的秒杀、抢购;保证产品不超卖。
- 好比是在分布式集群环境里,多个客户端同时修改一个共享的数据保证数据的一致性。
二.分布式锁的方案redis
- 基于数据库的行锁,有乐观锁、悲观锁。
- 使用redis来解决,也有乐观锁和悲观锁两种实现。
- 基于zookeeper
三.几种方案的比较sql
- 基于数据库的实现,首先数据库的访问其实就是对磁盘文件的访问,高并发环境下,磁盘IO读写过多,确定会占用不少资源,必然致使CPU占用会居高不下,在高并发的状况下,确定不能如此高频率的去读写数据库。并且mysql是一个链接给一个线程,当并发高的时候,每秒须要几百个甚至更多的线程,其中建立和销毁线程也很耗费性能。
- redis实现,首先redis自己是一个cache,全部的操做都在内存中进行的。固然redis是支持落地的(题外话)。
- zk.......等研究好了补上。
四.悲观锁和乐观锁的选择
我总结了一下有这么几点:数据库
- 响应时间
- 冲突频率
- 重试代价
若是须要很是高的响应速度,建议使用乐观锁,成功就执行,不成功就失败,不须要等待其余并发去释放锁。若是冲突频率高或者重试代价大建议使用悲观锁。mybatis
五.实现方式
数据库的悲观锁和乐观锁并发
- 悲观锁使用mybatis的能够用for update。
- 乐观锁直接用版本号
redis悲观锁和乐观锁分布式
- 悲观锁 SETNX
- 乐观锁 WATCH MULTI EXEC
zk实现高并发
.................性能
下一篇将具体介绍如何使用redis实现分布式锁,敬请期待!网站