分布式事务
为什么要有分布式事务? 跨服务协同时候,例如订单从提交到检测到调用财务系统到更新用户系统,这些操作需要保证原子性,没有事务串起来的话中间崩了会导致操作丢失 数据库过大,做了分库分表,要统一对多个数据库进行操作 分布式事务解决方案 2PCprepare() commit() 准备和提交阶段,操作时候,服务端向本次事务的参与端发送一个prepare()命令,参与者准备完毕返回ack,所有参与者准备完毕了才可以进行下一阶段操作第二阶段是commit / abort操作,分为回滚和提交,协调者检查第一阶段参与者提交的prepare消息,如果第一阶段有任何一个参与者ack返回的是失败状态,返回参与者abort状态,否则执行commit返回结果 2PC作为强一致性协议,存在单点阻塞问题,因为协调者是单点的,如果协调者出现故障,也有几个情况 如果所有参与者事物都提交了prepare,且此时事务没有提交,那么可以选举新的协调者提交 如果由于网络原因部分参与者提交,部分没有成功提交,此时换上新的协调者并不能得到所有参与者的prepare消息,但是网络原因参与者的prepare...
HTTP缓存
缓存前端要控制请求接口的次数时候使用,当某个接口短时间内不断读取,但是数据却不需要一直变化,频繁请求接口会使性能下降,应该采取一些缓存策略 强制缓存http1.0 强制缓存通过请求头的expires实现,看一个例子![[{0178FA88-3861-452D-B53D-C26F03351AB6}.png]]访问/img/01.jpg 时候,在请求后返回了头expires的时间,expires是一个时间戳,当当前时间戳大于expires,就重新请求接口并写expires,否则直接使用缓存的数据返回,这样有一个问题,这个时间是根据客户端的手机时间进行判断,但是客户端和服务端的时间可能出现不一致,例如手机设定或者客户端自己修改时间等,这样太过依赖时间戳,于是映入了cache-control http1.1...
操作系统 --进程补充
...
操作系统 --进程补充
线程是一个基本的CPU执行单元,也是程序执行流的最小单位。引入线程之后,不仅是进程之间可以并发,进程内的各线程之间也可以并发,从而进一步提升了系统的并发度,使得一个进程内也可以并发处理各种任务(如QQ视频、文字聊天、传文件) 1. 用户级线程用户级线程是由用户态线程库创建、调度和管理的线程,内核对其不可见,内核只知道进程的存在。 常见线程库: 早期 POSIX 线程实现 协程(coroutine) Go 的 goroutine(本质是用户级调度) 从内核视角看,只能看到进程A, 而从用户视角看可以看到进程A,以及下面的线程1, 2, 3… 2. 内核级线程内核级线程是由操作系统内核直接创建、调度和管理的线程,每个线程都是内核调度的基本单位。 操作系统是可以明确感知内核级线程的存在的,实际上再linux系统里面,内核级线程是轻量的进程,都是用clone出来的,只是分配的资源少? 3. 二者比较用户级线程:...
redis+lua
Lua 的定位 轻量级脚本语言 解释执行 极其简单 嵌入式友好(Redis / Nginx / 游戏引擎) 最常见的 3 个地方 场景 用途 Redis 原子操作、事务逻辑 Nginx (OpenResty) 鉴权、限流、灰度 游戏服务器 配置、热更新 其操作保证原子性 基础语法变量&类型1234local a = 10 --numberlocal b = "hello" --stringlocal c = true -- boollocal d = nil -- nil Lua只有4种基本类型,string -> int用tonumber Lua没有struct,map之类,全靠table实现: 当数组用 12local arr = {1, 2, 3}print(arr[1]) -- 1(下标从1开始) 当map用 12local m = {}m["xx"] =...
ElasticSearch基础
es安装使用docker安装es 拉取镜像 1docker pull elasticsearch:7.12.0 创建docker容器挂在的目录: (windows手动创建) 1234# linux的命令mkdir -p /opt/es/config & mkdir -p /opt/es/data & mkdir -p /opt/es/pluginschmod 777 /opt/es/data 配置文件 1echo "http.host: 0.0.0.0" > /opt/es/config/elasticsearch.yml 创建容器 123456# linuxdocker run --name es -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms84m -Xmx512m" -v...
sync-Pool
1. 引入实现一个简单序列化器,把map[string]int 序列化: 123456789101112func JsonMar1(m map[string]int) (string, error) { var buf bytes.Buffer buf.Write([]byte(`{"data":{`)) for k, v := range m { buf.Write([]byte(`"` + k + `":` + strconv.Itoa(v) + `,`)) } if len(m) > 0 { buf.Truncate(buf.Len() - 1) } buf.Write([]byte(`"}}`)) return buf.String(), nil ...
AES加密算法
AES概念详解什么是 AES?AES(Advanced Encryption Standard)是一种分组对称加密算法,加密单元固定为 128 bit(16 字节)。它支持三种密钥长度: AES-128 → 10 轮 AES-192 → 12 轮 AES-256 → 14 轮 AES 是现代密码学的基石,被广泛用于 HTTPS、VPN、磁盘加密、移动支付等场景。 AES 的数据结构AES 以一个 16 字节的数据块为单位工作,把这 16 个字节组织成一个 4×4 字节矩阵(state),列优先存储: 1234s0 s4 s8 s12s1 s5 s9 s13s2 s6 s10 s14s3 s7 s11 s15 每轮加密都会对这个矩阵进行一系列固定变换。 AES 的四大核心操作AES 的每一轮由四个步骤构成(最后一轮不含 MixColumns): 1. SubBytes(字节代换)使用固定的 非线性 S-box 对每个字节独立替换。S-box 的构造包含: 在 GF(2^8) 中求逆元 进行一次仿射变换 这是 AES...
