使用redis实现分布式锁

当高并发访问某个接口的时候,如果这个接口访问的数据库中的资源,并且你的数据库事务级别是可重复读(Repeatable read)的话,确实是没有线程问题的,因为数据库锁的级别就够了;但是如果这个接口需要访问一个静态变量、静态代码块、全局缓存的中的资源或者redis中的资源的时候,就会出现线程安全的问题。

解决办法:

解决1: 学过javase的小伙伴应该都能想到使用synchronized关键字,强行同步。

缺点:
1、我们可以明显的看到速度变慢了,从原来的0.535秒变到了10.956秒,那是因为synchronized放这个方法只允许单线程访问了。
2、synchronized是粗粒度的控制了线程安全,即:如果我这个商品id不一样的线程,理论上是可以同时访问这个方法的,但是加上了synchronized之后,无论商品id是否一样,两个线程都是没法同时访问这个方法的。
解决2: 使用redis分布式锁(主要使用了redis中的setnxgetset方法,这两个方法在redisTemplate分别是setIfAbsentgetAndSet方法)实现线程安全,因为redis是单线程,能保证线程的安全性,而且redis强大的读写能力能提高效率。

参考文章https://blog.csdn.net/tuesdayma/article/details/82751790

https://www.sohu.com/a/322226531_661203

https://www.jianshu.com/p/c5048208709c

相关推荐