近期面试记录
单例模式如何防止反射和反序列化
- 构造方法中增加逻辑判断
- 使用枚举单例
- 添加readRsolve()方法返回对象(防止反序列化)
Redis里的List可以用来做什么
- LPUSH + LPOP = 栈
- LPUSH + RPOP = 队列
- LPUSH + LTRIM = 有限集合
- LPUSH + BRPOP = 消息队列
Redis缓存满了怎么办
内存淘汰策略
- noeviction策略:内存空间达到maxmemory时,不会淘汰数据,有新写入时会返回错误
在设置过期时间的key中淘汰
- volatile-ttl策略:越早过期的越先被删除
- volatile-random策略:随机删除
- volatile-lru策略:使用LRU算法删除
- volatile-lfu策略:使用LFU算法删除
在所有的key中淘汰
- allkeys-random策略:随机删除
- allkeys-lru策略:使用LRU算法删除
- allkeys-lfu策略:使用LFU算法删除
LRU:最近最少使用。LFU:统计key被访问的次数,先对比次数,次数一样对比过期时间
Redis事务
1)开启事务,2)命令入队,3)执行事务
multi:开启一个事务块,后续可添加key的操作命令
exec:执行刚刚开启的事务块
discard:取消事务,放弃所有已入队命令
watch:监视key,事务执行之前key被改动,则事务不会执行
redis的命令是原子性,但事务不是原子性,并且中途报错,已执行命令不会回滚
线程池有哪几种
- newCachedThreadPool:创建一个可缓存线程池
- newFixedThreadPool:创建一个定长线程池
- newScheduledThreadPool:创建一个周期性执行任务的线程池
- newSingleThreadExecutor:创建一个单线程化的线程池
HTTP/2和HTTP/1.1的区别
- 请求的多路复用
- 请求头压缩
- 二进制协议
- 服务端推送
TCP/IP协议几层
四层
- 应用层(报文):FTP,SMTP,TELNET
- 传输层(段):TCP,UDP
- 网络层(包):IP,ARP,ICMP
- 数据链路层(帧):网络接口和硬件
OSI模型几层
七层
- 应用层
- 表示层
- 会话层
- 传输层
- 网络层
- 数据链路层
- 物理层