当前位置: 首页 > news >正文

网站 wordpress 公众号自己做网站跟域名怎样做

网站 wordpress 公众号,自己做网站跟域名怎样做,做软测的网站,淮北人论坛招聘网目录 分布式锁一#xff1a;基本原理和实现方式二#xff1a;分布式锁的实现1#xff1a;分布式锁的误删问题2#xff1a;解决误删问题 三#xff1a;lua脚本解决多条命令原子性问题调用lua脚本 四#xff1a;Redisson1#xff1a;redisson入门2#xff1a;redisson可重… 目录 分布式锁一基本原理和实现方式二分布式锁的实现1分布式锁的误删问题2解决误删问题 三lua脚本解决多条命令原子性问题调用lua脚本 四Redisson1redisson入门2redisson可重入锁的原理3解决尝试等待超时释放的问题看门狗4主从一致性问题 分布式锁 一基本原理和实现方式 使用redis实现分布式锁 我们实现分布式锁有两个基本方法 一个是获取锁 一个是删除锁 获取我们使用setnx只有不存在才会set成功作为互斥锁 删除直接删除这个锁的键就行了 但是要考虑一种情况就是获取锁之后服务宕机了那么就无法释放锁也就会出现死锁服务挂了为了预防这种情况的发生我们要设置过期时间就算服务宕机过了过期时间锁也会释放 还有一种情况就是设置锁还没去设置锁的过期时间这个时候服务就宕机了那么也会出现死锁我们要保证获取锁和设置过期时间这个操作的原子性redis种就提供了方法可以同时设置过期时间和互斥锁 set lock t1 nx ex 10 二分布式锁的实现 我们去实现这个接口 public class SimpleRedisLock implements ILock{//锁的名称private String name;private StringRedisTemplate stringRedisTemplate;public SimpleRedisLock(String name, StringRedisTemplate stringRedisTemplate) {this.name name;this.stringRedisTemplate stringRedisTemplate;}//锁的前缀是个常量private static final String KEY_VALUE lock:;/*** 获取锁* param timeoutSec* return*/Overridepublic boolean trylock(long timeoutSec) {//获取当前线程id作为锁的valuelong id Thread.currentThread().getId();//设值尝试获取锁true是成功false是失败Boolean b stringRedisTemplate.opsForValue().setIfAbsent(KEY_VALUE name, id , timeoutSec, TimeUnit.SECONDS);//因为直接返回b的话jvm会自动装箱拆箱可能会造成空指针异常如果b为true返回就是true如果b为false返回就是false如果为空返回也是falsereturn Boolean.TRUE.equals(b);}/*** 释放锁*/Overridepublic void unlock() {stringRedisTemplate.delete(KEY_VALUE name);} }我们在一人一单的问题使用分布式锁 Long id UserHolder.getUser().getId(); SimpleRedisLock simpleRedisLock new SimpleRedisLock(order id, stringRedisTemplate); boolean trylock simpleRedisLock.trylock(1200); if (!trylock){return Result.fail(一人只能下一单); } try {IVoucherOrderService orderService (IVoucherOrderService) AopContext.currentProxy();return orderService.createVoucherOrder(voucherId); } catch (IllegalStateException e) {throw new RuntimeException(e); }finally {simpleRedisLock.unlock(); }1分布式锁的误删问题 存在的问题是这样的 线程1去获取锁但是呢业务阻塞超时了锁就自动释放了这个时候线程2来了因为锁释放了线程2可以获取到锁就在这时线程1阻塞通过了完成了业务之后就要释放锁了这个时候释放的锁是线程2的锁线程2还在执行这个时候线程3也去获取锁成功了那么就出现了线程23并发执行的情况造成并发安全问题 这里的问题是线程释放锁释放的不是自己的锁所以我们解决办法就是在线程释放的时候判断一下是不是自己的锁怎么判断呢我们之前获取锁的时候存入的value是线程的id这个就是线程的唯一标识我们只需要判断当前线程id和存入的value是否一致就行 2解决误删问题 //锁的前缀是个常量 private static final String KEY_VALUE lock:; //加上线程的前缀保证不同集群不同线程的id是唯一 public static final String ID_VALUE UUID.randomUUID().toString(true);/*** 获取锁* param timeoutSec* return*/ Override public boolean trylock(long timeoutSec) {//获取当前线程id作为锁的valueString id ID_VALUE Thread.currentThread().getId();//设值尝试获取锁true是成功false是失败Boolean b stringRedisTemplate.opsForValue().setIfAbsent(KEY_VALUE name, id , timeoutSec, TimeUnit.SECONDS);//因为直接返回b的话jvm会自动装箱拆箱可能会造成空指针异常如果b为true返回就是true如果b为false返回就是false如果为空返回也是falsereturn Boolean.TRUE.equals(b); }只要在锁获取的时候给线程加上唯一标识就行我们原来用的是线程id这样不能保证唯一因为线程id是在同一个jvm内部是递增的不同jvm的线程id可能相同那么就需要加上前缀保证线程标识的唯一性那么就可以使用uuid来保证每一台jvm的uuid是不同的标识就是唯一的 释放锁 Override public void unlock() {if (stringRedisTemplate.opsForValue().get(KEY_VALUE name).equals(ID_VALUE Thread.currentThread().getId())){stringRedisTemplate.delete(KEY_VALUE name);} }判断锁中的val和当前线程的标识是否一致 这样就解决了误删的问题 但是还有一个问题 假设一个线程1获取锁之后执行业务执行完之后要释放锁判断了当前锁是否是自己的锁的value在要执行删除操作的时候堵塞了锁超时释放了这个时候线程2获取锁执行业务就在这时线程1阻塞结束执行的代码在释放锁上因为同一个业务锁的key都是一样的所以线程一能够把锁释放这时线程2还没执行结束线程3来了就出现了线程安全问题 所以说我们要将判断锁和释放锁作为一个原子性事件要么同时发生要么同时失败 这就要用lua了 三lua脚本解决多条命令原子性问题 --获取当前key local key KEY[1] --获取当前线程标识 local id ARGV[1]--获取锁中的标识 local _idredis.call(get,key) --判断是否是同一个标识 if(id_id) thenreturn redis.call(del,key) end return 0在idea中我们执行lua 脚本我们可以在resouce中创建一个lua文件 要安装插件才行 插件名叫emmylua 调用lua脚本 //声明一个DefaultRedisScript原来调取lua脚本 public static final DefaultRedisScript UNLOCK_LUA; static {//初始化UNLOCK_LUAnew DefaultRedisScript();//定位到lua脚本的位置UNLOCK_LUA.setLocation(new ClassPathResource(unlock.lua));//设置lua脚本的返回值UNLOCK_LUA.setResultType(Long.class); }Override public void unlock() {// Collections.singletonList创建单元素的集合stringRedisTemplate.execute(UNLOCK_LUA,Collections.singletonList(KEY_VALUE name),(ID_VALUE Thread.currentThread().getId())); }这样将判断标识和释放锁的命令写在lua脚本中就能够保证命令执行的原子性就不会出现之前说的误删的情况 我们实现分布式锁的思路 获取锁使用setnx互斥的特性获取值相当于设置锁使用uuid保证线程的唯一性 释放锁释放之前判断锁释放是当前线程的锁并且将判断锁和释放锁的命令写在一个lua脚本中保证执行命令的原子性 四Redisson 1redisson入门 步骤1 引入依赖 dependencygroupIdorg.redisson/groupIdartifactIdredisson/artifactIdversion3.33.0/version /dependency步骤二 配置客户端 Configuration public class RedissonConfig {Beanpublic RedissonClient redissonClient(){Config config new Config();config.useSingleServer().setAddress(redis://123.249.86.145:6379).setPassword(12345);return Redisson.create(config);} }2redisson可重入锁的原理 可重入锁的逻辑 获取锁如果锁不存在就获取锁然后设置过期时间如果存在了就判断锁的线程标识是否是自己如果是自己那么就让锁的value加一 释放锁释放锁的时候判断锁是否是自己的如果不是自己的就返回空如果是自己的就让value-1然后再判断value是否大于0如果大于0就重置锁的时间等于0就删除锁 3解决尝试等待超时释放的问题看门狗 redisson内部是如何解决重复尝试的呢尝试解读一下首先线程会尝试获取锁获取锁成功就返回空获取锁失败就返回ttl也就是锁的超时释放时间我们重复尝试肯定是建立在获取锁失败的基础上当返回的是ttl时我们会判断当前时间减去我们尝试获取锁的时刻的时间也就是尝试获取锁使用的时间是否大于我们设置的等待时间如果大于我们设置的等待时间那么就尝试获取锁失败就返回false如果还有时间我们不是直接再去获取锁而是通过订阅机制我们等待释放锁的信号如果等待时间超时就直接返回false如果没抄时我们在重新尝试锁失败在判断是否还有时间然后定义然后重试就这么循环下去要么拿到锁要么超过等待时间获取锁失败这样就解决我们获取锁失败一次就返回失败可以一直尝试 然后再来讲一下超时释放问题也就是过了设置的超时时间业务还没执行完锁就释放了出现了并发安全问题怎么解决的呢我们如果没有设置这个锁的超时释放时间那么redisson就会自动给我们的超时释放时间设置为-1这个时候才会开启看门狗机制具体是什么情况呢就是内部会开启一个任务这个任务会一直刷新锁的超时时间一直无限的刷新每10秒刷新一次刷新一次延长30秒也就会一直存在这个锁知道完成任务释放锁才会取消这个看门狗任务 那么释放锁的时候如果释放失败就返回异常释放成功就要做两件事一个是发送释放锁的信息给正在订阅尝试获取锁的还有一件事就是将看门狗任务终止 4主从一致性问题 主从一致性问题在redis集群中有主从关系一个主节点有多个从节点当主节点宕机时会选一个从节点作为主节点 主节点和从节点为了数据一样会做主从同步操作有一个问题就是当java应用向主节点发送请求获取锁获取锁成功了但是在主从同步还没完成的时候主节点宕机了这个时候哨兵就会发现宕机然后从从节点中选出一个作为主节点而因为数据未同步新的主节点中没有锁也就是锁失效了那么其他线程发送请求就能获取锁这就是锁失效的问题 如何解决呢我们不设置主从关系只设置节点每个节点都相当与主节点而且获取锁的时候必须要所有的节点都获取锁成功才算获取锁成功如果有一个节点宕机了他的从节点成为了新的节点这个时候有线程来获取锁也是不成功的因为要在所有节点中获取锁而其他节点已经持有锁了这就解决了主从一致性问题 获取锁成功了但是在主从同步还没完成的时候主节点宕机了这个时候哨兵就会发现宕机然后从从节点中选出一个作为主节点而因为数据未同步新的主节点中没有锁也就是锁失效了那么其他线程发送请求就能获取锁这就是锁失效的问题 [外链图片转存中…(img-1BgOGPaG-1730426881642)] 如何解决呢我们不设置主从关系只设置节点每个节点都相当与主节点而且获取锁的时候必须要所有的节点都获取锁成功才算获取锁成功如果有一个节点宕机了他的从节点成为了新的节点这个时候有线程来获取锁也是不成功的因为要在所有节点中获取锁而其他节点已经持有锁了这就解决了主从一致性问题
http://www.hkea.cn/news/14332741/

相关文章:

  • 怎么创建网站建设网站做优化有什么好处
  • 上海网站制作商兰亭集势网站模板
  • 网站怎么建设高端公司wordpress fox
  • python 网站开发 案例最好的cms开源
  • 千图素材网站网页设计与制作心得体会1500字
  • 萧山网站优化清华大学精品课程网站
  • 本地网站怎么做网页设计模板代码网站
  • 大型网站维护费一年多少wordpress外链略缩图
  • 网站做次级页面邢台做网站推广费用
  • 怎么让网站被收录长春网站只长春网站制作做
  • 竹子建站怎么样贸易公司如何找客户
  • 临沂哪家做网站最好成品网站源码免费
  • html做的网站排版错误郴州网站优化
  • 网站文章不收录的原因wordpress调用多媒体
  • 艺梵科技 网站建设百度推广seo自学
  • 哪个域名网站好百度打网站名称就显示 如何做
  • 网站建设功能列表百度账号怎么注册
  • 上海韵茵网站建设编程网站排名
  • 无锡大型设计网站报价关于网站开发的一些论文
  • 生态建设研究所网站新手建网站
  • 网站建设试用建设部注册人员查询
  • 四川建设网官方网站wordpress 页眉
  • 杭州企业网站建设方案网站建设费税率多少
  • 腾讯建设网站首页奋进新征程
  • 酒店网站模版东坑镇网站建设公司
  • 南通市住房建设局网站微信公众平台网页
  • 简单网站设计价格wordpress 后台移除新闻
  • 东坑镇仿做网站手机版 pc 版本 网站 跳转 seo
  • 建网站的公司广州排名商品关键词优化的方法
  • 建设网站的工作总结软件专业做学校网站论文怎么选题