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

陈村网站开发顺德品牌网站建设咨询

陈村网站开发,顺德品牌网站建设咨询,现在做网站还有用吗,wordpress怎么添加关键词一、为什么要使用分布式锁#xff1f; 因为在集群下#xff0c;相当于多个JVM#xff0c;就相当于多个锁#xff0c;集群之间锁是没有关联的#xff0c;会照成锁失效从而导致线程安全问题 分布式锁可以分别通过MySQL、Redis、Zookeeper来进行实现 二、redis分布式锁的实…一、为什么要使用分布式锁 因为在集群下相当于多个JVM就相当于多个锁集群之间锁是没有关联的会照成锁失效从而导致线程安全问题 分布式锁可以分别通过MySQL、Redis、Zookeeper来进行实现 二、redis分布式锁的实现基于setnx实现的分布式锁 创建ILock接口 package com.hmdp.utils;public interface ILock {/*** 尝试获取锁* param timeoutSec* return*/boolean tryLock(long timeoutSec);/*** 释放锁*/void unLock(); }创建SimpleRedisLock实现类 package com.hmdp.utils;import cn.hutool.core.lang.UUID; import org.springframework.data.redis.core.StringRedisTemplate;import java.util.concurrent.TimeUnit;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_PREFIX lock;Overridepublic boolean tryLock(long timeoutSec) {// 获取线程标示String threadId Thread.currentThread().getId();// 获取锁Boolean success stringRedisTemplate.opsForValue().setIfAbsent(KEY_PREFIX name, threadId, timeoutSec, TimeUnit.SECONDS);return Boolean.TRUE.equals(success);}Overridepublic void unLock() {// 释放锁stringRedisTemplate.delete(KEY_PREFIX name);} }三、以上Redis分布式锁存在的一些问题 1、锁的误删问题 问题线程1拿到锁产生了业务阻塞这个时候锁已经超时释放导致线程2可以拿到锁这时线程1业务执行完会将线程2的锁进行释放 解决方案在释放锁的时候进行判断是否是自己的锁 SimpleRedisLock实现类代码优化 package com.hmdp.utils;import cn.hutool.core.lang.UUID; import org.springframework.data.redis.core.StringRedisTemplate;import java.util.concurrent.TimeUnit;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_PREFIX lock;private static final String ID_PREFIX UUID.randomUUID().toString(true) -;Overridepublic boolean tryLock(long timeoutSec) {// 获取线程标示String threadId ID_PREFIX Thread.currentThread().getId();// 获取锁Boolean success stringRedisTemplate.opsForValue().setIfAbsent(KEY_PREFIX name, threadId, timeoutSec, TimeUnit.SECONDS);return Boolean.TRUE.equals(success);}Overridepublic void unLock() {// 获取线程标示String threadId ID_PREFIX Thread.currentThread().getId();// 获取锁中的标示String id stringRedisTemplate.opsForValue().get(KEY_PREFIX name);// 判断标示是否一致if (threadId.equals(id)) {// 释放锁stringRedisTemplate.delete(KEY_PREFIX name);}} }2、原子性问题 问题线程1获取锁执行业务结束判断锁是否是自己的判断成功可能在Jvm垃圾回收的时候阻塞时间过长这是在判断成功和释放锁之间执行的动作导致锁超时释放这个时候线程2可以成功获取到锁当线程1阻塞结束因为判断锁是否是自己的已经成功所以线程1直接删除锁从而导致误删了线程2的锁 解决思路保证判断和释放的原子性 解决方法 创建lua文件并编写lua脚本(IDEA需要下载插件EmmyLua) ** ** lua脚本内容 -- 比较线程标示与锁中的标示是否一致 if(redis.call(get,KEYS[1]) ARGY[1]) thenreturn redis.call(del,KEYS[1]) end return 0调用lua脚本 SimpleRedisLock实现类代码修改 package com.hmdp.utils;import cn.hutool.core.lang.UUID; import org.springframework.core.io.ClassPathResource; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.script.DefaultRedisScript;import java.util.Collections; import java.util.concurrent.TimeUnit;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_PREFIX lock;private static final String ID_PREFIX UUID.randomUUID().toString(true) -;private static final DefaultRedisScriptLong UNLOCK_SCRIPT;static {UNLOCK_SCRIPT new DefaultRedisScript();UNLOCK_SCRIPT.setLocation(new ClassPathResource(unlock.lua));UNLOCK_SCRIPT.setResultType(Long.class);}Overridepublic boolean tryLock(long timeoutSec) {// 获取线程标示String threadId ID_PREFIX Thread.currentThread().getId();// 获取锁Boolean success stringRedisTemplate.opsForValue().setIfAbsent(KEY_PREFIX name, threadId, timeoutSec, TimeUnit.SECONDS);return Boolean.TRUE.equals(success);}Overridepublic void unLock() {// 调用lua脚本stringRedisTemplate.execute(UNLOCK_SCRIPT,Collections.singletonList(KEY_PREFIX name),ID_PREFIX Thread.currentThread().getId());} }3、还存在一些问题 不可重入同一个线程无法多次获取同一把锁不可重试获取锁只尝试一次就返回false没有重试机制超时释放锁超时释放虽然可以避免死锁但如果是业务执行耗时较长也会导致锁释放存在安全隐患主从一致性如果Redis提供了主从集群主从同步存在延迟当主宕机时如果从并同步主中的锁数据则会出现锁实现 以上自己设计Redis分布式锁是为了让大家了解分布式锁的基本原理在企业中直接通过Redisson来实现就可以 四、Redisson 1.什么是Redisson Redisson是一个在Redis的基础上实现的Java驻内存数据网络。它不仅提供了一系列的分布式的Java常用对象还提供了许多分布式服务其中就包含了各种分布式锁的实现 2.使用方法 1.引入依赖 dependencygroupIdorg.redisson/groupIdartifactIdredisson/artifactIdversion3.13.6/version/dependency2.配置Redisson package com.hmdp.config;import org.redisson.Redisson; import org.redisson.api.RedissonClient; import org.redisson.config.Config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;Configuration public class RedissonConfig {Beanpublic RedissonClient redissonClient(){// 配置Config config new Config();// 配置自己的虚拟机地址和密码 配置密码是setPassword()我虚拟机没有密码所以省略config.useSingleServer().setAddress(redis://192.168.198.138:6379);// 创建RedissonClient对象return Redisson.create(config);}} 3.使用Redisson的分布式锁 Resourceprivate RedissonClient redissonClient;Testvoid testRedisson() throws InterruptedException {// 获取锁可重入指定锁的名称RLock lock redissonClient.getLock(anyLock);// 尝试获取锁参数分别是获取锁的最大等待时间期间会重试锁自动释放时间时间单位boolean isLock lock.tryLock(1,10,TimeUnit.SECONDS);// 判断释放获取成功if(isLock) {try {System.out.println(执行业务);} finally {// 释放锁lock.unlock();}}}3.Redisson可重入锁原理 4.Redisson分布式锁原理 可重入利用hash结构记录线程id和重入次数 可重试利用信号量和PubSub功能实现等待、唤醒、获取锁失败的重试机制 超时续约利用watchDog每隔一段时间releaseTime / 3重置超时时间 主从一致性利用Redisson的multiLock。原理多个独立的Redis节点必须在所有节点都获取重入锁才算获取锁成功
http://www.sadfv.cn/news/273050/

相关文章:

  • html网站制作答辩ppt建筑木模板
  • 通桥小学的网站建设浙江创都建设有限公司网站
  • 互联网站管理工作细则路由器屏蔽网站怎么做
  • 网站策划方案范文华米手表官方网站
  • 万网买网站怎样建立网站ip地址
  • 高端网站设计高端网站制作微网站如何做微信支付宝支付接口
  • 免费申请个人网站网站有图片的验证码是怎么做的
  • 排版的网站自媒体怎么注册
  • asp网站防注入代码宁德建设银行网站
  • 松江建设网站公司wordpress 帮助插件
  • 茶叶网站建设策划方案u001f外包网站
  • 成都商城网站开发聊城有什么网站制作公司
  • 创研科技做网站怎么样WordPress报错关闭
  • 深圳网站建设(龙华信科)节水网站建设
  • 昆明专业做网站站酷网如何接单
  • 怎么让自己的网站通过域名访问不了网站模块是啥
  • 什么是网站建设需求分析汽车配件外贸网站
  • 学校网站建设管理办法网站上网络营销
  • 网站文字变白色代码怎么做wordpress自定义tag页面
  • 网页设计教程网站青岛制作公司网站
  • asp个人网站建设怎样用php做网站
  • 房产发布网站建设广告公司名称推荐
  • 网站建设公司未来方向wordpress启用memcahe
  • 网站挂马怎么处理一级做受网站
  • 免费建站网站号山西泽庆建设公司官网
  • 长春建站优化小制作作文400字
  • 你知道吗 网站专业网页美工招聘
  • 如何进行网站优化设计如何使用好wordpress
  • 网站卖东西怎么做太仓住房与城乡建设部网站
  • 网站图片属性是什么临沂市网站建设公司