经典面试题4(堆内存,索引,缓存击穿,缓存穿透,缓存雪崩,redis的持久化)

目录

1,JDK1.8堆内存的结构

2,MYSQL索引的优缺点

3,缓存击穿,缓存穿透,缓存雪崩

4,redis的持久化

1,JDK1.8堆内存的结构

        Young 年轻区(代): Eden+S0+S1, S0 和 S1 大小相等, 新创建的对象都在年轻代。

        Tenured 年老区: 经过年轻代多次垃圾回收存活下来的对象存在年老代中。

        Jdk1.7 和 Jdk1.8 的区别在于, 1.8 将永久代中的对象放到了元数据区, 不存永久代这一区

域了。

        移除永久代是为融合HotSpot JVM与 JRockit VM而做出的努力,因为JRockit没有永久代, 不需要配置永久代。

        而实际使用中,由于永久代内存经常不够用或发生内存泄露,爆出异常java.lang.OutOfMemoryError: PermGen。 基于此,将永久区废弃,而改用元空间,改为了使用本地内存空间。

2,MYSQL索引的优缺点

优点:

1,索引可以大大的加快数据的查询速度,特别是数据表特别大的时候,没有索引的查询速度很慢。

2,使用索引可以降低数据库的IO成本,当索引命中时,MYSQL就不用扫描整个数据表,而是可以直接定位到相应的行。

3,索引可以保证数据表中的数据的唯一性,对于一些唯一的数据很重要,比如主键索引,唯一索引。

4,如果要经常对某一个字段进行排序,就可以使用索引来优化排序操作,提高查询效率。

缺点:

1,索引要占用存储可见,如果数据表太大,索引会占用很多的磁盘空间。

2,每次插入,删除数据的时候,都需要更新索引,降低读写速度。

3,索引需要占用内存,可能会导致查出内存限制,从而导致性能下降。

4,如果索引设计不当,会导致查询性能下降,索引失效。

3,缓存击穿,缓存穿透,缓存雪崩

1,缓存击穿:

        Redis的缓存击穿是指的是,当一个非常热门的key过期之后,同时有大量的并发请求过来,此时会导致缓存没有起作用,请求都会穿透到数据库层,请求都会穿透到数据库层,从而导致数据库压力骤增,严重影响系统性能。

解决方案:

  1. 设置热点数据不过期,这样就不会导致redis不起作用,但是需要定期的更新数据。
  2. 加互斥锁,多个请求同时只能有一个请求加入数据库层获取数据。
  3. 使用布隆过滤器,过滤掉无效请求

2,缓存穿透:

        缓存穿透是恶意攻击者故意发送一些不存在于缓存中的请求,这些请求都会直接穿透到数据库层,从而导致数据库压力骤增,严重影响系统性能。

解决方案:

  1. 设置缓存空值,缓存空值可以在一段时间内防止缓存穿透。
  2. 使用布隆过滤器,过滤掉无效请求。
  3. 使用缓存预热,提前将常用的数据放入缓存中。

3,缓存雪崩

        缓存雪崩指的是,缓存中的大量的key同一时间失效,此时所有的请求都会直接穿透到数据库层,从而导致数据库压力骤增,严重影响系统性能。

解决方案:

  1. 设置缓存的失效时间随机,防止大量的key同时过期。
  2. 使用多级缓存,将数据库缓存在多个地方,当一个地方的缓存失效的时候,可以从其他的地方获取数据。
  3. 设置热点数据不过期,但是要定期更新数据。

4,redis的持久化

redis有两种持久化的方式,RDB和AOF:

RDB(redis database),在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质。

优点:

  1. 只有一个文件,方便持久化。
  2. 容灾性好,一个文件可以保存到安全的磁盘。
  3. 性能最大化,fork子进程来完成写操作,让主进程继续处理命令,所以是IO最大化。
  4. 相对于数据集大时,比AOF的启动效率更高。

缺点:

  1. 数据安全性低。
  2. RDB是间隔一段时间来进行持久化,如果在持久化时发生故障,会发生数据丢失。

AOF(append only file),只允许追加不允许改写的文件,换了一个角度来实现持久化,就是将redis执行的所有指令记录下来,在下次redis重新启动的时候,只要把这些指令从前到后重复执行一遍,就可以实现数据恢复了。

优点:

  1. 数据安全
  2. 通过append模式写文件,即使中途服务器发生故障,也可以通过redis-check-aof工具解决数据一致性问题。
  3. AOF机制的rewrite模式,AOF文件没被rewrite之前,可以删除其中的某些命令,比如误操作的flushall。

缺点:

  1. AOF文件比RDB文件大,且恢复速度慢。
  2. 数据集大的时候,比RDB启动的效率低。

RDB 和 AOF 两种方式也可以同时使用,在这种情况下,如果 redis 重启的话,则会 优先采用 AOF 方式来进行数据恢复,这是因为 AOF 方式的数据恢复完整度更高。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会Java的MING

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值