面试准备 1

记录自己想到的可能的问题。

双写问题

https://www.teqng.com/2021/08/17/%E7%BC%93%E5%AD%98%E5%92%8C%E6%95%B0%E6%8D%AE%E5%BA%93%E5%88%B0%E5%BA%95%E5%85%88%E5%86%99%E5%93%AA%E4%B8%AA%EF%BC%9F%E8%BF%99%E6%AC%A1%E6%95%B4%E6%98%8E%E7%99%BD%E4%BA%86%EF%BC%81/

更新缓存的的Design Pattern有四种:Cache aside, Read through, Write through, Write behind caching,我们下面一一来看一下这四种Pattern。

其实,谁好谁坏,选择哪一个,并没有那么绝对,两种策略在并发情况下,都存在不一致的可能。目前工程应用上,对「先删除缓存,再更新数据库」有两个主要优化:

  1. 延时双删(「缓存删了又怕被污染,延时再删一次」
  2. 异步更新缓存(「基于订阅binlog的同步机制,阿里的canal、腾讯的Mysync,并发缓存更新串行化」

通过这些措施,「先删除缓存,再更新数据库」 ,也能满足业务的一致性要求,所以,没有完美的解决方案,只有适合业务场景,最终选择哪个,是在一致性和性能之间的Trade-Off,或者,老板说哪个好,我就用哪个。来源: 码猿技术专栏

消息队列消息丢失

https://zhuanlan.zhihu.com/p/371885724

生产者消息丢失,rebbitmq 消息丢失,消费者消息丢失。

kafka 分布式的repli和选举

有时候面试官会换个角度问你,为什么使用消息队列。你可以回答以下这几点:

  1. 应用解耦
  2. 流量削峰
  3. 异步处理
  4. 消息通讯
  5. 远程调用

https://zhuanlan.zhihu.com/p/471374718 消息队列 扩容。

JAVA

https://github.com/cosen1024/Java-Interview/blob/main/Java%E5%9F%BA%E7%A1%80/Java%E5%9F%BA%E7%A1%80%E4%B8%8B.md


Redis

Redis 加锁问题 https://mp.weixin.qq.com/s?__biz=Mzg3NjU3NTkwMQ==&mid=2247505097&idx=1&sn=5c03cb769c4458350f4d4a321ad51f5a&source=41#wechat_redirect

image-20220605125216977

image-20220605130123882

fencing token 和ACK,通过token的递增来判断顺序和写入。zookeeper,rabbitMQ等都用到了。

请问你觉得你对Java哪一块比较熟悉?基础、框架、中间件的都行,我们可以聊聊。"

image-20220605140748081

image-20220605140917688

image-20220605141016345

Redis你是拿来做缓存吗?有没有考虑过缓存击穿、缓存穿透、缓存雪崩的情况呢?

缓存击穿是指一个请求要访问的数据,缓存中没有,但数据库中有。

缓存穿透(恶意请求)是指一个请求要访问的数据,缓存和数据库中都没有,而用户短时间、高密度的发起这样的请求,每次都打到数据库服务上,给数据库造成了压力。一般来说这样的请求属于恶意请求,

缓存雪崩是指缓存中大多数的数据在同一时间到达过期时间,而查询数据量巨大,这时候,又是缓存中没有,数据库中有的情况了。请求都打到数据库上,引起数据库流量激增,压力瞬间增大,直接崩溃给你看(缓存过量请求数据库)

插播

努力不重要,重要的是能在未来获得更多的选择权。

Springboot

https://blog.nowcoder.net/n/5cab7614049140249f96e2690a257037?from=nowcoder_improve

https://blog.csdn.net/yanpenglei/article/details/120822218

image-20220605203830547

image-20220605203853883

JAVA bilibili-视频

Hashmap

  1. 1.8后数组大于64,同时链表大于16。转为红黑树。扩容2倍。

  2. java io的设计模式 https://blog.csdn.net/puma_dong/article/details/23018555

  3. 1)装饰模式:装饰模式在Java语言中的最著名的应用莫过于Java I/O标准库的设计了。

    (2)适配器模式:适配器模式是Java I/O库中第二个最重要的设计模式。

  4. mybatis 嵌套查询和嵌套结果

  5. https://www.bilibili.com/video/BV1YF411E77h/ mysql和java jvm 说的非常实际,绝对大佬,只有p7,吓死了。

  6. JAVA 垃圾回收器,image-20220609190704342

  7. image-20220609190925292

  8. 幂等性 === MVCC,多版本控制

  9. === 去重表,类似redis的去重表,可以用于分布式系统

  10. 隔离性: 读未提交(read uncommit) 脏读(没提交相当于不存在的), 读已提交(read commit)不可重复读 ,

image-20220610121401925

image-20220610121608053

参见文档的历史版本,有版本号,修改时间。

代理模式

注意事项: 1、和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。 2、和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。

代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强。值得注意的是,代理类和被代理类应该共同实现一个接口,或者是共同继承某个类。