# redis实现分布式锁 **Repository Path**: eric-tutorial/wig-demo ## Basic Information - **Project Name**: redis实现分布式锁 - **Description**: redis实现的分布式锁的案例 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 5 - **Created**: 2021-06-06 - **Last Updated**: 2022-05-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 戴着假发的程序员-分布式锁 #### 介绍 使用redis实现的分布式案例。 具体的锁工具类在:com.st.lock.util.RedisLock类中。 我在这里做一个简单的修改。 #### 项目结构说明 这个图片就是看不到。 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1210/171805_2c9a7a77_1964272.png "屏幕截图.png") #### 安装教程 1. 创建数据库 2. 创建数据表 ```sql SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for lock_test -- ---------------------------- DROP TABLE IF EXISTS `lock_test`; CREATE TABLE `lock_test` ( `num` bigint(20) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of lock_test -- ---------------------------- INSERT INTO `lock_test` VALUES ('0'); ``` 3. 配置nginx反向代理 ```tex upstream locktest{ server 127.0.0.1:9090; server 127.0.0.1:9091; server 127.0.0.1:9092; } server{ listen 888; server_name localhost; location / { proxy_pass http://locktest; index index.html index.htm; } } ``` #### 使用说明 启动三个结点,配置好nginx的负载均衡 1. 安装jmeter 2. 测试 ## 总结 redis手写分布式锁有三个操作 1. 加锁 1. 释放锁 1. 给锁续命(剩余1/3时间的时候) ### 加锁 1. 节点加锁的key都是一样的,value需要添加本次加锁的唯一标志,还有过期时间(防止宕机后造成死锁) ### 释放锁 1. 释放锁只能释放自己的值时候的锁,注意需要在finally里释放锁 ### 给锁续命 1. 给锁续命,只能续自己值的锁 下面这个拿到锁之后,只有当前一个结点能操作数据库,其他的结点都是处于等待中,其实这个没有提高总体的QPS或者吞吐量。只是多节点部署增加了可靠性。防止单机部署后服务宕机不可用。 ![img.png](img.png) 秒杀的场景下,库存是一定的,但是请求次数可能会大于库存,所以会存在有的线程获取库存失败,也可就是没抢到货。但是如果控制不好,有可能会超卖,导致库存出现负数都是有可能的。 ## 拓展 setNx命令 一般正常生产使用的应该是redisson组件 1. [分布式锁Redisson的使用,看门狗机制](https://blog.csdn.net/weixin_43691942/article/details/107591137) 1. https://www.jianshu.com/p/c970cc71070b 1. https://gitee.com/ztp/redisson-spring-boot-starter 1. https://blog.csdn.net/gly1256288307/article/details/88739612