Java后端
·2025-04-21复习第十三天
Java 中 HashMap 的扩容机制是怎样的?
Java 中有哪些集合类?请简单介绍
说说 Java 中 HashMap 的原理?
存储键值对,通过计算键值的hash值,找到数组中对应的位置进行插入,如果存在元素,则产生冲突,此时使用链表或者红黑树解决冲突(JDK1.8之后引入红黑树)
扩容和负载因子
Redis 实现分布式锁时可能遇到的问题有哪些?
* 锁过期
* 锁被误释放
* 单点故障
* 主从故障
* 时钟漂移
* 网络分区
Redis 的 Red Lock 是什么?你了解吗?
redis的红锁,当主从架构的时候,如果主节点加完锁还没同步给从节点,主节点就挂了,此时会有多个线程获取到锁。此时就需要红锁来避免这一过程。
具体来说
* 存在多个实例通常是5个
* 客户端轮询向这多个实例中加锁,
* 只有超过半数的加锁成功才算成功
缺点:
* 复杂度高,是一个重锁
* 多个锁续期复杂
* 时钟漂移问题
* 不适合高并发场景,多个锁同时加锁时间长
Redis 中如何实现分布式锁?
使用lua脚本加setnx
加锁:set key_lock value_unique ex expire_time nx
解锁:使用lua脚本,先获取唯一标识,判断是否是当前线程加的锁,如果是才能释放锁,完整的流程,需要使用lua脚本来实现。
为什么要有唯一值?
防止锁被误释放
为什么要设置过期时间?
防止用户程序崩溃导致锁无法释放
复习第十二天 (补昨天的)
接口和抽象类有什么区别?
接口是规范,客户端不需要底层的具体实现,对客户端无感。(JDK1.8及之后可以实现默认方法和静态方法)
抽象类是模板:便于子类的复用和重写。
JDK 动态代理和 CGLIB 动态代理有什么区别?
JDK动态代理:代理类需要实现接口,通过实现Invocationhandler来增强被代理累。然后在客户端中使用Proxy创建代理类
CGLIB动态代理:基于字节码的形式,通过生成被代理累的子类来对对象进行增强
你使用过 Java 的反射机制吗?如何应用反射?
可以动态的创建对象和访问方法和属性
核心时Class类
通过Class类创建实例对象
访问方法clazz.getMethods()
访问属性class.getField()
Redis String 类型的底层实现是什么?(SDS)
简单动态字符串
和C语言先比
* O(1)获取长度
* 预留空间
* 动态扩容
此外还有多种编码方式
* int编码:存储整数
* embstr编码:存储短字符串,元数据(编码类型)和SDS存放在一起
* raw编码:长字符串,元素局和SDS分开存储
Redis 中的缓存击穿、缓存穿透和缓存雪崩是什么?
缓存击穿:
热点数据过期。
加锁,用不过期
缓存穿透:
大量请求数据库不存在的数据
缓存空值
加锁
布隆过滤器
缓存雪崩:
热点数据同时过期、或者缓存服务崩溃
* 随机性,加锁
* 集群架构
Redis 中如何保证缓存与数据库的数据一致性?
先更新数据库后更新缓存
先更新缓存后更新数据库
先删除缓存后更新数据库
先更新数据库后删除缓存
先删除缓存后更新数据库,在删除缓存(缓存双删)
基于binlog日志文件的异步更新缓存
实时一致性
度写锁,读读不互斥,读写互斥
读流程
* 读锁
* 先查询缓存
* 缓存命中返回 释放读锁
* 不命中,查询数据库,写入缓存,返回
* 释放读锁
写流程
* 写锁
* 写数据库
* 删除缓存
* 释放写锁
4
0
分享
操作
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
