数据库事务四大原则(原子性A、一致性C、隔离性I、持久性D)

    数据库事务的隔离级别和并发控制
    读未提交、读已提交、不可重复读、
    脏读有时可以被接受,但是脏写不被允许。
    事务性数据库对于写操作永远需要锁来避免脏写

    数据库锁(行级锁、表级锁、页级锁;乐观锁与悲观锁)

    数据库索引

    MySQL索引优化

    Redis(缓存)数据库

    雪崩与穿透
    穿透:缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,我们数据库的 id 都是1开始自增上去的,如发起为id值为 -1 的数据或 id 为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大,严重会击垮数据库。
    处理:缓存穿透我会在接口层增加校验,比如参数白名单、用户鉴权、参数校验,不合法的参数直接拒绝,比如:id 做基础校验,id <=0的直接拦截等。
    小点的单机系统,基本上用postman就能搞死,
    击穿:缓存击穿嘛,这个跟缓存雪崩有点像,但是又有一点不一样,缓存雪崩是因为大面积的缓存失效,打崩了DB,而缓存击穿不同的是缓存击穿是指一个Key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个Key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,
    处理:从缓存取不到的数据,在数据库中也没有取到,这时也可以将对应Key的Value对写为null、位置错误、稍后重试这样的值具体取啥问产品,或者看具体的场景,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。
    数据库常见面试题 - 图1
    雪崩:
    缓存层承载了大量的请求,有效的保护了存储 层,但是如果缓存由于某些原因,整体不能够提供服务,于是所有的请求,就会到达存储层,存储层的调用量就会暴增,造成存储层也会挂掉的情况。缓存雪崩的英文解释是奔逃的野牛,指的是缓存层当掉之后,并发流量会像奔腾的野牛一样,大量后端存储。

    举个简单的例子:如果所有首页的Key失效时间都是12小时,中午12点刷新的,我零点有个秒杀活动大量用户涌入,假设当时每秒 6000 个请求,本来缓存在可以扛住每秒 5000 个请求,但是缓存当时所有的Key都失效了。此时 1 秒 6000 个请求全部落数据库,数据库必然扛不住,它会报一下警,真实情况可能DBA都没反应过来就直接挂了。此时,如果没用什么特别的方案来处理这个故障,DBA 很着急,重启数据库,但是数据库立马又被新的流量给打死了。这就是我理解的缓存雪崩。—https://www.cnblogs.com/sunsky303/p/14154095.html

    处理: 保证数据不会在同一时间大面积失效-失效时间随机

    • 事前:Redis 高可用,主从+哨兵,Redis cluster,避免全盘崩溃。
    • 事中:雪崩锁+本地 ehcache 缓存 + Hystrix 限流+降级,避免 DB 被打死。
    • 事后:Redis 合理的持久化 RDB+AOF,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。

    ES(搜索引擎)数据库