提交 346433a5 编写于 作者: 梦境迷离's avatar 梦境迷离

Merge remote-tracking branch 'origin/master'

......@@ -13,7 +13,7 @@ categories:
### 优化事项
1. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
1. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2. 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:select id from t where num=0
......@@ -78,21 +78,23 @@ select num from a where exists(select 1 from b where num=a.num)
### 1、事务四大特性(ACID)
* 原子性(Atomicity):原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
* 一致性(Consistency):如果事务执行之前数据库是一个完整性的状态,那么事务结束后,无论事务是否执行成功,数据库仍然是一个完整性状态。
(数据库的完整性状态:当一个数据库中的所有的数据都符合数据库中所定义的所有的约束,此时可以称数据库是一个完整性状态。)
* 隔离性(Isolation):事务的隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。
* 持久性(durability):持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
* 原子性(Atomicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
* 一致性(Consistency) 如果事务执行之前数据库是一个完整性的状态,那么事务结束后,无论事务是否执行成功,数据库仍然是一个完整性状态。
(数据库的完整性状态 - 当一个数据库中的所有的数据都符合数据库中所定义的所有的约束,此时可以称数据库是一个完整性状态。)
* 隔离性(Isolation) 事务的隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。
* 持久性(durability) 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
引申:NOSQL CAP BASE
1.关系型数据库和非关系型数据库区别?
下面这些优缺点并非绝对的
优点
* 成本:nosql数据库简单易部署,基本都是开源软件,不需要像使用oracle那样花费大量成本购买使用,相比关系型数据库价格便宜。当然还有免费的
* 查询速度:nosql数据库将数据存储于缓存之中,关系型数据库将数据存储在硬盘中,自然查询速度远不及nosql数据库。
* 存储数据的格式:nosql的存储格式是key,value形式、文档形式、图片形式等等,所以可以存储基础类型以及对象或者是集合等各种格式,而数据库则只支持基础类型。
* 查询速度:nosql数据库将数据存储于缓存之中,关系型数据库将数据存储在硬盘中,自然查询速度远不及nosql数据库。(速度与存储结构有很多关系)
* 存储数据的格式:nosql的存储格式是key,value形式、文档形式、图片形式等等,所以可以存储基础类型以及对象或者是集合等各种格式,而数据库则只支持基础类型(也有支持复杂类型的)
* 扩展性:关系型数据库有类似join这样的多表查询机制的限制导致扩展很艰难。
缺点
......@@ -130,32 +132,37 @@ BASE 理论是对 CAP 中一致性和可用性权衡的结果,它的理论的
SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。
* Read Uncommitted(读取未提交内容 - 浏览访问)<br>
* Read Uncommitted(读取未提交内容 - 浏览访问)
在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。
* Read Committed(读取提交内容 - 游标稳定)<br>
* Read Committed(读取提交内容 - 游标稳定)
这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。
这种隔离级别也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。
* Repeatable Read(可重读 - 2.99990度隔离)<br>
* Repeatable Read(可重读 - 2.99990度隔离)
这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。
简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。
简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。
InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。
* Serializable(可串行化 - 隔离、3度隔离)
* Serializable(可串行化 - 隔离、3度隔离)<br>
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
这四种隔离级别采取不同的锁类型来实现,若读取的是同一个数据的话,就容易发生问题。
![](../public/image/%E4%BA%8B%E5%8A%A1%E9%9A%94%E7%A6%BB.png)
* 脏读(Drity Read)某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。
* 不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务,更新了原有的数据。
* 幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几行(Row)数据,而另一个事务却在此时插入了新的几行数据,先前的事务在接下来的查询中,就会发现有几行数据是它先前所没有的。
* 脏读(Drity Read) - 某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。
* 不可重复读(Non-repeatable read) - 在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务,更新了原有的数据。
* 幻读(Phantom Read) - 在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几行(Row)数据,而另一个事务却在此时插入了新的几行数据,先前的事务在接下来的查询中,就会发现有几行数据是它先前所没有的。
* 读不影响写事务以排他锁的形式修改原始数据,读时不加锁,因为 MySQL 在事务隔离级别Read committed 、Repeatable Read下,InnoDB 存储引擎采用非锁定性一致读--即读取不占用和等待表上的锁。即采用的是MVCC中一致性非锁定读模式。
* 读不影响写 - 事务以排他锁的形式修改原始数据,读时不加锁,因为 MySQL 在事务隔离级别Read committed 、Repeatable Read下,InnoDB 存储引擎采用非锁定性一致读--即读取不占用和等待表上的锁。即采用的是MVCC中一致性非锁定读模式。
因读时不加锁,所以不会阻塞其他事物在相同记录上加 X锁来更改这行记录。
* 写不影响读事务以排他锁的形式修改原始数据,当读取的行正在执行 delete 或者 update 操作,这时读取操作不会因此去等待行上锁的释放。相反地,InnoDB 存储引擎会去读取行的一个快照数据。
* 写不影响读 - 事务以排他锁的形式修改原始数据,当读取的行正在执行 delete 或者 update 操作,这时读取操作不会因此去等待行上锁的释放。相反地,InnoDB 存储引擎会去读取行的一个快照数据。
* 间隙锁间隙锁主要用来防止幻读,用在repeatable-read隔离级别下,指的是当对数据进行条件,范围检索时,对其范围内也许并存在的值进行加锁!
* 间隙锁 - 间隙锁主要用来防止幻读,用在repeatable-read隔离级别下,指的是当对数据进行条件,范围检索时,对其范围内也许并存在的值进行加锁!
当查询的索引含有唯一属性(唯一索引,主键索引)时,InnoDB存储引擎会对next-key lock进行优化,将其降为record lock,即仅锁住索引本身,而不是范围!若是普通辅助索引,则会使用传统的next-key lock进行范围锁定!
### 3、MySQL的锁算法
......
---
title: 应届入职一年总结
categories:
- 随笔
tag: [随笔]
---
本来这篇文章已经写了很久,原意是mentor让我写的,给以后入职的新人一些经验,对以后公司培养校招生做一个参考,后来发生了一些不愉快的事,也没有人提这件事了。
现在已经过去了一年,发出来仅供参考,并修改补充了一些。
## 入职前的主要经历
1. Java开发实习两个月,主要技术栈 Java/SpringBoot/SpringCloud/Redis/RabbitMQ/DDB/Dubbo
2. 测试开发实习四个月,主要技术栈 Java、Shell、Docker/Jenkins/Adb/Seleuim/Appuim
3. 在校期间关于Scala的学习:看过《快学Scala》
前面实习期间看过《Scala编程》,《响应式架构 消息模式Actor实现与Scala、Akka应用集成》,并写过一些SpringBoot+Scala的项目。实在没有练手的项目可以重构以前自己写的Java或其他语言的项目。
## 入职前的准备
从前面公司校招离职到入职这里期间,了解了Play、SBT,根据文档写Demo。
如果没有像我一样在校期间熟悉Scala语法,学习Play前还需去熟悉一下语法。
比如学Java的先熟悉Java 8 lambda,养成函数习惯和思维。Scala快学中的名词实在是太多了并不适合没有函数式基础的人入门,
可以看看Scala编程这本书。至少看到Future这章,前面的类似XML解析和后面的组合子、GUI这些章节就不用了。
具体根据需要选择,也不是一定。除了基本语法,后续想加强函数式理解与应用则需要学习小红书 cats shapeless等,
比如小红书中的例子自己动手实现,包括高阶函数,柯里化与部分应用函数,组合子,各种常见算子,Monoid/Monad,函数式数据结构,
纯函数编程,并行计算,流处理,函数式错误处理。这些不仅是入职前,入职后也可以学习,
能加强对Scala的理解,大多数概念也是很多语言都有的,只不过实现上的区别。
## 入职后
搭好环境,拉取backend项目,了解项目源代码的布局与结构以及该服务具体主要做什么。
使用看板、单图。参加公司的新人培训,技术培训时会了解到前中后端(在这里 中端是服务端,后端是大数据)主要的技术栈。
他们的项目在codes(代码库)上会有相应的service、data这种标签,来表明项目是哪个端负责的。
这个培训有时会在入职一个月后才开始。对于中端就是平常外面说的后端或服务端,技术栈主要是Scala、Play、Slick、SBT、Akka、Undertow、Redis、RabbitMQ、kafka等,
当然也有一些基于其他语言的小型服务。后面都比较常见,前面几个是Scala的生态中的。
这些在入职前看招聘要求也能知道。对于公司大多数的中端服务,都是以Play为主,Play的文档写的非常好,将文档的demo都做一遍最好。
熟悉具体的业务,比如广告的DeepLink是干嘛的,对应在代码里面的哪个地方,对应页面上的请求URI是哪个。(这就需要前面的Play和undertow的一点相关基础,如果是graphql,
那么就只能通过request的operationName和query xxx来看)。学习undertow我都是看例子,将以前写的简单的Scala秒杀系统重构为使用函数式异步的。自己可以在熟悉代码时写文档(此时文档可能不够准确)或画流程图,
数据流图,下次需要用到此处业务时,根据最新的理解再来修改。在大致了解某块业务后,尝试接收简单的需求。比如中间页配置,能熟悉gio-ads-api服务,也能熟悉play slick使用。
完成一个与其他业务不太多关联的独立任务的CRUD,在这个时候会比较艰难,代码review时很多语法不合适的问题。做图片裁剪时需要使用Python,可以熟悉一下脚本编写,
对后面数据迁移可选择性上有帮助。因为可以使用SQL也可以使用Python。中间页上线,可以了解到从需求到设计开发测试部署上线整个流程。期间对部署流程梳理,对后续排除CI问题有帮助。
通过实时bug定位顺便了解到新的服务ws、real-time。调试过程中还会涉及到权限,需要了解权限的构成。
比如authority、accounts、opm等相关的,以及查数涉及到chart-services、query-services,广告特有权限涉及backend。
进一步熟悉项目的整体结构。学习docker+k8s与capistrano部署,对测试环境的一些问题能知道原因。
比如依赖服务挂掉,服务重启失败,服务配置是如何读取的,配置的优先级,上线如何操作,服务的日志如何到kiban。
服务依赖的其他基础组件:dryad、consul、rabbitmq、redis。对于自由的框架工具,没有很好的文档,只能通过实践去折腾,这期间也很困难。
applinks开发,熟悉DeepLink技术,与前端、SDK合作,渠道回传与后端合作、权限种子数据熟悉基本的权限、DeepLink域名切换熟悉链接创建流程、deferred权限控制熟悉deeplink跳转流程、
DeepLink配置熟悉版本如何划分,每个小的需求都是一块业务知识,都是不同团队的合作。有机会了解一小块业务,刚好与之前自己看代码相结合,而对于广告业务本身来说,数据流较长,从前端到SDK,服务端都是需要关注的,
在没有将所有业务知识连成片时,同样很困难,因为很多时候不知理由,只知道现状。主要的难点是业务上,如果刚好有小的bug和需求,刚好时间不急,可以很好的有目的的熟悉具体代码和业务。
并尽可能在需求分到身上时,找到当前最可能是问题的问题。后续遇到隐藏的问题再在站会提出来。起码在这一步,解决掉最显然的疑问和问题。
## 新的一年
1. 疫情
2. 转了岗不再做SaaS广告
3. 并没有能回杭州修福报
4. 减少了福利,没有大小周了
5. 搬砖
学习的文档书籍
Scala Future https://docs.scala-lang.org/zh-cn/overviews/core/futures.html
Play https://www.playframework.com/documentation/2.7.x/ScalaHome
SBT入门 https://www.playscala.cn/article/view?_id=10-5d7a4b3beeab565f1f3f9687
Akka https://doc.akka.io/docs/akka/current/index-actors.html
Undertow代码例子(也有其他框架的) https://www.programcreek.com/java-api-examples/?ClassName=undertow&action=search&submit=Search
Scala大佬的博客 http://hongjiang.info/scala/
《Scala编程》
《响应式架构 消息模式Actor实现与Scala、Akka应用集成》
《反应式设计模式》
《Scala函数式编程》
《快学Scala》
......@@ -39,6 +39,7 @@
25. [二叉树的直径](./solution/tree/leetcode_543_.py)
26. [二叉树中第二小的节点](./solution/tree/leetcode_671_.py)
27. [另一个树的子树](./solution/tree/leetcode_572_.py)
28. [二叉搜索树中的众数](./solution/tree/leetcode_501_.py)
......
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# coding=utf-8
"""
501. 二叉搜索树中的众数
"""
from solution import TreeNode
class Solution:
def findMode(self, root: TreeNode) -> List[int]:
list = []
res = {}
max = 0
def helper(root: TreeNode):
nonlocal res
if root:
if res.get(root.val, 0) == 0:
res[root.val] = 1
else:
res[root.val] += 1
helper(root.left)
helper(root.right)
helper(root)
for key, value in res.items():
if value > max:
list.clear()
list.append(key)
max = value
elif value < max:
continue
else:
list.append(key)
return list
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册