面经四

幂等性控制机制

数据库幂等

数据库上的幂等和事务是一体的。
1. 查询操作 
查询一次和查询多次,在数据不变的情况下,查询结果是一样的。select是天然的幂等操作 
 2. 删除操作 
删除操作也是幂等的,删除一次和多次删除都是把数据删除。(注意可能返回结果不一样,删除的数据不存在,返回0,删除的数据多条,返回结果多个) 
3.唯一索引,防止新增脏数据 
比如:支付宝的资金账户,支付宝也有用户账户,每个用户只能有一个资金账户,怎么防止给用户创建资金账户多个,那么给资金账户表中的用户ID加唯一索引,所以一个用户新增成功一个资金账户记录 

4.悲观锁 
获取数据的时候加锁获取 
select * from table_xxx where id='xxx' for update; 
注意:id字段一定是主键或者唯一索引,不然是锁表,会死人的 
悲观锁使用时一般伴随事务一起使用,数据锁定时间可能会很长,根据实际情况选用 
5. 乐观锁 
乐观锁只是在更新数据那一刻锁表,其他时间不锁表,所以相对于悲观锁,效率更高。

ActiveMQ和RabbitMQ什么区别,RabbitMQ业务场景是什么,怎么选择消息队列

Redis数据结构,hash结构存储 hashmap在集群中key的存放

HTTP的幂等性

幂等表示:请求服务器一次或是多次,返回的结果均是一样的【select 】一般是GET请求

非幂等表示:请求服务器不同的次数,返回的结果将是不一样的[update   delete] 一般是POST请求

svn和git有什么不同

两者的工作流对比:

svn模式

  1. 写代码。
  2. 从服务器拉回服务器的当前版本库,并解决服务器版本库与本地代码的冲突。
  3. 将本地代码提交到服务器。

git模式

  1. 写代码。
  2. 提交到本地版本库。
  3. 从服务器拉回服务器的当前版本库,并解决服务器版本库与本地代码的冲突。
  4. 将远程库与本地代码合并结果提交到本地版本库。
  5. 将本地版本库推到服务器。

对比可以看出:分布式版本管理仅仅是增加了本地库这个概念,其余的概念与集中管理并无区别。——但是 svn 在与服务器同步之前无法提交代码,因而本地修改更容易出问题。

1.SVN优缺点
优点: 
1、 管理方便,逻辑明确,符合一般人思维习惯。 
2、 易于管理,集中式服务器更能保证安全性。 
3、 代码一致性非常高。 
4、 适合开发人数不多的项目开发。 
缺点: 
1、 服务器压力太大,数据库容量暴增。 
2、 如果不能连接到服务器上,基本上不可以工作,看上面第二步,如果服务器不能连接上,就不能提交,还原,对比等等。 
3、 不适合开源开发(开发人数非常非常多,但是Google app engine就是用svn的)。但是一般集中式管理的有非常明确的权限管理机制(例如分支访问限制),可以实现分层管理,从而很好的解决开发人数众多的问题。

2.Git优缺点
优点: 
1、适合分布式开发,强调个体。 
2、公共服务器压力和数据量都不会太大。 
3、速度快、灵活。 
4、任意两个开发者之间可以很容易的解决冲突。 
5、离线工作。 
缺点: 
1、学习周期相对而言比较长。 
2、不符合常规思维。 
3、代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。
Git保密性差这一点以最近的新闻为例,华住的程序员把数据库连接方式上传至托管平台github,数据库密码过于简单,从这里看出不单单是这位程序员的原因,同时也说明了Git的代码保密性差的原因。
 
 

数据库常用数据类型,float,double有什么区别,decimal解决浮点型精度问题

1.整型:

bit(布尔型):只能输入true或false,输入1是自动转化为TRUE,0是自动转化为FALSE

tinyint:只能输入0到225之间的整数

smallint(两个字节组成的整数):-32768~32767

int(四个字节组成的整数):2的31次方

bigint(八个字节组成的整数):2的63次方

2.货币型:

money,可以四位小数

3.日期型:

data:2001.1.1~9999.12.31

datatime:1753.1.1~9999.12.31

time:更精确

4.字符型:

char(8000):固定长度,8000为最大。例char(10)可以存10个字符,5个汉字

nchar(4000):定常,4000为最大。例nchar(10)可以存10个字符,10个汉字

varchar(8000):变长。例varchar(10)假如只输入5个,则只会占用5个,若为char(10),只输入5个时

,剩余的5位会用0补齐。

nvarchar(4000):变长

float : 单精度浮点数

double : 双精度浮点数

两者的主要区别如下:

  01.在内存中占有的字节数不同

    单精度浮点数在机内存占4个字节

    双精度浮点数在机内存占8个字节

  02.有效数字位数不同

    单精度浮点数有效数字8位

    双精度浮点数有效数字16位

  03.数值取值范围

    单精度浮点数的表示范围:-3.40E+38~3.40E+38

    双精度浮点数的表示范围:-1.79E+308~-1.79E+308

  04.在程序中处理速度不同

    一般来说,CPU处理单精度浮点数的速度比处理双精度浮点数快

如果不声明,默认小数为double类型,所以如果要用float的话,必须进行强转

使用java提供的BigDecimal类。该类封装在java.math.BigDecimal中

该类的构造器有很多,但在使用浮点类型计算时一定要使用String构造器来实例BigDecimal对象

mysql索引Innodb MYISAM的区别,存储结构b+树,b树

两个引擎都是使用B+tree 数据结构作为索引

不同点:

1、INNODB的主键必须要有,同时也是聚集索引,INNODB的数据文件本身就是索引文件;而MYISAM则是存储了数据的地址

2、INNODB的辅助索引,会存储主键的地址(所以建议不要把主键的长度设置过大,一般用自增的数字即可),使用辅助索引搜索的时候,也是先关联到主键,在使用主键进行查询;而MYISAM 的辅助索引跟主键没有任何区别,只是主键唯一,辅助索引不唯一而已。

3、INNODB 支持事务;MYISAM 不支持事务

4、INNODB是行锁;MYISAM 是表锁

乐观锁和悲观锁的场景和实现

什么是gc

tcp三次握手,http请求流程

常用哪些设计模式,在什么场景下

常用的算法的时间复杂度

rdia持久化

redis缓存一致性

虚拟内存

进程隔离

数据库隔离级别

java的泛型原理(ArrayList<string>和ArrayList<integer>)

泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。

泛型可以消除代码中的强制类型转换,同时获得一个附加的类型检查层,该检查层可以防止有人将错误类型的键或值保存在集合中。这就是泛型所做的工作。

原文地址:https://www.cnblogs.com/ashin1997/p/11603002.html