pom.xml 文件
<dependency> <groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
在测试类测试
jedis.setex(key, 存活工夫,v)
jedis.setnx(k,?)如果 k 里没有值就赋值,有就不动。
秒杀业务的实现 – 分布式锁机制
7000 元 手机 20 显示胜利 领取 1 元
首先:1tomcat 服务器必定有多台
2 数据库数据只有 1 份
3 必然会呈现高并发的景象
即多线程对同一资源进行操作,导致线程安全性问题
应用同步锁:实用于单台 tomcat 服务器
同步锁不适用于大程序的开发,因为它只能负责体态 tomcat
![image.png](/img/bVcHorV)
如果两台 tomcat 都应用同步锁,
两台服务器独特对数据库进行读写操作,肯定会产生并发问题,即手机屡次卖出。
怎么保障业务的实现??
为了解决这种问题时用分布式锁,锁应用第三方操作,专用。
准则:当锁被应用时,其余用户不能应用。
策略:用户向 redis 中放弃一个 key,如果 redis 中有人应用这把锁,其他人不容许应用。如果 redis 没有 key,则示意我能够应用这把锁。
为了避免这个 key 始终不开释就在锁设置存活工夫。
原理图 用的是一个 redis
redis 单线程,单过程的,所以不会有同时存 key 的可能
加锁 setkey
解锁 delkey
具体
如何验证加锁胜利
jedis.set(“aaa”,v,setParams)
这个办法里,如果加锁胜利会返回 ok
解锁还会呈现一个问题,因为解锁的办法都在 finally 外面,所以他人可能会接调属于本人的锁,造成了提前开释。
所以须要设定明码,就 value。
真正的明码匹配或者是超出了执行工夫才会开释。