2026/4/15 12:32:29
网站建设
项目流程
o2o家电维修网站开发,网站开发公司有哪些,好的app开发公司,加密的网站使用jmeter做压测在一个分布式系统中#xff0c;涉及到多个节点访问同一个公共资源的情况#xff0c;此时就需要通过锁来做互斥控制#xff0c;避免出现类似于“线程安全”问题。之前学过的锁本质都只能在一个进程内部生效#xff0c;分布式系统是有很多进程的#xff08;每个服务器都是独…在一个分布式系统中涉及到多个节点访问同一个公共资源的情况此时就需要通过锁来做互斥控制避免出现类似于“线程安全”问题。之前学过的锁本质都只能在一个进程内部生效分布式系统是有很多进程的每个服务器都是独立的进程之前的锁是无法实现进程间的制约。1.分布式锁场景两个客户端同时去查询都查到了余票为1都执行--操作最终使得票数剩余-1这就导致超卖了所谓的分布式锁本质也是一个/一组单独的服务端程序给其他服务器提供“加锁”这样的服务给其他服务器提供“加锁”这样的服务Redis是一种典型实现分布式锁的方案不是唯一一种买票服务器在进行买票操作过程中需要先加锁往redis上设置一个特殊的key-value完成上述买票操作之后删除setnx可以实现加锁效果针对解锁使用del命令完成问题进程内部的锁进程退了锁就没了但是分布式的锁如果持有锁的服务器掉电会导致锁无法释放其他服务器就无法获取到锁了解决方法给set的key设置过期时间一旦时间到key就会被自动删除需要用set ex nx这种来设置如果用setnxexpire这是无法保证原子的问题如果一个服务器加锁另一个给它解了解决引入校验机制1给服务器编号每个服务器有一个自己的身份标识解锁时先查询编号相同才del2加锁时设置key-valuekey要对应针对哪个资源加锁value存储服务器编号问题加入了校验机制后必须要两步才能完成一步查询、一步del但这两步操作不能保证是原子的。虽然看起来这两个服务器执行两次del没有问题但是如果有第3个服务器在B执行del前就加锁了就会把这个锁解了解决引入lua脚本用lua写一些逻辑上传到redis服务器上然后让客户端来控制redis执行上述脚本redis执行lua的过程也是原子的redis官方文档lua是事务的替代方案2.过期时间续约问题问题加锁时设置过期时间多少合适设置多了服务器挂了很久才释放设置少了服务器还没操作完就自动解锁了解决动态续约例如初始设置1s等到剩余300ms再把时间续成1s从此往复因此服务器这边需要一个专门的线程来负责续约这个线程被称为“看门狗”watch dog3.redis挂了解决采用主从哨兵进行加锁把key设置到主节点上主节点挂了哨兵自动把从节点升级成主节点进一步保证锁可用衍生问题主从节点数据同步是存在延时的主节点先收到set还没同步呢就挂了从节点就没锁了解决redlock算法采用多组主从哨兵加锁就按照一定顺序针对这些组redis加锁写入key成功超过一半视为加锁成功解锁时上述主节点都进行一遍解锁