大数据开发知识点1
https://www.nowcoder.com/discuss/94574
Hbase表的并发读写问题
https://www.jianshu.com/p/1e1646e1b38d
B+ 树的原理
https://blog.csdn.net/qq_26222859/article/details/80631121
数据库如何建索引?
https://blog.csdn.net/tomorrow_fine/article/details/78337735(mysql)
在MySQL中创建表的时候,可以直接创建索引。基本的语法格式如下:
CREATE TABLE 表名(字段名 数据类型 [完整性约束条件],
[UNIQUE | FULLTEXT | SPATIAL] INDEX | KEY
[索引名](字段名1 [(长度)] [ASC | DESC])
);
UNIQUE:可选。表示索引为唯一性索引。
FULLTEXT;可选。表示索引为全文索引。
SPATIAL:可选。表示索引为空间索引。
INDEX和KEY:用于指定字段为索引,两者选择其中之一就可以了,作用是一样的。
索引名:可选。给创建的索引取一个新名称。
字段名1:指定索引对应的字段的名称,该字段必须是前面定义好的字段。
长度:可选。指索引的长度,必须是字符串类型才可以使用。
ASC:可选。表示升序排列。
DESC:可选。表示降序排列。
- 创建单列索引的SQL代码如下:
CREATE TABLE index4(id INT,
subject VARCHAR(30),
INDEX index4_st(subject(10))
);
- 创建多列索引的SQL代码如下:
CREATE TABLE index5(id INT,
name VARCHAR(20),
sex CHAR(4),
INDEX index5_ns(name,sex)
);
2添加索引
1.添加PRIMARY KEY(主键索引)
mysql>ALTER TABLE table_name
ADD PRIMARY KEY ( column
)
2.添加UNIQUE(唯一索引)
mysql>ALTER TABLE table_name
ADD UNIQUE (
column
)
3.添加INDEX(普通索引)
mysql>ALTER TABLE table_name
ADD INDEX index_name ( column
)
4.添加FULLTEXT(全文索引)
mysql>ALTER TABLE table_name
ADD FULLTEXT ( column
)
5.添加多列索引
mysql>ALTER TABLE table_name
ADD INDEX index_name ( column1
, column2
, column3
)
数据库连接池问题
https://www.cnblogs.com/yizhixiaocaiji/p/4205933.html
一、客户端与服务器建立连接需要多次网络往返
二、数据库连接池不一定非常优秀、连接池中放的是长连接,是进程级别的,在创建进程的时候,它就要独占一部分内存空间。
https://www.nowcoder.com/discuss/105875
redis
http://www.runoob.com/redis/redis-intro.html
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份。
Redis 优势
性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
持久化方式是什么?(aop,rdb)
由于Redis是基于内存的数据库,为了保证数据的可用性,Redis提供了两种数据持久化机制:RDB和AOP,下面对这两种持久化方式加以分析。
RDB
运行原理
RDB模式可以在指定的时间间隔内生成内存中整个数据集的持久化快照。快照文件默认被存储在当前文件夹中,名称为dump.rdb,可以通过dir和dbfilename参数来修改默认值。
AOF
aof持久化 记录服务器的所有写操作,并在服务器启动时重新执行这些命令来恢复数据集。aof文件中的命令全部以redis的协议格式存储,新命令会追加到文件的末尾,同时,redis还会在后台对aof文件进行重写,使得aof文件的体积不会过大。
https://blog.csdn.net/zhangdong2012/article/details/53116213
aof重写是什么?
AOF 持久化是通过保存被执行的写命令来记录数据库状态的,所以AOF文件的大小随着时间的流逝一定会越来越大;影响包括但不限于:对于Redis服务器,计算机的存储压力;AOF还原出数据库状态的时间增加;
为了解决AOF文件体积膨胀的问题,Redis提供了AOF重写功能:Redis服务器可以创建一个新的AOF文件来替代现有的AOF文件,新旧两个文件所保存的数据库状态是相同的,但是新的AOF文件不会包含任何浪费空间的冗余命令,通常体积会较旧AOF文件小很多。
怎样保持mysql与redis的数据一致性?(最终一致性)
写一个事务,先把数据存储到rides当做缓冲,然后把偏移量存储到mysql,其他的存储到Redis,删除缓存。
spark-Streaming 连接kafka
https://blog.csdn.net/qq_25838777/article/details/81660577
AWL与直连
直连方式就是使用executor直接连接kakfa节点,我们自定义偏移量的使用大小及存储备份方法。
1.直连方式从Kafka集群中读取数据,并且在Spark Streaming系统里面维护偏移量相关的信息,实现零数据丢失,保证不重复消费,比createStream更高效;
2.创建的DStream的rdd的partition做到了和Kafka中topic的partition一一对应。
1.3版本可以直接通过低阶API从kafka的topic消费消息,并且不再向zookeeper中更新consumer offsets,使得基于zookeeper的consumer offsets的监控工具都会失效。所以更新zookeeper中的consumer offsets还需要自己去实现,并且官方提供的两个createDirectStream重载并不能很好的满足我的需求,需要进一步封装。
因此,在采用直连的方式消费kafka中的数据的时候,大体思路是首先获取保存在zookeeper中的偏移量信息,根据偏移量信息去创建stream,消费数据后再把当前的偏移量写入zk中。
写代码,回文数判断。
java
Scanner sc = new Scanner(System.in);
String str=sc.next();
int z=0;
String[] be=str.split("");
for(int i=0;i<be.length/2;i++){
if(be[i].equals(be[be.length-i-1])){
z++;
}
}
if(z == be.length/2){
System.out.println(“是回文数”);
}
scala
val vad=“123321”
val pad={if(vad==vad.reverse) println(“是回文数”)}
Java StringBuffer 和 StringBuilder 类
当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。
和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。
http://www.runoob.com/java/java-stringbuffer.html
ArrayList和LinkedList的区别?
ArrayList和LinkedList的大致区别如下:
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
二叉树有哪几种方式遍历?
http://www.cnblogs.com/vipchenwei/p/7562567.html
先序遍历 根左右 GEDACHS
中序遍历 左根右 DEAGHCS
后续遍历 左右根 DAEHSCG
上述三种遍历方式时间复杂度和空间复杂度分析:
1.递归遍历和非递归遍历 时间复杂度0(n) 空间复杂度O(n)
2.Morris遍历 时间复杂度0(n) 空间复杂度O(1)
Java 泛型
http://www.runoob.com/java/java-generics.html
泛型就是参数化类型
适用于多种数据类型执行相同的代码
泛型中的类型在使用时指定
泛型归根到底就是“模版”
优点:使用泛型时,在实际使用之前类型就已经确定了,不需要强制类型转换。
泛型就是参数化类型
适用于多种数据类型执行相同的代码
泛型中的类型在使用时指定
泛型归根到底就是“模版”
优点:使用泛型时,在实际使用之前类型就已经确定了,不需要强制类型转换。
https://segmentfault.com/a/1190000014824002
final的基本用法以及会产生的后果
https://blog.csdn.net/u012056417/article/details/79359978
1.1、修饰类
当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。
在使用final修饰类的时候,要注意谨慎选择,除非这个类真的在以后不会用来继承或者出于安全的考虑,尽量不要将类设计为final类。
1.2、修改方法
下面这段话摘自《Java编程思想》第四版第143页:
“使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。在最近的Java版本中,不需要使用final方法进行这些优化了。“
因此,如果只有在想明确禁止 该方法在子类中被覆盖的情况下才将方法设置为final的。
注:类的private方法会隐式地被指定为final方法。
1.3、修饰变量
修饰变量是final用得最多的地方,也是本文接下来要重点阐述的内容。首先了解一下final变量的基本语法:
对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
2、深入理解
2.1、类的final变量和普通变量有什么区别?
当用final作用于类的成员变量时,成员变量(注意是类的成员变量,局部变量只需要保证在使用之前被初始化赋值即可)必须在定义时或者构造器中进行初始化赋值,而且final变量一旦被初始化赋值之后,就不能再被赋值了。
栈和队列、堆、堆栈的区别?
https://www.cnblogs.com/newyunhe/articles/5001056.html
队列是先进先出,有出口和入口,先进去可以先出来。
栈就像一个箱子,后放上去的,可以先出来
堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。{堆是指程序运行是申请的动态内存,而栈只是指一种使用堆的方法(即先进后出)。
栈是先进后出的,但是于堆而言却没有这个特性,两者都是存放临时数据的地方。 对于堆,我们可以随心所欲的进行增加变量和删除变量,不要遵循什么次序,只要你喜欢。
堆(Heap)是应用程序在运行的时候请求操作系统分配给自己内存。
hashmap在java里面怎么实现的?
https://www.cnblogs.com/yuanblog/p/4441017.html
HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
HashMap的实现原理: 利用key的hashCode重新hash计算出当前对象的元素在数组中的下标
存储时,如果出现hash值相同的key,此时有两种情况。(1)如果key相同,则覆盖原始值;(2)如果key不同(出现冲突),则将当前的key-value放入链表中
获取时,直接找到hash值对应的下标,在进一步判断key是否相同,从而找到对应值。
理解了以上过程就不难明白HashMap是如何解决hash冲突的问题,核心就是使用了数组的存储方式,然后将冲突的key的对象放入链表中,一旦发现冲突就在链表中做进一步的对比。
红黑树
https://blog.csdn.net/u010853261/article/details/54312932
红黑树顾名思义就是结点是红色或者是黑色的平衡二叉树,它通过颜色的约束来维持着二叉树的平衡。对于一棵有效的红黑树而言我们必须增加如下规则,这也是红黑树最重要的5点规则:
1、每个结点都只能是红色或者黑色中的一种。
2、根结点是黑色的。
3、每个叶结点(NIL节点,空节点)是黑色的。
4、如果一个结点是红的,则它两个子节点都是黑的。也就是说在一条路径上不能出现相邻的两个红色结点。
5、从任一结点到其每个叶子的所有路径都包含相同数目的黑色结点。
2.红黑树的三个基本操作
红黑树在插入,删除过程中可能会破坏原本的平衡条件导致不满足红黑树的性质,这时候一般情况下要通过左旋、右旋和重新着色这个三个操作来使红黑树重新满足平衡化条件。
旋转
旋转分为左旋和右旋。在我们实现某些操作中可能会出现红色右链接或则两个连续的红链接,这时候就要通过旋转修复。
通常左旋操作用于将一个向右倾斜的红色链接(这个红色链接链连接的两个结点均是红色结点)旋转为向左链接。对比操作前后,可以看出,该操作实际上是将红线链接的两个结点中的一个较大的结点移动到根结点上。
颜色反转
当出现一个临时的4-node的时候,即一个节点的两个子节点均为红色,如下图:
一个节点两个子结点都是红色
我们需要将E提升至父节点,操作方法很简单,就是把E对子节点的连线设置为黑色,自己的颜色设置为红色。颜色反转之后颜色如下:
颜色反转之后
mysql四大事务特性,每个特性都是什么意思
1、原子性(Atomicity)原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
2、一致性(Consistency)致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性
3、隔离性(Isolation) 隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。
4、持久性(Durability)
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,
即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。
mysql优化策略
https://www.cnblogs.com/xuchenliang/p/6844093.html
1、数据库表设计
2、数据库部署
3、数据库性能优化 3.1 数据库配置优化 3.2 系统内核优化 3.3 硬件配置
4、数据库架构扩展 4.1 主从复制与读写分离 4.2 增加缓存 4.3 分库 4.4 分表 4.5 分区
java 分布式锁
https://www.cnblogs.com/seesun2012/p/9214653.html
什么是分布式锁?
当在分布式模型下,数据只有一份(或有限制),此时需要利用锁的技术控制某一时刻修改数据的进程数。
与单机模式下的锁不仅需要保证进程可见,还需要考虑进程与锁之间的网络问题。(我觉得分布式情况下之所以问题变得复杂,主要就是需要考虑到网络的延时和不可靠。。。一个大坑)
分布式锁还是可以将标记存在内存,只是该内存不是某个进程分配的内存而是公共内存如 Redis、Memcache。至于利用数据库、文件等做锁与单机的实现是一样的,只要保证标记能互斥就行。