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

合肥网站建站推广双鸭山网站建设企业

合肥网站建站推广,双鸭山网站建设企业,wordpress如何在首页不显示某类分类目录下的文章?,做logo图标的网站分布式锁主流有三种模式#xff1a; 实现方式 功能要求 实现难度 学习成本 运维成本 MySQL 的方案借助表锁/行锁实现 满足基本要求 不难 熟悉 小量OK、大量影响现有业务、1主多从架构#xff0c;不方便扩容 通过 ZK 创建数据节点的方式实现 满足要求 熟悉 ZK API 即可 需要学…分布式锁主流有三种模式 实现方式 功能要求 实现难度 学习成本 运维成本 MySQL 的方案借助表锁/行锁实现 满足基本要求 不难 熟悉 小量OK、大量影响现有业务、1主多从架构不方便扩容 通过 ZK 创建数据节点的方式实现 满足要求 熟悉 ZK API 即可 需要学习 重需要堆机器有跨机房请求 Redis 使用 setnxex 基本要求 不难 熟悉 扩容方便、现有服务 MySQL 单主架构写都会到 master有瓶颈。ZK 的方式需要自己搭建、运维而且需要堆机器利用率不高。最终采用了 Redis 来实现流量/存储都可以扩容运维也不需要自己。 一、基于Mysql实现分布式锁 乐观锁 Mysql实现分布式锁 主要是基于数据库的排他锁(也叫行级排他锁) 采用乐观锁的方式去做。 我们可以通过一个update语句是否成功来判断线程抢占锁是否成功比如如下sql语句 CREATE TABLE t_schedule_cluster (id bigint(20) NOT NULL AUTO_INCREMENT COMMENT cname:主键,execute int(1) NOT NULL COMMENT cname:执行状态,version int(11) NOT NULL COMMENT cname:版本号 ,task_name varchar(128) NOT NULL COMMENT cname:任务名称,execute_ip varchar(32) DEFAULT NULL COMMENT cname:执行ip ,update_time datetime DEFAULT NULL COMMENT cname:修改时间,PRIMARY KEY (id),KEY Index_series_id (execute) ) ENGINEInnoDB AUTO_INCREMENT8 DEFAULT CHARSETutf8 COMMENTcname:多机定时任务调度; 争抢锁的sql语句update t_schedule_cluster set execute 1 version ?, execute_ip ?, update_time ? where task_name ? and version ? 实现原理入下图 但是数据库的性能有限如果在高并发的情况下会频发的访问数据库对数据库会造成较大的压力。 二基于redis的分布式锁实现 基于Redis实现的分布式锁其实很简单底层就是使用redis的setnx指令来实现的加锁我们来看看官方对setnx的定义 SETNX key value 将 key 的值设为 value 当且仅当 key 不存在。 若给定的 key 已经存在则 SETNX 不做任何动作。 SETNX 是『SET if Not eXists』(如果不存在则 SET)的简写。 返回值 设置成功返回 1 。 设置失败返回 0 。 redis EXISTS job # job 不存在 (integer) 0 redis SETNX job programmer # job 设置成功 (integer) 1 redis SETNX job code-farmer # 尝试覆盖 job 失败 (integer) 0 redis GET job # 没有被覆盖 programmer 以上内容来自于http://redisdoc.com/string/setnx.html 既然setnx这么强大那么我们是不是可以高枕无忧直接使用了 当然了我们还要考虑一些极端场景。 2.1 死锁问题 既然设置了value值那么我们肯定会想到过期时间那么就需要再使用setnx指令后继续使用expire指令。但是这两部操作必定不是原子性的如果执行expire失败怎么办 其实Redis官方也考虑到了这个问题在Redis2.8 之后官方执行setnx 和 expire命令一起使用了。如下SET lock_key lock_value NX PX 30000 其中 1.lock_key即锁名称这个名称应是公开的在分布式环境中对于某一确定的公共资源所有争用方客户端都应该知道对应锁的名字。对于 Redis 而言lock_name 就是 key-value 中的 key具有唯一性。 lock_value:是由客户端生成的一个随机字符串它要保证在足够长的一段时间内在所有客户端的所有获取锁的请求中都是唯一的用于唯一标识锁的持有者。NX 表示只有当 lock_key(key) 不存在的时候才能 SET 成功从而保证只有一个客户端能获得锁而其它客户端在锁被释放之前都无法获得锁。PX 30000 表示这个锁节点有一个 30 秒的自动过期时间目的是为了防止持有锁的客户端故障后无法主动释放锁而导致死锁因此要求锁的持有者必须在过期时间之内执行完相关操作并释放锁。 具体操作如下图2.2 锁自动过期存在的隐患 例如我们有两个线程A、B此时线程A抢到了锁且设置自动过期时间为10s钟因为系统其他原因导致系统A发生阻塞。而此刻10s钟后锁自动过期线程C获取到了同一个资源的锁线程A从阻塞中恢复认为自己仍然持有锁继续操作同一资源。这样就使得加锁的互斥性失效了。 解决方案 我们在上面set lock_key lock_value 时讲过lock_value是一个随机生成的字符串在每次获取锁的时候都会重新生成。那么我们在执行真正的业务逻辑(类似于和db进行交互的操作同一时刻只能一个线程操作的情况)时判断当前生成的随机字符串和lock_value是否一致如果不一致则说明redis中的lock_value被修改过也就说明此刻锁已经被其他线程所占有。 具体操作流程如下图 主要使用的就是这两种方案在这里只是做个简单总结其实还有其他一些可以实现分布式锁根据自己项目本身情况选择最合适的。 另外 已经Redis也有开源的框架可以很好地支持基于Redis的分布式锁这里推荐一个Redission https://github.com/redisson/redisson PS2019 继续努力加油学习更多知识让自己在技术这条道路上越走越远 转载于:https://www.cnblogs.com/wang-meng/p/10226618.html
http://www.sadfv.cn/news/414275/

相关文章:

  • flask做的网站如何上传本地网站模版批量修改网站字符
  • 自己有域名和服务器如何做网站郑州网站网络营销
  • 柳州网站建设哪里有wordpress缩略图生成
  • 做租人网站犯法吗企业查官网入口
  • 临沂网站建设哪家专业动漫制作专业就业方向
  • 新网站百度有审核期建网站 端口
  • 酒泉网站建设优化南京移动网站设计
  • 网站备案撤销怎么办网页工具栏怎么显示出来
  • 宁夏自治区住房与城乡建设厅网站大型网站 空间
  • 有没有做数学题挣钱的网站网站开发适配
  • 苏州园区网站建设阿里巴巴网站规划
  • 电商网站建设需求分析书24小时更新在线观看
  • 金山网站建设费用承德网站建设制作
  • 怎样用dede搭建网站重庆景点排名
  • 阿里网站销量做不起来怎么办html网站登录界面模板
  • 网站 建设设计携程旅游电子商务网站策划书
  • 网页设计与网站建设在线作业答案网站备案域名更改
  • 最好的wordpress网站qq公众平台
  • cn 域名网站网站三元素怎么做
  • 花钱做网站需要所有权网站优化案例分析
  • 太原网站建设费用母婴门户网站模板
  • 建设网站的效益分析天猫商城商品来源
  • 2019怎么做网站赚钱明月 WordPress
  • 用python怎么做网站淄博网站优化价格
  • 可以做网站的语言wordpress 文章登陆可见
  • 长春网站制作教程西安建设商城类网站
  • 签订网站建设协议应注意事项网站建设规划方案包括
  • 菏泽网站建设优惠臻动传媒网站开发项目可行性分析
  • 腾讯云网站建设流程wordpress ping大全
  • 农产品网站建设计划书苏州北京网站建设