阿里开发手册精髓知识点总结

Mysql篇================
小数类型为decimal,禁止使用float和double。
说明:在存储的时候,float和double都存在精度损失的问题,很可能在比较值的时候,得到不正确的结果。如果存 储的数据范围超过decimal 的范围,建议将数据拆成整数和小数并分开存储。
主键索引名为 pk_字段名;唯一索引名为 uk_字段名;普通索引名则为 idx_字段名。 说明:pk_即primary key;uk_即unique key;idx_即index 的简称。
varchar 是可变长字符串,不预先分配存储空间,长度不要超过 5000,如果存储长度大于此 值,定义字段类型为 text,独立出来一张表,用主键来对应,避免影响其它字段索引率
如果存储的字符串长度几乎相等,使用char定长字符串类型
索引规约==================
超过三个表禁止 join。需要join 的字段,数据类型保持绝对一致;多表关联查询时,保证被关联 的字段需要有索引。 说明:即使双表join也要注意表索引、SQL 性能
在varchar 字段上建立索引时,必须指定索引长度,没必要对全字段建立索引,根据实际文本区 分度决定索引长度。
说明:索引的长度与区分度是一对矛盾体,一般对字符串类型数据,长度为20的索引,区分度会高达90%以上,可以使 用count(distinct left(列名,索引长度)) / count() 的区分度来确定
建组合索引的时候,区分度最高的在最左边。 正例:如果where a = ? and b = ?,a列的几乎接近于唯一值,那么只需要单建idx_a索引即可。 说明:存在非等号和等号混合判断条件时,在建索引时,请把等号条件的列前置。如:where c > ? and d = ? 那么即使 c的区分度更高,也必须把d放在索引的最前列,即建立组合索引idx_d_c
=SQL篇===================
不要使用count(列名) 或count(常量) 来替代count(
),count() 是SQL92定义的标准统计行 数的语法,跟数据库无关,跟 NULL 和非NULL 无关。 说明:count() 会统计值为NULL 的行,而count(列名) 不会统计此列为NULL 值的行
count(distinct col) 计算该列除NULL之外的不重复行数,注意 count(distinct col1 , col2) 如 果其中一列全为 NULL,那么即使另一列有不同的值,也返回为 0
当某一列的值全是NULL时,count(col) 的返回结果为0;但sum(col) 的返回结果为NULL,因 此使用 sum() 时需注意 NPE问题。 正例:可以使用如下方式来避免sum的NPE问题:SELECT IFNULL(SUM(column) , 0) FROM table;
不得使用外键与级联,一切外键概念必须在应用层解决。 说明:(概念解释)学生表中的student_id是主键,那么成绩表中的student_id则为外键。如果更新学生表中的 student_id,同时触发成绩表中的student_id更新,即为级联更新。外键与级联更新适用于单机低并发,不适合分布式、 高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。
=命名风格及其他================
类名使用 UpperCamelCase 风格,以下情形例外:DO / PO / DTO / BO / VO / UID 等
接口类中的方法和属性不要加任何修饰符号(public 也不要加),保持代码的简洁性,并加上 有效的 Javadoc 注释。尽量不要在接口里定义常量,如果一定要定义,最好确定该常量与接口的方法 相关,并且是整个应用的基础常量。 正例:接口方法签名void commit(); 接口基础常量String COMPANY = “alibaba”;
浮点数类型的数值后缀统一为大写的 D或F。 正例:public static final double HEIGHT = 175.5D; public static final float WEIGHT = 150.3F;
所有整型包装类对象之间值的比较,全部使用equals方法比较。 说明:对于Integer var = ? 在 -128至127之间的赋值,Integer对象是在IntegerCache.cache产生,会复用已有对 象,这个区间内的Integer值可以直接使用 == 进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复 用已有对象,这是一个大坑,推荐使用equals方法进行判断
BigDecimal的等值比较应使用 compareTo() 方法,而不是 equals() 方法。 说明:equals() 方法会比较值和精度(1.0 与 1.00 返回结果为 false),而compareTo() 则会忽略精度
获取当前毫秒数:System.currentTimeMillis();而不是new Date().getTime()
集合处理=============
关于hashCode和equals的处理,遵循如下规则: 1)只要覆写equals,就必须覆写hashCode。 2)因为Set存储的是不重复的对象,依据hashCode和equals 进行判断,所以Set存储的对象必须覆写这两种方法。 3)如果自定义对象作为Map的键,那么必须覆写hashCode和equals。 说明:String因为覆写了hashCode和equals方法,所以可以愉快地将String对象作为key来使用。
不要在foreach循环里进行元素的remove / add操作。remove元素请使用iterator方式, 如果并发操作,需要对iterator 对象加锁
使用entrySet遍历Map类集合KV,而不是keySet方式进行遍历
说明:keySet其实是遍历了2次,一次是转为Iterator 对象,另一次是从hashMap中取出key所对应的value。而 entrySet只是遍历了一次就把key和value都放到了entry中,效率更高。如果是JDK8,使用Map.forEach方法。
正例:values() 返回的是V值集合,是一个list集合对象;keySet() 返回的是K值集合,是一个Set集合对象;
高并发时,同步调用应该去考量锁的性能损耗。能用无锁数据结构,就不要用锁;能锁区块,就 不要锁整个方法体;能用对象锁,就不要用类锁。 说明:尽可能使加锁的代码块工作量尽可能的小,避免在锁代码块中调用RPC方法
对多个资源、数据库表、对象同时加锁时,需要保持一致的加锁顺序,否则可能会造成死锁。
说明:线程一需要对表A、B、C依次全部加锁后才可以进行更新操作,那么线程二的加锁顺序也必须是A、B、C,否则可 能出现死锁。
】在使用阻塞等待获取锁的方式中,必须在try代码块之外,并且在加锁方法与 try代码块之间没 有任何可能抛出异常的方法调用,避免加锁成功后,在 finally中无法解锁。 说明一:在lock 方法与try代码块之间的方法调用抛出异常,无法解锁,造成其它线程无法成功获取锁。
说明二:如果lock 方法在try代码块之内,可能由于其它方法抛出异常,导致在finally代码块中,unlock 对未加锁的对 象解锁,它会调用AQS 的tryRelease方法(取决于具体实现类),抛出IllegalMonitorStateException异常。
说明三:在Lock 对象的lock 方法实现中可能抛出unchecked异常,产生的后果与说明二相同。
正例:Lock lock = new XxxLock(); // ... lock.lock(); try { doSomething(); doOthers(); } finally { lock.unlock(); }
并发修改同一记录时,避免更新丢失,需要加锁。要么在应用层加锁,要么在缓存加锁,要么 在数据库层使用乐观锁,使用 version 作为更新依据
使用CountDownLatch进行异步转同步操作,每个线程退出前必须调用countDown方法,线 程执行代码注意 catch 异常,确保 countDown 方法被执行到,避免主线程无法执行至 await 方法, 直到超时才返回结果。 说明:注意,子线程抛出异常堆栈,不能在主线程 try-catch到
volatile 解决多线程内存不可见问题对于一写多读,是可以解决变量同步问题,但是如果多 写,同样无法解决线程安全问题。 说明:如果是count++操作,使用如下类实现: AtomicInteger count = new AtomicInteger(); count.addAndGet(1); 如果是JDK8,推荐使用LongAdder对象,比AtomicLong性能更好(减少乐观锁的重试次数)
在高并发场景中,避免使用“等于”判断作为中断或退出的条件。 说明:如果并发控制没有处理好,容易产生等值判断被“击穿”的情况,使用大于或小于的区间判断条件来代替。 反例:判断剩余奖品数量等于0时,终止发放奖品,但因为并发处理错误导致奖品数量瞬间变成了负数,这样的话, 活动无法终止。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值