遇到的生产问题:session续期bug,minio的intbug,课程列表页面的加载速度问题。
索引失效的几种情况: 索引是个树,是个目录,失效情况:1联合索引只查右边的列2对查询列做运算或格式化操作3查询条件占比过大(in,不等于,not null等)4like使用左模糊(b+数按顺序来的)
事务操作数据的一致性。
事务隔离级别:脏读(并行事务中,事务a读取到事务b已修改,但还没有提交的单条数据,事务b可能会回滚),幻读(并行事务中,事务a两次读取到的数据结果集不一致,因为事务b加了数据),不可重复读(并行事务中,事务a两次读取到的单条数据不一致,因为事务b做了修改)
解决:
悲观锁:做逻辑的时候就锁住,比如用redis,或者查询时forupdate
乐观锁:对数据加时间戳或者版本信息,在更新时做比对
mq的重复消费解决办法(接口幂等)
1.业务逻辑判断,在做逻辑前,先做业务数据的判断
2.利用redis加锁
3.利用数据库唯一索引,提前生成id,多次保存的二次保存就会失败
分布式事务:多个服务节点的数据一致性(spring事务是单节点的,分布式事务是多个节点的数据一致性),分布式有2pc 3pc tcc mq事务消息(逻辑开始前半消息或者叫预消息,完成后发送commit或者rollback)
锁用来保证共享数据的操作原子性。
分布式锁:分布式中,保证数据原子性,利用redisson库实现,其lock和unlock用于加锁和取消锁,其lock函数自带续期机制,但是需要合理设置锁的续期时间。
缓存击穿(同一时间请求没有缓存好的数据): 热更新,锁,永久有效
缓存击穿(请求数据库中没有的数据,导致不缓存,一直查数据库):参数检验
一级缓存二级缓存,目的是解决数据库的性能瓶颈
一级缓存是sqlsession同一个事务中,查询同一条数据,第二次就会走缓存
二级缓存是mapper级别的(同一个naspace的mapper),只要你做过一次查询,就会缓存,后面如果有增删改,则会刷新缓存(频繁更新的数据,就不建议开启二级缓存了)
秒杀:预热数据到redis,预先屏蔽一部分异常用户,mq异步处理,添加服务器节点快速处理数据承接流量洪峰。