面试题答案
一键面试锁的粒度控制
- 提高系统性能:
- 细化锁粒度:对于不同的数据操作范围,采用更细粒度的锁。例如在电商系统中,对每个商品库存操作使用单独的锁,而不是对整个库存数据使用一把锁。这样多个线程可以同时操作不同商品库存,提高并发性能。
- 避免不必要锁:分析业务逻辑,对于一些不需要强一致性的操作,可不加锁。如浏览商品列表,不涉及数据修改,无需加锁,从而提升系统整体性能。
- 处理锁冲突:
- 减少锁竞争:细粒度锁使得多个线程竞争同一把锁的概率降低。当只有少量线程操作同一数据时,锁冲突的可能性减小。
- 适用性:适用于数据结构可细分且不同部分操作相对独立的场景,如电商商品库存管理、用户信息独立模块管理等。
- 局限性:锁管理复杂度增加,需要更多的系统资源来维护众多细粒度锁,可能导致额外开销。如果业务操作涉及多个细粒度锁的联合操作,可能会引发死锁问题。
锁的过期时间优化
- 提高系统性能:
- 合理设置过期时间:根据业务操作的平均耗时,设置适当的锁过期时间。例如对于一个一般在500ms内完成的数据库更新操作,将锁过期时间设为1s,既能保证操作有足够时间完成,又不会长时间占用锁资源。
- 动态调整过期时间:根据系统负载情况动态调整。在业务低峰期,可适当延长过期时间以减少锁频繁获取释放带来的开销;在高峰期,缩短过期时间以提高锁的利用率。
- 处理锁冲突:
- 避免死锁:如果一个线程获取锁后因异常未释放锁,设置过期时间可使锁自动释放,其他线程有机会获取锁,避免死锁。
- 适用性:适用于对一致性要求不是特别高,允许在锁过期后数据有短暂不一致情况的场景,如一些实时性要求不高的统计数据更新场景。
- 局限性:如果过期时间设置过短,可能导致操作未完成锁就过期,引发数据不一致问题;如果设置过长,在高并发下会影响锁的竞争效率,导致性能下降。
缓存预热
- 提高系统性能:
- 提前加载数据:在系统启动或业务低峰期,将热点数据加载到Redis缓存中,并为其设置读写锁。这样在高并发请求到来时,大部分请求可直接从缓存获取数据,减少数据库压力,提高系统响应速度。
- 降低锁竞争:由于热点数据已在缓存中,减少了首次访问时因从数据库加载数据而产生的锁竞争。
- 处理锁冲突:
- 减少锁等待时间:提前加载数据使得锁获取更顺畅,减少了线程等待锁的时间,降低锁冲突的影响。
- 适用性:适用于有明显热点数据且数据更新频率较低的场景,如新闻网站的热门新闻展示、电商平台的热门商品信息展示等。
- 局限性:需要提前预估热点数据,若预估不准确,可能导致缓存资源浪费或热点数据未被缓存。同时,对于数据更新频繁的场景,缓存预热后的数据很快失效,需要频繁更新缓存,增加维护成本。