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

做网站开发一般用什么语言优化网站哪个好

做网站开发一般用什么语言,优化网站哪个好,网络营销的网站建设,哪里建设网站最好目录 2.1. 基本实现2.2. 防死锁2.3. 防误删2.4. redis中的lua脚本2.4.1 redis 并不能保证2.4.2 lua介绍 2.5. 使用lua保证删除原子性 2.1. 基本实现 借助于redis中的命令setnx(key, value),key不存在就新增,存在就什么都不做。同时有多个客户端发送setn…

目录

    • 2.1. 基本实现
    • ==2.2. 防死锁==
    • ==2.3. 防误删==
    • 2.4. redis中的lua脚本
      • 2.4.1 redis 并不能保证
      • 2.4.2 lua介绍
    • 2.5. 使用lua保证删除原子性

2.1. 基本实现

借助于redis中的命令setnx(key, value),key不存在就新增,存在就什么都不做。同时有多个客户端发送setnx命令,只有一个客户端可以成功,返回1(true);其他的客户端返回0(false)。
在这里插入图片描述

  1. 多个客户端同时获取锁(setnx)
  2. 获取成功,执行业务逻辑,执行完成释放锁(del)
  3. 其他客户端等待重试

改造StockService方法:

 /*** redis setnx实现分布式锁,最基本的哪一种 !!!*/public void deduct() {// 加锁setnxBoolean lock = this.redisTemplate.opsForValue().setIfAbsent("lock", "111");if (!lock) {// 没有获取到锁,进行重试!!try {Thread.sleep(50);this.deduct();} catch (InterruptedException e) {e.printStackTrace();}} else {try {// 1. 查询库存信息String stockStr = redisTemplate.opsForValue().get("stock:" + "1001");// 2. 判断库存是否充足if (stockStr != null && stockStr.length() != 0) {Long stock = Long.parseLong(stockStr);if (stock > 0) {redisTemplate.opsForValue().set("stock:" + "1001", String.valueOf(stock - 1));}}} finally {// 解锁this.redisTemplate.delete("lock");}}}

使用 jmeter 进行压测
在这里插入图片描述
查看库存数量
在这里插入图片描述

上述代码优化,不断重试的过程中一直进行递归,最终导致栈的溢出。

解决

/***  while循环代替递归,解决不断重试可能导致的栈溢出的问题*/public void deduct() {// 加锁setnxwhile (this.redisTemplate.opsForValue().setIfAbsent("lock1", "1")) {try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}try {// 1. 查询库存信息String stockStr = redisTemplate.opsForValue().get("stock:" + "1001");// 2. 判断库存是否充足if (stockStr != null && stockStr.length() != 0) {Long stock = Long.parseLong(stockStr);if (stock > 0) {redisTemplate.opsForValue().set("stock:" + "1001", String.valueOf(stock - 1));}}} finally {// 解锁this.redisTemplate.delete("lock1");}}}

2.2. 防死锁

问题:setnx刚刚获取到锁,当前服务器宕机,导致del释放锁无法执行,进而导致锁无法锁无法释放(死锁)
解决:给锁设置过期时间,自动释放锁。

设置过期时间两种方式:

  • 通过expire设置过期时间(缺乏原子性:如果在setnx和expire之间出现异常,锁也无法释放)
  • 使用set指令设置过期时间:set key value ex 3 nx(既达到setnx的效果,又设置了过期时间)

在这里插入图片描述

2.3. 防误删

持有锁的线程在锁的内部出现了阻塞,导致他的锁自动释放,这时其他线程,线程2来尝试获得锁,就拿到了这把锁,然后线程2在持有锁执行过程中,线程1反应过来,继续执行,而线程1执行过程中,走到了删除锁逻辑,此时就会把本应该属于线程2的锁进行删除,这就是误删别人锁的情况说明

解决: setnx获取锁时,设置一个指定的唯一值(例如:uuid);释放前获取这个值,判断是否自己的锁
在这里插入图片描述

问题:删除操作缺乏原子性。
场景:

  1. index1执行删除时,查询到的lock值确实和uuid相等
  2. index1执行删除前,lock刚好过期时间已到,被redis自动释放
  3. index2获取了lock
  4. index1执行删除,此时会把index2的lock删除

解决方案:没有一个命令可以同时做到判断 + 删除,所有只能通过其他方式实现(LUA脚本

2.4. redis中的lua脚本

2.4.1 redis 并不能保证

redis采用单线程架构,可以保证单个命令的原子性,但是无法保证一组命令在高并发场景下的原子性

如果redis客户端通过lua脚本把3个命令一次性发送给redis服务器,那么这三个指令就不会被其他客户端指令打断。Redis 也保证脚本会以原子性的方式执行: 当某个脚本正在运行的时候,不会有其他脚本或 Redis 命令被执行。 这和使用 MULTI/ EXEC 包围的事务很类似。

2.4.2 lua介绍

2.5. 使用lua保证删除原子性

http://www.wooajung.com/news/23375.html

相关文章:

  • 做互助盘网站免费获客平台
  • 电商网站建设代理商长沙好的seo外包公司
  • 新疆生产建设兵团14师网站手机建站系统
  • 日本韩国设计网站怎么做网页
  • 下载应用市场西安seo优化公司
  • 网站广告图怎么做seo推广软件下载
  • 北京市公安局海淀分局网站备案以下哪个单词表示搜索引擎优化
  • 网站排名搜索seo课程培训入门
  • 井祥交通建设工程有限公司 网站常用的网络推广方式有哪些
  • 网站建设制作设计营销 广州关键词优化师
  • 南宁网站建设lilkj站长友情链接
  • 神魔网站建设排行榜软件
  • 代做网站关键词排名seo策划
  • 宁波做网站seo千牛怎么做免费推广引流
  • 用户体验做的好的网站百度sem优化师
  • 网站建设好找工作做高端网站公司
  • 网络营销平台都有哪些全网营销与seo
  • 科技服务公司网站模版网站建设推广多少钱
  • 视频网站怎么做的反爬虫百度关键词排名查询
  • 标志空间 网站360推广开户
  • 信阳市人民政府网站网站seo搜索引擎优化怎么做
  • 网站开发属于固定资产吗推动高质量发展
  • 医疗器械外贸网站建设百度搜索结果
  • 北京建站模板公司网站收录免费咨询
  • 自己的网站怎么做搜索引擎百度入口网页版
  • 不属于网络虚拟财产seo快速排名首页
  • 昆明有网站的公司如何在百度发布信息推广
  • 旅游营销的网站建设百度认证中心
  • 自助网站建设公司网络营销常用工具
  • 中国农村建设投资有限公司网站在线培训网站