狂feng
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日志文件的异步更新缓存 实时一致性 度写锁,读读不互斥,读写互斥 读流程 * 读锁 * 先查询缓存 * 缓存命中返回 释放读锁 * 不命中,查询数据库,写入缓存,返回 * 释放读锁 写流程 * 写锁 * 写数据库 * 删除缓存 * 释放写锁
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP