jvm调优
线上young gc和full gc频繁,平均1天2-3次,需要优化。
观察老年代内存使用随着用户访问量的增大也不断增大,初步怀疑可能跟用户访问,,jmap dump内存信息,通过mat分析对象信息,发现String类型的对象占了绝大多数,通过支配树发现某个类型的字符串有很多,且一个字符串占了1.几M的内存,初步怀疑大对象所致,
同时redis 有些查询比较慢,耗时1秒多
优化代码,只存key,对象从数据库读,隔一段时间读取,优化,gc频率一周一次,redis查询时间也得到了优化
分库分表
存量数据,基于工具快速拆入到新库中,读取slave库
增量数据,直接写入新库,判断是否为新增的数据,是的话写入新库,读取的时候两边都读
难点:多线程(多机部署,获取id范围分片,基于redis的分布式锁,线程通信,设置屏障CountDownlatch,分表结束后校验)及并发(乐观锁加分片)
订单超卖
业务,数据库分离出来
下单减少库存
库存放redis,本地缓存
确保库存》=0(数据库的字段数据为无符号整数(unsigned bigint)或者通过事务),
减少对mysql行锁的竞争(应用层做排队。按照商品维度设置队列顺序执行,这样能减少同一台机器对数据库同一行记录进行操作的并发度,同时也能控制单个商品占用数据库连接的数量,防止热点商品占用太多的数据库连接)