mysql引擎
MySQL常用存储引擎:MyISAM、InnoDB、MEMORY、MERGE,其中InnoDB提供事务安全表,其他存储引擎都是非事务安全表。
MyISAM:mysql默认存储引擎。MyISAM不支持事务,也不支持外键,但其访问速度快,对事务完整性没有要求。
InnoDB:提供了具有提交、回滚和崩溃恢复能力的事务安全。但是比起MyISAM,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。
MEMORY:使用存在内存中的内容来创建表。每个MEMORY表只实际对应一个磁盘文件。MEMORY类型的表访问速度非常快,因为它的数据是放在内存中的,并且默认使用HASH索引。但是一旦服务关闭,表中数据就会丢失掉。
MERGE:是一组MyISAM表的组合,这些MyISAM表必须结构完全相同。MERGE表本身没有数据,对MERGE类型的表进行查询、更新、删除的操作就是对内部的MyISAM表进行的。
shell中的一些变量
$?:表示上一个命令退出的状态
$$:表示当前进程编号
$0:表示当前脚本名称
$n:表示n位置的输入参数(n代表数字,n>=1)
$#:表示参数的个数,常用于循环
$*和$@都表示参数列表。
$*和$@都表示传递给函数或脚本的所有参数,不被双引号" "包含时,都以$1 $2 … $n 的形式输出所有参数;当它们被双引号" "包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。
Kafka有序性讨论
1.一个partition的数据是否是有序的?
针对一个topic里面的数据,只能做到每个partition内部有序,不能做到全局有序。
2.特别加入消费者的场景后,如何保证消费者消费的数据全局有序的?
如果要全局有序,必须保证生产、存储、消费都有序。由于生产可以做集群,存储可以分片(partition),消费者可以设置为一个消费者组,要保证全局有序,就要保证每个环节都有序。要保证全局有序:只有一个partition。但这种场景和大数据应用场景相悖。
关于HashMap一些常见问题
1.get
非一致性哈希。基于hash方法,取key的hashcode值找到bucket,bucket定位到Entry
2.HashMap当两个对象的hashcode都相同会发生什么
HashMap底层是数组+链表结构,当hashcode值相同即发生了hash冲突时,会以链表的形式存储元素
3.两个键的hashcode相同,如何获取元素
hashcode相同,通过equals()方法获取元素
4.如果HashMap的大小超过了负载因子定义的容量怎么办
负载因子默认0.75,HashMap扩容标准。成倍扩容,扩容前HashMap存储的元素通过rehash重新映射添加到扩容后的HashMap中。
当数据量小时,进行rehash对性能影响不明显,当数据量大时,rehash时间长,效率低,超大容量不适合用HashMap。
5.可以用自定义对象当做key么
可以。但自定义对象必须重写hashCode()和equals()方法定义规则。否则可变,插入数据后再按照原来key的hashcode和equals方法查找会报空指针异常。
单向链表和双向链表
1.单向链表
包含两个域,一个信息域包含当前节点的信息、一个指针域包含下一个节点的地址。这个链接指向表中的下一个节点,而最后一个节点则指向一个空值null。
单向链表只可向一个方向遍历。
查找一个节点的时候需要从第一个节点开始每次访问下一个节点,一直访问到需要的位置。也可以提前把一个节点的位置另外保存起来,然后直接访问。
2.双向链表
双向链表有两个指针,分别指向当前节点的上一个节点和下一个节点。第一个节点的"前链接"指向NULL,最后一个"后连接"指向null。
可以从任何一个节点访问前一个节点,也可以访问后一个节点,以至整个链表。一般是在需要大批量的另外储存数据在链表中的位置的时候用。另外储存了指向链表内容的指针,并且可能会修改相邻的节点,有的时候第一个节点可能会被删除或者在之前添加一个新的节点。这时候就要修改指向首个节点的指针。
Redis的List数据类型底层使用的就是双向链表。关于redis,请阅读《Redis从入门到精通》、《Redis中的哈希问题》
结构化数据、半结构化数据及非结构化数据
1.结构化数据
能够用数据或统一的结构来表示。传统的关系数据模型、行数据,存储于数据库,可用二维表结构表示。一般特点是:数据以行为单位,一行数据表示一个实体的信息。
结构化数据的存储和排列是很有规律的,这对查询和修改等操作很有帮助。但是它的扩展性不好,比如新增一个字段
2.半结构化数据
介于结构化数据如关系型数据库,和非结构化数据如图像文件之间的数据。xml、html文档就属于半结构化数据。它一般是自描述的,数据的结构和内容混在一起,没有明显的区分。
3.非结构化数据
字段长度可变,并且每个字段的记录又可以由可重复或不可重复的子字段构成的数据库,用它也可以处理结构化数据。
非结构化数据包括办公文档、文本、图片、图像和视频信息等。
代码块
1. 局部代码块
定义在方法内部。当我们使用一个变量之后,希望该变量的空间尽快释放,则可以使用局部代码块。
2. 构造代码块
定义在类的内部。每次创建该类的对象时都会被执行,如果该类有父类则会先执行父类的构造代码快。往往将一些公有的代码放在构造代码块中。
3.静态代码块
用来完成对类的初始化。静态代码块是在类第一次被加载的时候执行且只执行一次,静态代码块中只能访问静态成员,如果该类有父类,则先执行父类的静态代码块。
静态代码块和非静态代码块的对比:
相同点:都是JVM加载类时且在构造函数执行之前执行,在类中都可以定义多个,一般在代码块中对一些static变量进行赋值。
不同点:静态代码块在非静态代码块之前执行。静态代码块只在第一次new时执行一次,之后不再执行,而非静态代码块每new一次就执行一次。
类的初始化过程
1.实现父类的公共静态属性和静态代码块,按照出现顺序执行
2.实现自身的静态属性和静态代码块
3.实现父类的非静态属性和非静态代码块
4.执行父类的构造函数
5.实现自身的非静态属性和非静态代码块
6.执行自身的构造函数