Typescript 类型体操
愿你的努力被世界看到! 优先使用接口(interface)定义对象结构,类型别名(type)用于联合类型或复杂类型。 元组在 py 中元组是固定类型,固定长度的,但是在 ts 中只固定了类型,仍然通过 push 等方法来改变(设计如此)。 123456let t:[number, string] = [1, 'content'];// t[0] = 'yes' // 报错// t[2] = 4 // 报错t.push(100)// t.push(false) // 报错,不兼容 boolean console.log(t) // [ 1, 'content', 100 ] ts 4.0 新增加了命名元组,可以增强代码的可读性。 123456789101112// 命名元组type UserRecord = [id: number, name: string, email: string, createdAt: Date];const users: UserRecord[] = [ [1,...
浅谈架构
架构设计需要遵循下面的原则: 平衡的艺术:时间、质量、成本等商业目标 演进原则:最小闭环、能用、适当冗余设计 如果是代码量多达几十万行的大中型项目,团队里几十个人如果不今年新年更系统拆分,开发测试效率都非常低下,非常难以维护。分布式拆分之后可以大幅度提升开发效率,各个模块可以单独部署。但是分布式系统也带来了一些复杂的技术挑战: 一个服务的代码不要太多,1 万行左右,两三万撑死了吧。 大部分的系统,是要进行多轮拆分的,第一次拆分,可能就是将以前的多个模块该拆分开来了,比如说将电商系统拆分成订单系统、商品系统、采购系统、仓储系统、用户系统,等等吧。 但是后面可能每个系统又变得越来越复杂了,比如说采购系统里面又分成了供应商管理系统、采购单管理系统,订单系统又拆分成了购物车系统、价格系统、订单管理系统。 扯深了实在很深,所以这里先给大家举个例子,你自己感受一下,核心意思就是根据情况,先拆分一轮,后面如果系统更复杂了,可以继续分拆。你根据自己负责系统的例子,来考虑一下就好了。 分布式 ID 生成器数据库自增 ID插入一条记录,生成一个 ID。优点:1. 复用了 DB...
区块链学习
BTC 对标黄金(总量限制),而 ETH 无限量,几乎所有的 DAPP 都放在 ETH 上。ETH 上的程序被称为智能合约,是代码和数据(状态)的集合。 名词解释Gas:通过以太币账户发起一个交易(普通交易或者部署、运行一个合约),矿工收取的相应的工作量费用。 GameFi:Game + Finance,是 区块链游戏 与 去中心化金融(DeFi) 的结合体,玩家可以通过玩游戏赚取加密货币或NFT等数字资产,实现“边玩边赚”(Play-to-Earn, P2E)。 BSC:是币安智能链,是币安生态的底层公链,是 BNB 的生态链,BSC 上的 DAPP 与 ETH 上的 DAPP 互通,交易费用远低于以太坊。 Layer2ETH 主网 15-30 TPS。 区块链扩展技术,通过在以太坊等主链(Layer 1)之上构建第二层网络,大幅提升交易速度并降低手续费,同时继承主链的安全性。工作原理: 交易打包:用户交易在 Layer 2 网络内快速处理(如每秒数千笔)。 数据压缩:将多笔交易压缩成一条证明(如 Rollup 技术)。 主链锚定:定期将交易数据或状态提交到 Layer...
Nginx 踩坑
NGINX 是 CPU 亲和的,把每个 worker 进程固定在一个 CPU 上执行(worker_cpu_affinity 配置),减少切换 CPU 的 cache miss,获得更好的性能。绑定 CPU 核心可以减少上下文切换,但过度绑定可能导致负载不均衡, 建议在高负载场景下使用,普通场景可以省略。 处理静态资源效率高的原因是采用了 sendFile 工作机制:文件从硬盘上读取到网络传输的过程不经过用户空间,也就是常说的零拷贝机制: 防盗链主要是区分合法请求和非法请求,常用的解决方案有以下几种: 基于http_refer防盗链配置模块 url 重写网站维护的时候将所有页面重定向到维护页面: 1rewrite ^(.*)$ /pages/maintain.html 301和302的区别:301是永久重定向,客户端会缓存重定向后的地址(即使服务器关闭也能跳转到对应的地址),302请求每次都会访问服务器。所以做重定向的时候最好选择302,301如果跳转的链接改了是无法及时更新的。 https优化: 激活keepalive长连接 设置ssl...
golang 踩坑
iota可以按照特定的规则执行逻辑: 1234567891011121314151617package mainimport "fmt"const ( b = 1 << (10 * iota) kb mb gb tb pb)func main(){ // 1 1024 1048576 1099511627776 1125899906842624 fmt.Println(b,kb,mb,tb,pb)} go中的slice本身没有数据,是对底层array的view。 闭包12345678910111213141516171819package mainimport "fmt"func adder() func (value int) int { sum:=0 return func (value int)int { sum += value return sum } }func main() { adder:=adder() for i := 0; i...
javascript 设计模式
心游于艺,道不远人 变继承关系为组合关系State模式继承描述了is-a的关系,子类可以继承父类的成员变量和函数,也可以修改父类的成员变量和函数。使用设计模式来实现代码复用,而不是使用继承实现代码复用。继承关系有局限性。 装饰器模式java中有一个Runnable接口: 123interface Runnable{ void run();} 如何实现LoggingRunnable,TransactionRunnable? 原始的CodingTask类: 12345678910111213class CodingTask implements Runnable{ @Override public void run() { System.out.println("writing code"); try { Thread.sleep(3000); } catch (InterruptedException e)...
红包业务系统的构建
概述红包系统本质上是高并发资金秒杀系统。 架构一览 系统演进之路 满足业务需求,快速迭代上线 出现超卖现象,启用事务锁 流量增加,收红包出现性能瓶颈,改为乐观锁,性能提升3倍 流量继续增加,乐观锁也扛不住了,上缓存 分布式 MQ 解决异步写 数据分片来解决 DB 横向拓展 业务场景需求分析红包发送者从红包商那里购买一定数量和一定金额的红包(每个红包的规格一样或者不一样),之后将红包商品赠送出去(对象是红包接受人群),收红包本质上是对红包商品的秒杀活动。存在 B2B 和 B2C...
前端杂谈
为什么js要放在body最下面二css要放在head中?浏览器拿到css就知道该怎么渲染HTML了,如果把css放在body下面则会先按照默认样式进行渲染,当css加载完成的时候会按照css的样式再渲染一遍,即发生了reflow。由于js会阻塞代码执行,所以js一般放在body最下面,还有一个原因:js放在最下面的时候就可以取得页面中所有的元素了。 window.onload和DomContentLoaded有什么区别前者是页面的资源加载完成(包括图片、视频),后者是DOM渲染完即可,此时图片、视频可能还没加载完。 图片懒加载的实现原理先用一张默认的图片代替(这张默认的图片因为使用太频繁,浏览器可能缓存了)然后再更改img的src属性。 跨域可以跨域的3个标签: img:可以用于打点统计,统计网站可能是其他域,使用img标签有一个好处:没有浏览器兼容性问题 link:可以使用CDN script:可以使用CDN,可以JSONP 本地3000端口开启了一个服务: 12345678const http =...
码农翻身有感
做技术切记“本末倒置”,我非常痛恨那些采用bottom-up方式来讲解技术的资料和文章,一上来就是技术细节、安装步骤、配置丰富,让初学者晕头转向,不知所云,看完以后也不知道为什么要有这个东西、解决了什么问题、它有什么来龙去脉。换句话说,这些资料和文章习惯于讲解How,而不是Why,但是在我看来,Why有时候比How更重要。 当你改变不了别人的时候,抱怨也没有用,还是要先改变一下自己。 程序的局部性原理: 时间局部性:如果程序中某条指令开始执行,则不久之后该指令可能被再次执行;如果某数据被访问,则不久之后该数据可能被再次访问。空间局部性:一旦程序访问了某个存储单元,则不久之后其附近的存储单元也将被再次访问。
计算机网络
ARP网络层和数据链路层的桥梁。 通过IP地址找到MAC地址,只适用于IPv4,不能用于IPv6(可以用ICMPv6替代ARP发送邻居探索消息,融合了IPv4中的ARP,ICMP重定向和ICMP路由选择,甚至还能自动设置IP地址:和DHCPv6结合)。ARP是通过ARP请求和ARP响应两种类型的包来确定MAC地址的。 IPv6中ICMP的作用被放大,如果没有ICMPv6,IPv6无法正常通信。 如上图所示主机A为了获得主机B的MAC地址,要通过广播发送一个ARP请求包,这个包包含了想要了解其MAC地址的主机的IP地址。如果ARP请求包中的目标IP和自己的IP地址一致,那么这个节点就将自己的MAC地址塞入到ARP响应包中返回给主机A。 ARP请求包还有一个作用:将自己的MAC地址告诉对方 TCP中间节点并不承诺提供可靠的连接通道,物资完全可能失序、重复、甚至丢失。所谓可靠完全由两个端点来实现。 TCP要求无论处在何种网络环境下都要提供高性能通信,并且无论网络拥堵情况如何变化,都必须保持这个特性。因此它每次发包都会计算往返时间及其偏差(RTT:Round Trip...