Redis 缓存用于弥补 DB 读写慢、TPS 低的缺陷,但不当设计会出现三大问题并提供对应方案。缓存击穿(热点数据失效)可通过不设过期、加随机过期、预热、分布式锁等方式避免单点 DB 压力。缓存穿透(查询不存在数据)可用缓存空值或布隆过滤器拦截。缓存雪崩(大量数据或 Redis 故障导致请求全涌向 DB)通过在过期时间上加入随机值、接口限流、服务熔断以及构建 Redis 哨兵/Cluster 高可用集群来降低风险。这样既提升查询性能,又保障系统可靠性。

本文围绕Java中的List集合展开面试问答,阐述了List是接口,常用实现ArrayList(基于数组,查询快,容量不足时按1.5倍扩容)和LinkedList(基于链表,增删快)。分别说明了两者的适用场景:ArrayList适合查询多、增删少;LinkedList适合增删多、查询少。进一步比较了List与Set的区别,介绍了已不常用的Vector及其线程安全特性。列举了实现线程安全的List方式:Collections.synchronizedList和CopyOnWriteArrayList,并详细解释了后者的写时复制原理及其内存占用大、读取可能不实时的缺点。最后提供了List排序(list.sort或Collections.sort)和遍历时安全删除元素的两种做法(Iterator.remove或list.removeIf)。

Redis分布式锁的七种实现:①SETNX+EXPIRE(非原子)②SETNX+时间戳值(需时间同步)③Lua脚本保证原子④SET扩展命令SET NX EX PX⑤唯一随机值+Lua检查释放⑥Redisson(看门狗自动续期)⑦Redlock(多节点多数投票)。文章阐述锁应具备互斥、超时、可重入、高性能、安全等特性,分析各方案优缺点,推荐使用Redisson或Redlock以获得可靠的分布式锁。

多线程提升资源利用率和并发能力,常用于高并发、耗时任务和定时任务。线程安全指多线程访问对象时无需额外同步仍能得到正确结果,处理方式包括原子类、并发集合、CountDownLatch、Semaphore、synchronized、Lock 以及分布式锁。synchronized 通过 monitorenter/monitorexit 实现对象头锁,方法级使用 ACC_SYNCHRONIZED 标识;ReentrantLock 需手动释放、可设公平或非公平、支持中断、超时和 tryLock。公平锁按线程顺序获取,非公平锁则不保证。CAS(Compare‑And‑Swap)是乐观锁的核心,实现原子类和 AQS 的无锁同步。

Redis 早期单线程、I/O 多路复用,避免锁竞争,4.0 起加入多线程用于异步删除。持久化有 AOF(追加日志)和 RDB(快照),4.0 增加混合持久化。AOF 写后日志易丢失且阻塞,RDB 通过 save(阻塞)和 bgsave(子进程)生成快照,bgsave 不阻塞写操作。高可用方式包括主从复制、哨兵自动故障转移和 Cluster。Cluster 将键经 CRC16 哈希映射到 16384 个槽位,由不同节点负责,实现写入、存储扩展。

代码演示了 Java 中字符串比较的细节。`s1` 通过 `new String("xiaozou")` 在堆中创建了独立对象,`s2` 直接引用常量池中的字面量,两者地址不同,`s1 == s2` 为 `false`。调用 `s1.intern()` 时,若常量池已有相同内容的字符串,则返回该池中对象的引用,否则将其加入池中。因为常量池已经存在 `"xiaozou"`,`s3` 获得的正是 `s2` 的引用,故 `s2 == s3` 为 `true`。文章通过源码解释说明了 `intern()` 的工作原理及其在字符串共享中的作用。