网站策划建设阶段的推广,福州专业网站建设,网站ui界面设计软件,电商建网站一、锁的作用
锁是为了解决多线程情况下#xff0c;对于共享资源的访问安全问题。 但是当系统是分布式的时候#xff0c;本地锁已经没法锁住所需要的资源#xff0c;因为本地获取了锁#xff0c;其他系统无法得知本地锁的情况。 分布式锁#xff0c;是独立于系统的第一方…一、锁的作用
锁是为了解决多线程情况下对于共享资源的访问安全问题。 但是当系统是分布式的时候本地锁已经没法锁住所需要的资源因为本地获取了锁其他系统无法得知本地锁的情况。 分布式锁是独立于系统的第一方实现的功能。因而状态可供不同系统获取。
二、分布式锁实现
2.1、基于redis实现
基于redis实现的分布式锁是当下比较流行的一种实现方式。 利用redis的set命令用全路径类名方法名作为key当前线程id作为value插入一条记录当且仅当该记录不存在。 如果返回1代表成功获取到锁返回0代表锁已经被其他线程获取了。 命令 格式set key value nx ex 过期时间 释放锁的时候需要判断是否是自己加的锁只能释放自己加的锁。
这样即可以防止系统挂掉导致无法释放锁的情况。不过又引入了锁内代码还没执行完就提前释放的情况因此需要锁续期。可以设置一个守护线程在快要到达第一次超时时间的时候启动守护线程给锁续期每隔所续的时间再次启动守护线程续期。
2.2、基于数据库实现
利用数据库唯一索引来实现分布式锁。 建立一个分布式锁表包含字段全路径类名、方法名给全路径类名方法名建立唯一索引。唯一索引会限制只有一个线程能成功插入数据。 获取锁的时候就往数据库插入一条数据如果插入成功则代表获取到分布式锁。 释放锁的时候就删除该记录。
存在的问题如果获取锁之后数据库或者服务器挂了那么分布式锁就没法释放。使用主从数据库可以解决数据库挂了的问题。服务器挂了的问题可以通过启动一个定时任务根据记录创建时间定时删除数据库超时的记录。
可以通过记录获取锁的主机信息和线程信息如果查到已存在的记录属于当前线程就将锁分配给他实现可重入。
2.3、基于数据库排他锁实现
在查询语句的后面加上for update数据库会启动排他锁利用排他锁可以实现分布式锁。 用户查询到数据就代表他获取了锁可以执行业务代码最后commit提交释放排他锁。 数据库被加了排他锁之后其他线程还想加排他锁就会被阻塞。