分布式锁:
在高并发环境下,由于大量请求同时访问一个资源进行操作,很容易产生超买的情况,造成数据错误,如果是单服务器情况下,我们可以通过普通的锁去控制,但是解决不了分布式环境的情况,所以我们用到了分布式锁来保证互斥。
Redis:
Redis强大之处在于它不仅仅是一个NO-SQL数据库,他有丰富的数据类型,和基于内存高效的读写速度。而且他是单线程单进程模式,可以将并发请求变成串行访问,这个就是为什么可以用它实现分布式锁来解决高并发下资源争抢问题。
Redis实现简单的分布式锁:
Redis可以简单通过setNx去实现分布式锁,主要通过setNx设置key,一般key就是争抢资源的id,如商品A的id,设置过期时间,当用户A去操作商品A的时,设置key ,B如果也要操作,发现Redis已经存在key,就只能等待。但其实这样的方案存在一定的问题。如如果用户A去设置完Key之后,服务器挂了,导致过期时间没有设置成功,就会出现问题,key一直没有释放,导致其他请求也不能获取。因为设置key和expiretime不是原子性操作,这种情况是有可能方式的,为了避免这种情况,我们必须把这两步合为一步(加syn锁就行)。
Redission的分布式锁:
Redission是一个基于Redis的优秀客户端,他对redis的分布式锁有很完善的实现,
简单实现如下: