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

湖南建设监理工程网站设计类招聘网站

湖南建设监理工程网站,设计类招聘网站,网站建设方案有哪几种,网站编辑给续南明做的封面道生一#xff0c;一生二#xff0c;二生三#xff0c;三生万物 我旁边的一位老哥跟我说#xff0c;你知道分布式是是用来干什么的嘛#xff1f;一句话给我干懵了#xff0c;我能隐含知道#xff0c;大概是用来做分压处理的#xff0c;并增加系统稳定性的。但是具体如…道生一一生二二生三三生万物 我旁边的一位老哥跟我说你知道分布式是是用来干什么的嘛一句话给我干懵了我能隐含知道大概是用来做分压处理的并增加系统稳定性的。但是具体如何我却道不出个123。现在就将这些做一个详细的总结。至少以后碰到面试官可以说上个123。 那么就正式进入正题 文章目录 道生一一生二二生三三生万物分布式概念分布式锁分布式锁实现的方案数据库实现Mysql方式1乐观锁方式2读写锁的实现第一步链接数据库第二部建立数据库表第三步读方法读操作读加锁操作读解锁操作 第四步写方法写操作写加锁写解锁 redis实现 分布式概念 分布式是一种将一个大问题拆分成多个小问题并分别由多个节点协同完成的计算机解决方案。 既然是解决问题那么是解决什么呢 分布式的目的是为了解决单个机器无法满足性能要求的问题 至于为什么单个机器无法满足其实回头细想现代的计算数据都是突出一个字大这个大字就意味着处理数据的运算速度也得大但是因为现代材料局限一个主机的运算的能力有限然而数据是成指数倍的增长为了解决这个问题就是增加主机的数量但是这就出现了另一个问题-如何将这些主机有机结合起来分布式就是解决这个问题的。其实很多公司其实都不需要分布式但是时代进步的。不管现在是不是要用但是未来的事情谁又说的清 这个是网图但是我认为这个是可以将现在大部分的分布式知识做一个较为全面的总结的 分布式这种框架的诞生伴随着许多的问题包括硬件也包括软件比如 数据一致性数据乱序数据丢失分库分表的扩容… 问题可以说是非常多。 但是大部分是可以用技术手段去避免很多的问题。而分布式加锁就是一个较为有效的手段。不过就是牺牲了一部分的时效性但是对于人类来说这点时间的损耗就是一个眨眼的功夫。希望日后会出现更多手段去解决这方面的问题。 接下来就是对于分布式锁介绍 分布式锁 分布式锁的应用场景这些既是应用场景也是问题所在 处理缓存击穿处理缓存雪崩重试处理幂等性数据不一致的问题… 基本上很多分布式应用上的问题基本可以用分布式锁处理 那么什么算是一个合格的分布式锁呢众多巨人的文章中无不透露以下这几点 互斥性这个是锁的基本功能即同一时刻只允许一个客户端持有锁避免死锁获取到锁的客户端出现问题了没有办法解锁所以要避免死锁。让系统继续运行下去有些也叫安全性容错既然是服务器那么提供锁的系统也是有可能崩溃的所以要保证这一点。 这些属性将会贯穿这篇文章。 分布式锁实现的方案 这些我会举出大体的实现思路并不会全部去实现。 每种实现类型中都有不同实现方式 比如mysql有悲观锁和乐观锁,读写锁这些方式的实现方式 常见的实现方案有 数据库实现我这里用的是mysqlredis实现zookeeper实现Redlock 算法实现 这里都会说到但是对于实现来说我目前就是只说MySQL的实现redis的实现 语言对于程序员来说只是说某种工具而言真正重要的是逻辑算法和数据结构这个才是一个程序员安生立命的本钱。 所以这篇文章我会用go语言实现其他语言的版本这里就不多说了。但是我会将常见的语言包说出方便友友们能够快速查到相关的资料。 数据库实现Mysql 这里我用MySQL去实现 技术golanggorm数据结构 方式1乐观锁 实现方式通过对数据表添加一个字段 Version实现数据版本Version记录机制实现 主要逻辑为数据库表增加一个数字类型的 version 字段来实现。当读取数据时将version字段的值一同读出数据每更新一次对此version值加一 如果对于跟新操作需要先判断当前version与数据库中的version版本号是否对应对应的上就允许跟新诺是不相同就会导致冲突此时就更新失败。 是不是很简单是的确实很简单。画个图解释一下 那么悲观锁如何实现我相信大家肯定也就明白了。但是这里我就浅浅提一点 在sql语句后添加for update 逻辑实现 通过添加线程做轮询等待然后抢锁添加过期时间更新版本号 接下来重点是读写锁的实现 方式2读写锁的实现 而这两种锁的实现需要满足一下几个特点 执行操作的环境是分布式的当然单机不是不能用读操作不做限制里面资源是共享的。可以支持多个线程或者协程对资源的读取的操作。写操作是互斥的也就是说明一个时刻只允许一个协程或者进程对资源进行访问。读操作写操作两者是互斥的。不能同时存在 ps相当于对于读写这两个操作来说都有自己的申请锁和解锁的方法读模式共享写模式互斥 读写锁的有点在于 分布式读写锁是比分布式锁粒度更小的锁对于业务场景更加灵活 所以综上的出读写锁的状态有读加锁状态、写加锁状态、无锁状态 当前锁状态读锁请求写锁请求无锁状态可以可以读锁状态可以不可以写锁状态不可以不可以 第一步链接数据库 每个程序员的链接手法各不相同所以这里就不献丑了。只要连上数据库就好。然后将客户端暴露出来。 第二部建立数据库表 要包含一下这几个字段。 var (statusUnLock UnlockstatusReadLock ReadLockstatusWirteLock WirteLock )type RWLock struct { //表示某条数据加锁的状态只能是读锁、写锁、无锁状态中的一种,默认状态为无锁状态LockStatus string gorm:default:Unlock //ReadLockCount 字段则记录当前并发访问的 goroutine(可以理解成线程) 数量ReadLockCount uint32 gorm:default:0 LockReason string //记录当前加锁的原因 }// Stock 存储锁 type Stock struct {gorm.ModelRWLockCount int64 }func (Stock) TableName() string {return stock } 这三个是状态值分别代表无锁读锁写锁 statusUnLock “Unlock” statusReadLock “ReadLock” statusWirteLock “WirteLock” gorm.Model中包含了一下字段 //主键idID uint gorm:primarykey//创建时间CreatedAt time.Time//更新时间UpdatedAt time.Time//删除时间软删除DeletedAt DeletedAt gorm:index这里我们通过的方式是建立一个锁表来管理整个锁。相应的字段的功能我这里就不做赘述在代码中已经有了。 第三步读方法读操作 读加锁操作 // ReadLock 读锁 func (s Stock) ReadLock(ctx context.Context, db *gormX.DataBD, lockReason string) error {fields : map[string]interface{}{lock_status: statusReadLock,read_lock_count: gorm.Expr(read_lock_count ?, 1),lock_reason: lockReason,}//将所属的id锁的写状态改为读状态result : db.DB(ctx).Model(Stock{}).Where(id? AND lock_status?, s.ID, statusWirteLock).Updates(fields)if result.Error ! nil {return result.Error}if result.RowsAffected 0 {return errors.New(重入锁失败受影响的行数为 0)}return nil }我将对这里的代码做一个解释 context.Context上下文用来管理请求 db *gormX.DataBD: 用来处理mysql连接的 lockReason对每个锁进行备注 这里的读锁就是做一个统计统计有多少个线程是读锁状态 result : db.DB(ctx).Model(Stock{}).Where(id? AND lock_status?, s.ID, statusWirteLock).Updates(fields): 这个整个sql的翻译{参数} update stock setlock_status{statusReadLock},read_lock_count read_lock_count 1 ,//这个不是参数lock_reason{lockReason} where id{s.ID} and statusWirteLoc{statusWirteLock} 这里为什么是update呢因为在这里gorm中update没有的数据的话会变成insert插入数据。其他语言在做的时候一定要注意。 读解锁操作 // UnReadLock 读解锁 func (s Stock) UnReadLock(ctx context.Context, db *gormX.DataBD, UnLockReason string) error {fields : map[string]interface{}{read_lock_count: gorm.Expr(if(read_lock_count0),read_lock_count-1,0),lock_status: gorm.Expr(if(lock_status 1),?,?, statusUnLock, statusReadLock),lock_reason: UnLockReason,}result : db.DB(ctx).Model(Stock{}).Where(id? and lock_status?, s.ID, statusReadLock).UpdateColumns(fields)if result.Error ! nil {return result.Error}if result.RowsAffected 0 {return errors.New(解读锁失败受影响的行数为 0)}return nil }这里将读操作做完的业务进行释放后在表中做统计减少的操作。 我将对这里的代码做一个解释 result : db.DB(ctx).Model(Stock{}).Where(id? and lock_status?, s.ID, statusReadLock).UpdateColumns(fields) update stock setlock_status(if(read_lock_count0),read_lock_count-1,0),read_lock_count (if(lock_status 1),{statusUnLock},{statusReadLock}),lock_reason{lockReason} where id{s.ID} and statusWirteLoc{statusReadLock}第四步写方法写操作 写加锁 // WriteLock 写锁 func (s Stock) WriteLock(ctx context.Context, db *gormX.DataBD, lockReason string) error {fields : map[string]interface{}{read_lock_count: 0,lock_status: statusWirteLock,lock_reason: lockReason,}result : db.DB(ctx).Model(Stock{}).Where(id? and lock_status?, s.ID, statusUnLock).Updates(fields)if result.Error ! nil {return result.Error}if result.RowsAffected 0 {return errors.New(写入锁失败受影响的行数为 0)}return nil }这里不对线程进行统计因为这是互斥的。并将锁写入状态 我将对这里的代码做一个解释 result : db.DB(ctx).Model(Stock{}).Where(id? and lock_status?, s.ID, statusUnLock).Updates(fields) update stock setlock_status{statusWirteLock},read_lock_count 0 ,//这个不是参数lock_reason{lockReason} where id{s.ID} and statusWirteLoc{statusWirteLock}这里为什么是update呢因为在这里gorm中update没有的数据的话会变成insert插入数据。其他语言在做的时候一定要注意。 写解锁 // UnWriteLock 写解锁 func (s Stock) UnWriteLock(ctx context.Context, db gormX.DataBD, UnLockReason string) error {fields : map[string]interface{}{read_lock_count: 0,lock_status: statusUnLock,lock_reason: UnLockReason,}result : db.DB(ctx).Model(Stock{}).Where(id? and lock_status?, s.ID, statusWirteLock).Updates(fields)if result.Error ! nil {return result.Error}if result.RowsAffected 0 {return errors.New(解写锁失败受影响的行数为 0)}return nil } 这里不对线程进行统计因为这是互斥的。并修改其状态 我将对这里的代码做一个解释 result : db.DB(ctx).Model(Stock{}).Where(id? and lock_status?, s.ID, statusWirteLock).Updates(fields) update stock setlock_status{statusUnLock},read_lock_count 0 ,//这个不是参数lock_reason{lockReason} where id{s.ID} and statusWirteLoc{statusWirteLock}redis实现 今天太晚了先不写明天补上连接 续今天补上了请看这篇文章
http://www.zqtcl.cn/news/602357/

相关文章:

  • 门户网站建设的平台搭建长春专业网站建设推广
  • 网站建设宗旨怎么写网站建设公司外链怎么做
  • 绍兴市交通建设检测中心网站seo专业培训网络班
  • 设计国外网站有哪些玉环在哪里做网站
  • 设计网站思路如何写wordpress 修改登录
  • 网站开发php国外设计网站app吗
  • 智能响应式网站淳安县住房和城乡建设局网站
  • 招投标网站开发企业网站建设之后
  • 如何做好集团网站建设怎么做门淘宝网站
  • 医疗协助平台网站建设方案学生个人网页制作html报告
  • 专注于网站营销服务新浪云搭建wordpress
  • 免费自助建站代理鞍山招聘网最新招聘
  • 营销型类型网站有哪些类型php网站后台制作
  • 安全的网站制作公司百度app最新版本
  • 中小企业建站平台耐克网站建设策划方案
  • wordpress 后台加入链接后_网站显示是标签_不是链接wms智能仓储管理系统
  • 网站建设需要什么硬件和软件有哪些中考网络应用服务平台
  • 为什么网站权重会掉房地产开发网站建设
  • 大连seo整站优化酷播wordpress视频插件
  • 好的网页设计网站学编程要什么学历
  • 做网站公司电话福建城乡建设网站查询
  • 郑州做网站哪个公司好做二手市场类型的网站名字
  • 网站建设与维护里面的个人简历选择网站建设公司好
  • 济南浩辰网站建设公司怎么样wordpress 3.8 问题
  • 柳州正规网站制作公司网站ww正能量
  • 网站seo优化工具网站推广策略方法
  • 企业网站建设知名wordpress 自定义php
  • 用php做的网站有哪些全能网站建设
  • 网站显示正在建设中wordpress 排行榜 页面
  • 手机管理网站网站打开速度优化