Fri Aug 02 2024 00:00:00 GMT+0000 (Coordinated Universal Time)
时间来到了早晨6点25分。
收紧了薄被,当我意识到我躺在床上的时候,我知道这意味着什么,就高兴起来。
我试着去回忆,去捕捉那些稀疏的碎片。慢慢去拼凑,逐渐有了模糊的轮廓,随后又延伸了细节。当整幅场景浮现在我脑海中的时候,我很幸现在躺在床上,身上还有层薄被。
当我写这篇文章的时候,虽然还保留着梦中的印象,却不愿再次回忆起来,每次想起都会有些后怕,又会滋生出庆幸。
时间还算比较早,这时的天还泛着一层朦胧的白,未曾被光完全刺破。
我拿起手机,想给我妈打个电话了。
响了半分钟,没有人接听,我把手机轻轻放下,眯起了眼睛。虽然醒来了,困意还没有完全退去,想多休息一会再起床。
另一方面,天虽算早,但我想我妈应该起床了,一般起床很早的。一会看到了手机,会给我回电话,所以眯起眼,也在等待手机的再次响起。
不一会,电话响了
“咋啦,怎么这么早打电话了“
”没事,就是想给你打个电话“
”院子里,树根长起来了,把地板都翘起来了,都不好走路了,我掀起来,把树根去掉重铺一下,刚刚在院子里忙着“
我想起了院子里的那棵树,这棵树跟我没有太多交集,我工作后,我们搬来了这个院子,这棵树才出现在我的世界中,没有我小时候攀爬 ...
看一遍就理解:动态规划详解
作者:捡田螺的小男孩链接:https://juejin.cn/post/6951922898638471181来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
前言我们刷leetcode的时候,经常会遇到动态规划类型题目。动态规划问题非常非常经典,也很有技巧性,一般大厂都非常喜欢问。今天跟大家一起来学习动态规划的套路,文章如果有不正确的地方,欢迎大家指出哈,感谢感谢~
什么是动态规划?
动态规划的核心思想
一个例子走进动态规划
动态规划的解题套路
leetcode案例分析
什么是动态规划?动态规划(英语:Dynamic programming,简称 DP),是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题。
dynamic programming is a method for solving a complex problem by breaking it down into a collection of si ...
面试八股文
锁悲观锁 VS 乐观锁悲观锁
在并发操作时,多个线程争抢同一把锁,会进行线程的切换,将等待线程暂时挂起,等待被唤醒,线程间的切换耗费时间。
乐观锁
不会进行线程切换的操作,常见的是通过CAS自旋来实现锁机制,并发时,通过对原值和修改值的比对进行数据验证,验证不通过,会自旋重试,直到成功为止。这种操作不耗费线程切换的资源,性能高,但也存在一些缺点。
ABA问题,CAS需要在操作值的时候检查内存值是否发生变化,没有发生变化才会更新内存值。但是如果内存值原来是A,后来变成了B,然后又变成了A,那么CAS进行检查时会发现值没有发生变化,但是实际上是有变化的。ABA问题的解决思路就是在变量前面添加版本号,每次变量更新的时候都把版本号加一,这样变化过程就从“A-B-A”变成了“1A-2B-3A”。
循环时间长开销大。CAS操作如果长时间不成功,会导致其一直自旋,给CPU带来非常大的开销。
只能保证一个共享变量的原子操作 对一个共享变量执行操作时,CAS能够保证原子操作,但是对多个共享变量操作时,CAS是无法保证操作的原子性的。Java从1.5开始JDK提供了AtomicReference类来 ...
使用Keepalived搭建Nginx高可用集群
是什么keepalived是检测服务器状态的软件,如果有一台web服务器宕机,Keepalived将检测到,并将有故障的服务器从系统中删除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器集群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
为什么下面图片是我们日常比较常见的一种服务架构
我们通常将Nginx作为我们的Web服务,当客户端向服务器发送请求时, 由Nginx负责接收,然后转发到我们具体的微服务进行处理
这种结构有一个问题,Nginx是单点的,如果Nginx发生了故障或者机器故障导致无法响应服务,即使后端的各个微服务是正常启动的也无法处理请求
针对这种情况,我们需要对Nginx进行高可用的集群搭建,或者给Nginx配置一个备份机器,当主机器发生故障时,自动将请求转换到备用机器,此时我们的Keepalived就登场了
下图是我们使用keepalived高可用的服务示意图
利用keepalived生成一个虚拟IP,客户端发送请求到虚拟IP,然后keepalived会将虚拟IP映射到主机器,如果主 ...
使用Docker部署Spring Boot
随着云原生的普及以及成熟,越来越多的项目开始用容器装载。
Docker已经是容器的准则了,我们学习如何将Spring Boot项目装载在Docker容器内,然后启动部署。
创建Spring Boot项目
导航到https://start.spring.io。该网站可以选择依赖关系,并自动为我们完成项目设置。
选择Gradle或Maven以及要使用的语言。
单击Dependencies,然后选择Spring Web依赖。
点击生成。
下载生成的ZIP文件,然后用IDEA打开项目
设置Spring Web项目现在我们简单来创建一个API接口
编辑src/main/java/hello/Application.java文件
1234567891011121314151617181920package hello;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;imp ...
kubeadm搭建Kubernetes集群
官方文档
https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/
准备条件
一台或多台运行着下列系统的机器:
Ubuntu 16.04+
Debian 9+
CentOS 7+
Red Hat Enterprise Linux (RHEL) 7+
Fedora 25+
HypriotOS v1.0.1+
Flatcar Container Linux (使用 2512.3.0 版本测试通过
2GB内存或以上
2核CPU或以上
集群中所有机器的网络能相互连接
可以访问外网,需要下载镜像
节点之中不可以有重复的hostname
开启机器上的某些端口。具体端口可看这里(用于测试可以关闭防火墙)
禁用交换分区。
准备环境准备两台虚拟机
hostname
IP
ks ...
Kubernetes安装IngressNginx
安装1kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.44.0/deploy/static/provider/baremetal/deploy.yaml
部署完,我们查看一下状态
对应的service和deployment已经创建完毕,并且service以NodePort方式对外开放了32756端口
部署tomcat进行测试我准备了yaml文件,部署一个tomcat,并指定host信息
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748---apiVersion: apps/v1kind: Deploymentmetadata: name: tomcatspec: replicas: 3 selector: matchLabels: app: tomcat template: metadata: ...
一文看懂|分布式系统之CAP理论
链接:https://cloud.tencent.com/developer/article/1860632来源:腾讯云开发者社区著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
引言CAP 理论,相信很多人都听过,它是指:
一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项。
为什么要理解 CAP 理论?我能说出很多理由来。如果是在职场上,也许最合适的理由是,当领导给出的任务不靠谱时,我们可以依据 CAP 去否决它。
比如,有这么一个任务,给你定了三大目标:
既要提升系统的可用性
又要保证数据的实时可见
还有提升系统的容错能力
看到“既要、又要、还要”,是不是想到了阿里……
OK,如果你深刻理解了 CAP,你会发现完成这个任务是不可能的。但是,如果你不理解 CAP,然后又拍了胸脯保证完成任务,不好意思,职场是不需要眼泪和后悔的。
有点跑题了,书归正传。CAP 理论是分布式设计中最基础最重要的理论,不懂它,你可能连分析一套分布式系统的核心设计理 ...
高性能队列——Disruptor
作者: 宫铭链接:https://tech.meituan.com/2016/11/18/disruptor.html来源:美团技术团队著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
背景Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级)。基于Disruptor开发的系统单线程能支撑每秒600万订单,2010年在QCon演讲后,获得了业界关注。2011年,企业应用软件专家Martin Fowler专门撰写长文介绍。同年它还获得了Oracle官方的Duke大奖。
目前,包括Apache Storm、Camel、Log4j 2在内的很多知名项目都应用了Disruptor以获取高性能。在美团技术团队它也有不少应用,有的项目架构借鉴了它的设计机制。本文从实战角度剖析了Disruptor的实现原理。
需要特别指出的是,这里所说的队列是系统内部的内存队列,而不是Kafka这样的分布式队列。另外,本文所描述的Disruptor特性限于3.3.4。
Java内置队列 ...
Sharding-JDBC 的基本用法和基本原理
作者:码海链接:https://juejin.cn/post/6894046209552416782来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
前言这是一篇将“介绍 Sharding-JDBC 基本使用方法”作为目标的文章,但笔者却把大部分文字放在对 Sharding-JDBC 的工作原理的描述上,因为笔者认为原理是每个 IT 打工人学习技术的归途。
使用框架、中间件、数据库、工具包等公共组件来组装出应用系统是我们这一代 IT 打工人工作的常态。对于这些公共组件——比如框架——的学习,有些人的方法是这样的:避开复杂晦涩的框架原理,仅仅关注它的各种配置、API、注解,在尝试了这个框架的常用配置项、API、注解的效果之后,就妄称自己学会了这个框架。这种对技术的肤浅的认知既经不起实践的考验,也经不起面试官的考验,甚至连自己使用这些配置项、API、注解在干什么都没有明确的认知。
所以,打工人们,还是多学点原理,多看点源码,让优秀的设计思想、算法和编程风格冲击一下自己的大脑吧 :-)
因为 Sharding-JDBC 的设计细节实在太多,因此本文不可能 ...