基于redis实现分布式锁

       谈到给代码加锁、代码同步问题,我们都会想到synchronized或者lock,这两种加锁机制虽然可以解决同步问题,但是这种锁是属于JVM级别的,只能适用于单体架构,而分布式应用一般都是部署多台服务器上也就是有多个JVM,

这时synchronized或者lock就没有办法解决,比如一个电商系统里面某个方法要对某件商品进行减库存,这个系统部署在多台服务器上,即使加上了synchronized锁,这时两个人买这个商品同时进来减库存,基于负载均衡可能会出现

两个人的减库存请求访问在两个服务器上,就会出现明明是两个人买同一件商品结果只减了一个库存。这时就要使用分布式锁,目前对于实现分布式锁依赖的中间件主要有三种:redis、数据库(mysql等)、zookeeper,这些中间件

之所以能实现分布式锁是因为无论你这个应用部署在多少台服务器上,都要去访问这些中间件,比如mysql,减库存怎么减都是要访问数据库的,无论多少个请求、从那个服务器进来的请求最后都要汇集于一处,就在这一个集中点

加锁。

    现在就简单介绍下通过redis实现分布式锁,redis里面有一个命令是setnx,这个命令一部分功能和set一样设置一个key,不同的是如果这个key已经存在了,那么就不能设置成功,java里面体现就是会返回一个Boolean类型的值,

设置成功了会返回true,设置不成功(已经有这个key了)会返回false,使用代码实现如下(java里面的setIfAbsent对应的就是redis的setnx),一个分布式锁就实现了

基于redis实现分布式锁

 个屁。。。。。当然没有这么简单啦,这种分布式锁的实现方式还有很多问题,但大体思路就这样,下面会继续完善。

 

以上实现分布式锁来源于图灵学院诸葛老师视频讲解,感谢诸葛老师。

基于redis实现分布式锁

上一篇:tomcat使用system.out.print中文乱码


下一篇:修改git指令alias