9.15
今天也是被自己菜哭的一天
//不对
while(j<popped.length && stack.peek() == popped[j] && !stack.isEmpty() ){
stack.pop();
j++;
}
while里的顺序,必须要先判断j
和stack
的条件,才能执行stack.peek() == poped[j]
,否则会报EmptyStackException
。
while(j<popped.length && !stack.isEmpty() && stack.peek() == popped[j] ){
stack.pop();
j++;
}
9.16
- 排序数组中的搜索问题,首先想到用二分法解决。只要符合单调,就可以二分。
9.19
-
在默认的事务隔离级别下,即REPEATABLE READ(可重复读)下,InnoDB存储引擎采用
Next-Key Locking
机制来避免幻读。InnoDB存储引擎的锁的算法有三种:
Record lock:单个行记录上的锁
Gap lock:间隙锁,锁定一个范围,不包括记录本身
Next-key lock:record+gap 锁定一个范围,包含记录本身
9.20
- 大量的
if-else
,可以用策略模式重构
9.21
- HTTP 3.0:google的QUIC协议从TCP切换到UDP。
9.22
- MVCC是通过在每行记录后面保存两个隐藏的列来实现的。这两个列,一个保存了行的创建时间,一个保存行的过期时间(或删除时间)。存储的并不是实际的时间值,而是系统版本号(system version number)。
- 每开始一个新的事务,系统版本号都会自动递增。事务开始时刻的系统版本号会作为事务的版本号,用来和查询到的每行记录的版本号进行比较。在数据更新时需要去比较持有数据的版本号,版本号不一致的操作无法成功。
9.23
- 高并发下订单号唯一:
如果有并发的话,并且订单号在同一台主机产生多个进程,只要把进程的ID添加到序列号中就可以保证订单号唯一。
如果订单在不同主机中,把IP地址 CPU序列号 能区分的号码添加到序列号中就能保证唯一。
时间戳+用户ID+随机数+乐观锁
9.24
- 幂等性:对同一个系统,使用同样的条件,一次请求和重复的多次请求对系统资源的影响是一致的。
例如:博客点赞问题,要想防止一个人重复点赞,可以设计一张表,将博客id与用户id绑定建立唯一索引,每当用户点赞时就往表中写入一条数据,这样重复点赞的数据就无法写入。