网站集群怎么做百度关键词怎么优化

news/2025/9/23 8:23:47/文章来源:
网站集群怎么做,百度关键词怎么优化,网站建设包括的内容有什么,中山精品网站建设渠道前言 分布式锁相信大家都有用过#xff0c;常见的分布式锁实现方式例如redis、zookeeper、数据库都可以实现#xff0c;而我们代码中强引用这些分布式锁的代码#xff0c;那么当我们以后想替换分布式锁的实现方式时#xff0c;需要修改代码的成本会很高#xff0c;于是我…前言 分布式锁相信大家都有用过常见的分布式锁实现方式例如redis、zookeeper、数据库都可以实现而我们代码中强引用这些分布式锁的代码那么当我们以后想替换分布式锁的实现方式时需要修改代码的成本会很高于是我们需要借鉴一些设计模式思想来设计下面我介绍下这三个分布式锁的实现逻辑以及我们项目中是怎么实现 实现方式 数据库实现 首先我们设计一张这样的表 CREATE TABLE lock (key varchar(128) C NOT NULL,created timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,version int(8) DEFAULT 1,PRIMARY KEY (key) ) ENGINEInnoDB DEFAULT CHARSETutf8 COMMENT 分布式锁表;首先方法开启事务当我们需要对某块业务上锁时确定加锁的颗粒度设置key的值执行插入语句这里我们可以设计的全面一点对比其他的分布式锁实现方式貌似还缺了点什么比如这个锁不可重入无法设置超时时间 其实这些我们也可以解决 首先可重入方面version字段记录重入的次数 insert into table (key) values (#key#) on duplicate key version total version 1key是唯一索引执行完这个语句后会在这一行添加行锁。这时候后续有两种可能性如果是当前线程A重复插入锁那么会更新version字段如果是其他线程B想要插入这个锁那么由于A持有的行锁还未释放所以B会阻塞 超时方面我们可以设置数据库的innodb_lock_wait_timeout参数来设置超时时间默认50s等待时间超时这个时间则会报错 由于insert语句在RR隔离级别会生成间隙锁在并发较高的情况下会产生死锁的情况所以建议在RC情况下使用 Redis实现 如果我们自己设计redis实现加锁的话我们第一个想到的就是setNx语法它的作用就是当key不存在的情况下将key 的值设置为 value同时返回1如果key已存在则不设置value并且返回0 如果还要加上超时时间那么还需要执行expire语法 setnx lock true expire lock 10使用这两个语法会产生一个问题就是这两个语法不是原子性的当执行一个语法后系统报错了那么超时时间就无法设置这样子这个key就无法过期 基于这个问题Redis官方将这两个指令组合在了一起解决Redis分布式锁原子性操作的问题 SET key value [EX 过期时间] NX 将key 的值设置为 value同时返回1如果key已存在则不设置value并且返回0同时加上超时时间这是一个原子性操作 由此可见我们自己实现需要踩很多坑市面上有成熟的redis实现的分布式锁框架redission我们直接用就可以了它帮我们把坑都踩了一遍不用重复造轮子了简单讲解下它的原理 首先讲一下它的键值kv结构 key为锁的keyvalue为一个hash对象 {key:线程idvalue:重入次数} value为什么这么设计我们要解决两个问题 1、删除锁时A线程把B线程持有的锁给删除了为了解决这个问题我们需要在锁中记录线程id删除时就可以判断锁是否是当前线程持有的一致才可以删除 2、实现可重入的逻辑所以需要在锁中记录重入次数每次重入次数1 不同于上面SET key value [EX 过期时间] NX方式redission的加锁逻辑是通过一段lua脚本来实现的redis的lua脚本可以实现原子性的操作下图是lua脚本 解锁逻辑也是一样的由于需要判断当前线程才能执行删除所以也需要通过lua脚本来实现删除的逻辑 当我们设置了过期时间后如果我们的业务执行时间超过了设定的过期时间那么锁会提前删除就会出现各种各样的问题。所以redission实现了一个watch dog逻辑。它是一个后台线程每10s检查一次将锁的过期时间延长 redis我们通过都会设置高可用最常见的方案就是主从或者哨兵但是它保证了高可用的同时无法保证高一致性。这样子当redis的主节点挂了从节点还没有同步到主节点的数据就变成了主节点那么锁就会发生丢失 redission提供了RedLock算法通过使用多个Redis实例各个实例之间没有主从关系相互独立超过一半节点加锁成功才算获取到锁。不过这种算法也不是一个完美的算法多个实例加锁效率低同时也会衍生出一些其他问题 Zookeeper实现 Zookeeper有很多种节点种类其中有一种节点种类叫做临时顺序节点这个节点有两个特性首先是当客户端向Zookeeper添加了这个节点后如果之后客户端挂了那么这个临时节点会被删除不会一直存在其次是这个节点是有序递增的。这些特性很适合用来做分布式锁 加锁就是在Zookeeper上添加临时顺序节点判断是否是最小节点如果是最小节点则无需排队直接执行。如果不是最小的则往后加一个顺序节点并且向前一个节点添加一个watch监听线程阻塞等待排队 当前一个节点删除时当前节点监听到删除事件并唤醒线程。这样子第一个通知第二个第二个通知第三个这种击鼓传花的方式可以避免羊群效应 羊群效应就是前一个节点释放锁后所有节点被唤醒这样会给服务器带来巨大压力 哪种更好 这个问题我觉得得根据我们的现实情况做判定当我们的系统只有数据库又不想依赖其他的中间件那我们使用数据库实现的方方式就可以了但是性能会很差容易出现瓶颈 Redis和Zookeeper性能都比数据库好这两者相比较而言Redis作为分布式锁大家使用的会多一些主要原因我想应该是Zookeeper的cp特性导致单leader节点易出现瓶颈而redis如果出现瓶颈后弹性伸缩增加节点会很方便所以性能更高 踩坑点 之前我们在代码中加入分布式锁时碰到过一个坑就是明明加入了分布式锁但是没有锁住代码。这里有几种原因我就不一一展开了我们之前踩过的一个坑就是我们的方法加了事务Transactional注解同时方法里面的逻辑加了redis分布式锁类似下面的代码。 Transactional private void test() {// 加锁// 查询 id 1的记录// 更新 id1的记录// 释放锁 }这时候当线程A进入了方法首先进入事务加锁然后执行方法里面的逻辑释放锁但是事务还未释放。这时候线程B也进入了这个方法锁因为已经释放了就直接进入方法逻辑了但是线程A的事务此时还没有提交所以线程B查询的id1的记录是不对的。 这个是踩坑了解决方法有两种一种是把事务的方法放在加锁的逻辑里面另外一种就是释放锁的逻辑改成监听spring 事务提交的事件实现事务完成后再释放锁我们最后也是这么改的 Transactional private void test() {// 加锁// 查询 id 1的记录// 更新 id1的记录// unlockAfterTransaction方法 }private void unlockAfterTransaction(LockResult lockResult) {//事物完成后释放锁TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {Overridepublic void afterCompletion(int status) {super.afterCompletion(status);distLockSservice.unlock(lockResult);}}); } 实战 这里再重审下为什么使用模板模式因为我们使用分布式锁的实现有多种如果我们在业务代码中直接依赖某一种分布式锁的话那么后续我们想替换分布式锁的实现会很麻烦所有有依赖的类都得替换所以我们使用模版模式把分布式锁的实现以及加锁、释放锁的逻辑放到公共代码中我们业务类只需要实现自己的业务逻辑即可无需关心分布式锁的相关逻辑调用方法即可 我们在1.8之前使用模版模式会比较繁琐我们需要准备一个抽象类定义一些公共的逻辑然后子类继承这个抽象类来自定义不同的逻辑。下面我以redission分布式锁的实战为例 public abstract class AbstractLockService {RedissonClient redissonClient;public void lock(ListString keyNames, Long timeout,Object... o) throws InterruptedException {// 加锁RLock[] locks new RLock[keyNames.size()];for(int i 0; i keyNames.size(); i) {locks[i] this.redissonClient.getLock(keyNames.get(i));}RLock lock this.redissonClient.getMultiLock(locks);boolean success lock.tryLock(timeout, TimeUnit.MILLISECONDS);// 加锁成功走业务逻辑if (success) {this.doBusiness(o);}// 释放锁unlockAfterTransaction(lock);}// 业务逻辑abstract Object doBusiness(Object... o);private void unlockAfterTransaction(RLock lock) {//事物完成后释放锁TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {Overridepublic void afterCompletion(int status) {super.afterCompletion(status);lock.unlock();}});} }当我们使用1.8以上的JDK时针对模板模式做了很多优化。我们可以将实现方法作为函数式方法传入模版中 public class LockFunctionService {RedissonClient redissonClient;public void lock(ListString keyNames, Long timeout, ILockCallback lockCallback) throws InterruptedException {// 加锁RLock[] locks new RLock[keyNames.size()];for(int i 0; i keyNames.size(); i) {locks[i] this.redissonClient.getLock(keyNames.get(i));}RLock lock this.redissonClient.getMultiLock(locks);boolean success lock.tryLock(timeout, TimeUnit.MILLISECONDS);// 加锁成功走业务逻辑if (success) {lockCallback.callback();}// 释放锁unlockAfterTransaction(lock);}private void unlockAfterTransaction(RLock lock) {//事物完成后释放锁TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {Overridepublic void afterCompletion(int status) {super.afterCompletion(status);lock.unlock();}});}}interface ILockCallbackT {T callback(); }当我们调用时比之前方便多了 public static void main(String[] args) throws InterruptedException {LockFunctionService lockFunctionService new LockFunctionService();ListString keys Lists.newArrayList(lock_1);// 需要加锁执行释放lockFunctionService.lock(keys, 5L, () - {System.out.println(执行业务逻辑);return null;}); }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/911895.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么样做问卷网站win7怎么做网站域名绑定

触发器是一种特殊类型的存储过程,它不同于前面介绍过的一般的存储过程。一般的存储过程通过存储过程名称被直接调用,而触发器主要是通过事件进行触发而被执行。触发器是一个功能强大的工具,在表中数据发生变化时自动强制执行。触发器可以用于…

北京市网站制作公司免费微网站

戳蓝字“CSDN云计算”关注我们哦!嗨,大家好,重磅君带来的【云重磅】特别栏目,如期而至,每周五第一时间为大家带来重磅新闻。把握技术风向标,了解行业应用与实践,就交给我重磅君吧!重…

扬中会建网站少儿编程加盟有哪些

1:CAN收发器(原理讲解) 从原理上来讲CAN_H拉升电压,或CAN_L拉低电压的原理。 以上是TJA1145AT的俯瞰图,此芯片是NXP比较先进的CAN收发器,带SPI总线系统。 回到正题,CAN_H和CAN_L收发器是通过内…

北京展示型网站建设价格xmlrpc wordpress开启

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅,从传统的模块之间调用,一步步的升级为 SpringCloud 模块之间的调用,此篇文章为第九篇,即介绍 Stream 消息驱动。 二、消息驱动概念 2.1 消息驱动是什么 官方定义 Spring …

怎么自己开个免费网站苏州建站模板搭建

一.MTV模型 Django的MTV模式: Model(模型):和数据库相关的.负责业务对象与数据库的对象(ORM) Template(,模板):放所有的HTML文件 模板语法:目的是将变量(数据库内容)如何巧妙的镶嵌到HTML页面中 View(视图):负责业务逻辑,并在适当的时候调用Model和Template 此外Django还有一个…

C# 中的 ReferenceEquals 方法 - 教程

C# 中的 ReferenceEquals 方法 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mona…

phpcms模板行业网站做驾考学时在哪个网站

2023年12月29日,星期五,2023年最后一个工作日了,明天就开始放假元旦了,去年水了31篇,今年到目前为止才水了30篇,所以这篇也水一下来充个数。祝大家元旦快乐,新的一年里越来越好。 被监控主机指…

怎样在网站图片上做店铺广告少儿编程网课平台哪个好

如果是web端的埋点数据,我们可以对这些数据进行分流。 我们可以采用事件分流,步骤如下 定义事件类型: 根据埋点数据的内容,定义不同的事件类型。例如,可以有页面访问事件、按钮点击事件、表单提交事件等。 提取关键信…

合肥网站搜索引擎优化西安市建设局官方网站

文章目录 解决方案1. 表空间管理2. 分区表3. 自动扩展配置4. 监控和告警5. 使用外部工具和服务 示例代码示例1:创建表空间示例2:创建分区表示例3:调整配置参数示例4:使用监控和告警工具 总结 在PostgreSQL中,随着数据的…

医院网站制作设计深圳报业集团官网

接上一篇:实战04_redis-cluster集群搭建https://blog.csdn.net/weixin_40816738/article/details/100635263 下一篇:实战_06_SpringBoot整合edis-cluster集群版本https://blog.csdn.net/weixin_40816738/article/details/100658669

网站建设技术网站建设wordpress可以移动端

1.模板数据的调用 一张图了解一下在wxml页调用预先定义好的模板: 可以看到上面调用了两个模板,数据调用却是不同的,obj是一个对象,对象内包含多个键值对形式的数据; tabbar是一个一维数组,每个数组项又都是…

【一周AI资讯】Claude自动抓取网页;美团发布生活Agent;阿里通义发布双模型 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

安庆市住房和城乡建设局网站首页全包圆装修400电话怎么打

文章目录 ControlNet的介绍及安装ControlNet的介绍ControlNet的安装 ControlNet的功能介绍ControlNet的应用与演示 ControlNet的介绍及安装 ControlNet的介绍 ControlNet 的中文就是控制网,本质上是Stable Diffusion的一个扩展插件,在2023年2月份由斯坦…

Vue2 父子组件传值(简化版示例) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

怎样在网站上做推广已备案网站注册

零基础微服务架构理论入门介绍 一个基于分布式的服务架构应该含有的架构内容如下: 1.1SpringCloud是什么 1.2基于微服务的系统 1.3服务与之对用的技术 1.4课程目录 第一章_SpringBoot和SpringCloud版本选择 详细可见SpringCloud2020.mmap文件 1.概述 2.SpringBoo…

网站建设月总结建设网站基本步骤

Redis 【1】—— 安装 与 配置 一、安装 与 配置(一)使用 yum 安装(二)创建符号链接1. 软链接2. 相关指令 (三)修改配置文件(四)Redis 的启停 一、安装 与 配置 (一&…

用记事本做电影介绍的网站佛山建筑设计院有限公司官网

超微服务器启动项设置 内容精选换一换微服务部署完后,您可以根据微服务的运行情况进行微服务的治理。您可以先在“服务目录 > 微服务列表”中创建微服务,启动微服务后,根据yaml文件的配置,会在对应的服务下注册服务实例。如果没…

ajax网站开发典型实例网站中flash怎么做

Union与Union All的区别如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字。union(或称为联合)的作用是将多个结果合并在一起显示出来。union和union all的区别是,union会自动压缩多个结果集合中的重复结果&#xff…

广州宝安建网站在建设部网站如何查询注册信息

经过六年的迭代与沉淀,腾讯Tencent Server Web (以下简称TSW)这一公司级运维组件于今日正式开源。TSW是面向WEB前端开发者,以提升问题定位效率为初衷,提供云抓包、全息日志和异常发现的Node.js基础设施。TSW每天为百亿次请求提供稳定服务&…

七冶建设集团网站苏醒8 WordPress

a ⃗ \vec{a} a 向量 a ‾ \overline{a} a 平均值 a ‾ \underline{a} a​下横线 a ^ \widehat{a} a (线性回归,直线方程) y尖 a ~ \widetilde{a} a 颚化符号 等价无穷小 a ˙ \dot{a} a˙ 一阶导数 a \ddot{a} a 二阶导数 $\vec{a}$ 向量 $\overline{a}$ …