无题
2.2 更新语句以上就是一条查询 sql 的执行流程,那么接下来我们看看一条更新语句如何执行的呢?sql 语句如下:
update tb_student A set A.age='19' where A.name=' 张三 ';
我们来给张三修改下年龄,在实际数据库肯定不会设置年龄这个字段的,不然要被技术负责人打的。其实条语句也基本上会沿着上一个查询的流程走,只不过执行更新的时候肯定要记录日志啦,这就会引入日志模块了,MySQL 自带的日志模块式 binlog(归档日志) ,所有的存储引擎都可以使用,我们常用的 InnoDB 引擎还自带了一个日志模块 redo log(重做日志),我们就以 InnoDB 模式下来探讨这个语句的执行流程。流程如下:
•先查询到张三这一条数据,如果有缓存,也是会用到缓存。•然后拿到查询的语句,把 age 改为 19,然后调用引擎 API 接口,写入这一行数据,InnoDB 引擎把数据保存在内存中,同时记录 redo log,此时 redo log 进入 prepare 状态,然后告诉执行器,执行完成了,随时可 ...
无题
https://km.sankuai.com/page/155759840
ArrayList 初始容量 10 扩容 扩1.5倍
HashMap 初始容量16 扩容 2倍 负载因子 0.75
无题
https://km.sankuai.com/page/155759840
无题
https://blog.csdn.net/dyingstraw/article/details/94719864
Radix Tree、B+树、跳表之间的区别
B+树和跳跃表有什么关联?
B+树和跳跃表这两种数据结构在本身设计上是有亲缘关系的,其实如果把B+树拉直来看不难发现其结构和跳跃表很相似,甚至B+树的父亲结点其实类似跳跃表的level层级。
在当前计算机硬件存储设计上,B+树能比跳表存储更大量级的数据,因为跳表需要通过增加层高来提高索引效率,而B+树只需要增加树的深度。此外B+树同一叶子的连续性更加符合当代计算机的存储结构。然而跳表的层高具有随机性,当层高较大的时候磁盘插入会带来一定的开销,且不利于分块。
为什么Redis不使用B+树呢而选择跳表呢?
因为数据有序性的实现B+树不如跳表,跳表的时间性能是优于B+树的(B+树不是二叉树,二分的效率是比较高的)。此外跳表最低层就是一条链表,对于需要实现范围查询的功能是比较有利的,而且Redis是基于内存设计的,无需考虑海量数据的场景。
Radix Tree优势在哪?
本质上是前缀树,所以存储有「公共前缀」的数据时,比 B+ 树、跳表节省内存
没有公共前缀的数据项,压缩存储,value 用 listpack 存储,也可以节省内存
查询复杂度是 O(K),只与「目标长度」有关,与总数据量无 ...
限流算法
限流是解决高并发大流量的一种方案,至少是可以保证应用的可用性。
通常有以下两种限流方案:
漏桶算法
令牌桶算法
漏桶算法
漏桶算法非常简单,就是将流量放入桶中并按照一定的速率流出。如果流量过大时候并不会提高流出效率,而溢出的流量也只能是抛弃掉了。
这种算法很简单,但也非常粗暴,无法应对突发的大流量。 这时可以考虑令牌桶算法。
漏桶算法
令牌桶算法是按照恒定的速率向桶中放入令牌,每当请求经过时则消耗一个或多个令牌。当桶中的令牌为 0 时,请求则会被阻塞。
令牌桶算法支持先消费后付款,比如一个请求可以获取多个甚至全部的令牌,但是需要后面的请求付费。也就是说后面的请求需要等到桶中的令牌补齐之后才能继续获取。
@Override public BaseResponse<UserResVO> getUserByFeignBatch(@RequestBody UserReqVO userReqVO) { //调用远程服务 OrderNoReqVO vo = new OrderNoReqVO() ; vo.setR ...
线程池使用问题
先看个代码:
上面代码产生的问题 生产两台服务器爆内存,被搞死了
分析原因
方法内部使用了线程池, 方法被请求一次,就会创建一个线程池,每个线程池都存活着一个线程, 并且被占用的内存不会被GC回收
o = future.get(1, TimeUnit.MILLSECONDS) ; 这行代码是为了获取异步线程的返回值,但是超时时间设置的太少 1毫秒,也会造成问题
结论如果局部使用线程池,用完后不再使用它,一定记得手动关闭线程池,否则跑着跑着就内存爆炸崩溃。回收函数如下:
//执行此函数后线程池不再接收新任务,并等待所有任务执行完毕后销毁线程。此函数并不会等待线程销毁完毕,而是立即返回的executor.shutdown();//如想要同步等待线程池完成关闭,可使用下面的函数判断是否都执行完毕了,该函数等待timeout后,返回是否所有任务都执行完毕了pool.awaitTermination(timeout,TimeUnit)//尝试结束所有活动线程,并返回等待队列里的任务executor.shutdownNow();
开发军规
并发控制,一锁二判三更新,并行查询控超时,乐观悲观要合适
幂等拦截,幂等字段要对齐,上下游要约定好,异常场景防击穿
事务控制,悬挂监控要及时,必须防止空回滚,定是最终一致性
消息使用,一考虑重复投递,二考虑丢失延迟,消息始终是异步
缓存使用,数据过期要控制,缓存击穿要兜底,存储容量要考虑
数据库表,查询执行走索引,数据量大要归档,连接要看机器数
调度任务,调度重叠要避免,捞取数量可配置,熔断处理必须有
远程调用,接口规约要明确,请求返回辨超时,还要考虑掉不通
异常处理,日志打印要规范,降低限流需落实,监控核对全覆盖
开发自测,CR单侧接口测,断言回归边界值,系统质量不降分
https://github.com/seaswalker/spring-analysis
Linux 命令awk
1 简介awk是一个报告生成器,它拥有强大的文本格式化的能力,这就是专业的说法。
awk是由Alfred Aho 、Peter Weinberger 和 Brian Kernighan这三个人创造的,awk由这个三个人的姓氏的首个字母组成。
awk早期是在unix上实现的,所以,我们现在在linux的所使用的awk其实是gawk,也就是GNU awk,简称为gawk,awk还有一个版本,New awk,简称为nawk,但是linux中最常用的还是gawk。
awk其实是一门编程语言,它支持条件判断、数组、循环等功能。所以,我们也可以把awk理解成一个脚本语言解释器。
grep 、sed、awk被称为linux中的”三剑客”。
grep 更适合单纯的查找或匹配文本
sed 更适合编辑匹配到的文本
awk 更适合格式化文本,对文本进行较复杂格式处理
2 awk命令使用 awk [选项参数] 'script' var=value file(s)
或
awk [选项参数] -f scriptfile var=value file( ...
Redis集群——主从同步
写在前面
很多企业都没有使用到 Redis 的集群,但是至少都做了主从。有了主从,当 master 挂
掉的时候,运维让从库过来接管,服务就可以继续,否则 master 需要经过数据恢复和重启
的过程,这就可能会拖很长的时间,影响线上业务的持续服务。
在了解 Redis 的主从复制之前,让我们先来理解一下现代分布式系统的理论基石——
CAP 原理
1 CPA 原理 CAP 原理就好比分布式领域的牛顿定律,它是分布式存储的理论基石。自打 CAP 的论
文发表之后,分布式存储中间件犹如雨后春笋般一个一个涌现出来。理解这个原理其实很简
单,本节我们首先对这个原理进行一些简单的讲解。
C Consistent 一致性
A Availability 可用性
P Partition toleranc 分区容忍性
分布式系统的节点往往都是分布在不同的机器上进行网络隔离开的,这意味着必然会有
网络断开的风险,这个网络断开的场景的专业词汇叫着「 网络分区」。
在网络分区发生时,两个分布式节点之间无法进行通信,我们对一个节点进行的修改操
作将无法同步到另外一个 ...