面试题答案
一键面试1. 先更新数据库,再删除缓存
- 优点:
- 操作相对简单,在大多数场景下能保证数据一致性。因为先更新数据库保证了数据的持久化存储是最新的,然后删除缓存,使得下一次读取时会从数据库加载最新数据并重新写入缓存。
- 缺点:
- 如果在更新数据库成功后,删除缓存失败,就会导致缓存中的数据为旧数据,从而出现数据不一致。例如网络抖动等原因可能导致删除缓存操作失败。
- 在高并发场景下,可能会出现缓存与数据库短暂不一致。比如在更新数据库和删除缓存之间,有大量读请求进来,这些请求读取到的还是旧的缓存数据。
2. 先删除缓存,再更新数据库
- 优点:
- 能尽快让缓存失效,减少读取旧数据的可能性。在更新数据前先删除缓存,后续请求会去数据库获取最新数据并写入缓存。
- 缺点:
- 如果在删除缓存后,更新数据库失败,此时缓存中已无数据,而数据库中的数据也未更新,可能导致一段时间内业务获取到的数据是缺失的(直到缓存被重新填充)。
- 同样在高并发场景下,存在问题。比如一个写请求删除缓存后,还未来得及更新数据库,此时一个读请求进来,发现缓存不存在,就会从数据库读取旧数据并写入缓存,然后写请求更新数据库,这样就导致缓存中的数据是旧数据,出现数据不一致。
3. 读写锁策略
- 优点:
- 可以有效保证数据一致性。通过读写锁,写操作获取写锁,此时不允许读操作,写操作完成后释放锁;读操作获取读锁,多个读操作可以同时进行,但写操作必须等待所有读锁释放。
- 在一些对数据一致性要求极高的场景下非常适用,能避免并发读写造成的数据不一致问题。
- 缺点:
- 性能会受到一定影响。因为加锁操作会增加系统开销,尤其是在高并发读写频繁的场景下,锁的竞争会比较激烈,导致系统吞吐量下降。
- 实现相对复杂,需要考虑锁的粒度、锁的超时时间等诸多因素,增加了开发和维护的难度。