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

网站开发的大致流程做搜狗网站优化排

网站开发的大致流程,做搜狗网站优化排,市住房城乡建设部网站,长沙景点大全 长沙景点排名文章目录 如何实现分布式锁2. Redis 分布式锁存在什么问题2.1 解决死锁问题2.2 解决锁误删问题 如何实现分布式锁 Redis 天生就可以作为一个分布式系统来使用,所以它实现的锁都是分布式锁。 Redis 可以通过 setnx(set if not exists)命令实…

文章目录

  • 如何实现分布式锁
  • 2. Redis 分布式锁存在什么问题
    • 2.1 解决死锁问题
    • 2.2 解决锁误删问题


如何实现分布式锁

Redis 天生就可以作为一个分布式系统来使用,所以它实现的锁都是分布式锁。
图片

Redis 可以通过 setnx(set if not exists)命令实现分布式锁~

setnx mylock true - 加锁
del mylock - 释放锁
图片

通过执行结果是否为 1 可以判断是否成功获取到锁~

2. Redis 分布式锁存在什么问题

Redis 分布式锁存在两个问题:

死锁问题:未设置过期时间,锁忘记释放,加锁后还没来的及释放锁就宕机了都会导致死锁问题.

锁误删问题:设置了超时时间,但是线程执行超过超时时间后锁误删问题.

2.1 解决死锁问题

MySQL 中解决死锁问题是通过设置超时时间,Redis 也是如此,但是问题来了,第一步先加锁,然后再设置超时时间,那么就不满足原子性了,那么怎么办 ?

官方在 Redis 2.6.12 版本之后,新增了一个功能,我们可以使用一条命令既执行加锁操作,又设置超时时间:setnx 和 expire

图片

第一条命令成功加锁,并设置 30 s 过期时间

第二条命令跟在第一条命令后,还没有超过 30s,所以获取失败

2.2 解决锁误删问题

锁误删问题是解决死锁问题带来的问题,如何理解 ?

图片

既然知道了什么是锁误删问题,那么如何解决 ?

答:可以通过添加锁标识来解决.

前面我们使用 set 命令的时候,只使用到了 key,那么可以给 value 设置一个标识,表示当前锁归属于那个线程,例如 value=thread1,value=thread2…

但是这样解决依然存在问题,因为新增锁标识之后,线程在释放锁的时候,需要执行两步操作了:

  • 判断锁是否属于自己
  • 如果是,就删除锁

这样就不能保证原子性了,那该怎么办?

解决方案

使用 lua 脚本来解决 (Redis 本身就能保证 lua 脚本里面所有命令都是原子性操作)
使用 Redisson 框架来解决(主流)
那么 Redisson 如何实现分布式锁呢 ?

代码示例

1.引入 Redisson 依赖

<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.23.2</version>
</dependency>

2.创建 RedissonClient 对象

@Configuration
public class RedissonConfig {@Beanpublic RedissonClient redissonClient() {Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");// 如果有密码需要设置密码return Redisson.create(config);}
}

3.调用分布式锁

@RestController
public class LockController {@Resourceprivate RedissonClient redissonClient;@RequestMapping("/lock")public String lockResource() throws InterruptedException {String lockKey = "myLock";// 获取锁RLock lock = redissonClient.getLock(lockKey);try {// 超时时间 10s, [tryLock 获取成功才需要释放锁,获取失败不需要释放锁]boolean isLocked = lock.tryLock(20, TimeUnit.SECONDS);if(isLocked) {// 成功获取到锁try {TimeUnit.SECONDS.sleep(5);return "成功获取到锁,并执行业务代码";} catch (InterruptedException e) {e.printStackTrace();} finally {// 释放锁lock.unlock();}} else {// 获取锁失败return "获取锁失败";}} catch (InterruptedException e) {e.printStackTrace();}return "获取锁成功";}
}

启动项目,使用 8080 端口访问接口:

图片

http://www.yayakq.cn/news/618016/

相关文章:

  • 网站怎么自适应屏幕大小景区智慧旅游网站建设
  • 上海哪个公司做网站好西安网站seo分析
  • ps 如何做网站网络营销公司主要做些什么
  • 教学互动网站的设计竞网做的网站
  • 网站风格对比做ppt的网站 知乎
  • 做网站运营需要具备什么能力广告影视制作谁家好
  • 中高端网站设计排名下沙做网站
  • 杭州建站模板展示东风地区网站建设
  • jsp网站自身安全性通过什么技术实现延吉有学建设网站的地方吗
  • 为企业做一个网站多少钱海报图片怎么设计制作
  • 公司网站公司新闻广西省河池建设局网站
  • 郑州中企业网站建设怎么去掉网站底部信息
  • 网站推广主要方法html网站登录界面模板下载
  • 网站开发语言分辨大连旅游
  • 关于旅游的网站建设论文做个视频网站
  • 课程网站建设总体情况优秀网站模板欣赏
  • 郴州网站建设哪家做的好关于网站备案
  • 北京网站搜索引擎优化推广网络规划设计师岗位
  • 福建建设工程环保备案网站入口优秀设计网站点评
  • 企业网站建设网页网站开发过程阶段
  • 客户制作网站时的问题网站开发网站说明怎么写
  • 好用的网站后台网站 制作软件
  • 想给公司做网站怎么做国外网站怎么上
  • 怎么刷网站点击量网站建设报价浩森宇特
  • 地方网站域名网站开发项目书
  • 网站到底备案好不好单位网站的作用
  • 网站维护一般怎么做重庆网站仿站
  • 做最好最全的命理网站wordpress添加返回目录标签
  • uzi粉丝做的网站招商网站建设网
  • 销型网站建设必须的步骤包括设计公司企业网站详情