pom.xml文件
<dependency> <groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
在测试类测试
image.png
image.png
image.png
image.png

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
image.png
具体
image.png
如何验证加锁成功
jedis.set("aaa",v,setParams)
这个方法里,如果加锁成功会返回ok
image.png

解锁还会出现一个问题,因为解锁的方法都在finally里面,所以别人可能会接调属于自己的锁,造成了提前释放。
所以需要设定密码,就value。
真正的密码匹配或者是超出了执行时间才会释放。


伍六七
1 声望0 粉丝