分布式锁概述

大型网站及应用都是分布式部署的,在分布式环境中的数据一致性问题一直是一个比较重要的话题,如何保证数据的一致性,那就离不开分布式锁。那么问题也就接踵而至。分布式锁有基于数据库的行数、redis以及zookeeper三种实现方式,一样是分布式锁,三者的区别何在?各自适用什么场景?
一.场景mysql

  • 电商场景中的秒杀、抢购;保证产品不超卖。
  • 好比是在分布式集群环境里,多个客户端同时修改一个共享的数据保证数据的一致性。

二.分布式锁的方案redis

  • 基于数据库的行锁,有乐观锁、悲观锁。
  • 使用redis来解决,也有乐观锁和悲观锁两种实现。
  • 基于zookeeper

三.几种方案的比较sql

  • 基于数据库的实现,首先数据库的访问其实就是对磁盘文件的访问,高并发环境下,磁盘IO读写过多,确定会占用不少资源,必然致使CPU占用会居高不下,在高并发的状况下,确定不能如此高频率的去读写数据库。并且mysql是一个链接给一个线程,当并发高的时候,每秒须要几百个甚至更多的线程,其中建立和销毁线程也很耗费性能。
  • redis实现,首先redis自己是一个cache,全部的操做都在内存中进行的。固然redis是支持落地的(题外话)。
  • zk.......等研究好了补上。

四.悲观锁和乐观锁的选择
我总结了一下有这么几点:数据库

  1. 响应时间
  2. 冲突频率
  3. 重试代价

若是须要很是高的响应速度,建议使用乐观锁,成功就执行,不成功就失败,不须要等待其余并发去释放锁。若是冲突频率高或者重试代价大建议使用悲观锁。mybatis

五.实现方式
数据库的悲观锁和乐观锁并发

  • 悲观锁使用mybatis的能够用for update。
  • 乐观锁直接用版本号

redis悲观锁和乐观锁分布式

  • 悲观锁 SETNX
  • 乐观锁 WATCH MULTI EXEC

zk实现高并发

.................性能

下一篇将具体介绍如何使用redis实现分布式锁,敬请期待!网站

相关文章
相关标签/搜索