Reids 缓存面试常问:击穿、穿透、雪崩、分布式锁、API

image.png

缓存击穿

  • key 存在,但正好在过期的时候高并发,使得大量访问压到数据库

  • 使用 setnx() -> 会有锁,第一个获取锁的人会去更新 key,以至于后面的都会 get 到新的 value

  • setnx()

    • get key

    • setnx

      • ok, 去 DB 获取

      • false, sleep

  • 问题:

    • 如果第一个挂了怎么办?-> 可以设置锁的过期时间

    • 没挂,但是,锁超时了 -> 多线程:一个线程取 DB,一个线程监控是否取回来,更新锁时间

image.png

缓存雪崩

  • key 存在,在同一时点大量 key 同时失效,使得大量访问压到数据库

  • 如果没有时点性的限制(时点性无关),可以随机过期时间

  • 如果时点性有要求

    • 业务层加判断零点延时

    • 强制依赖击穿方案

image.png

缓存穿透

  • key 不存在,在数据库也不存在,使得大量访问压到数据库

  • 布隆过滤器

    • client 实现

    • 算法 bitmap -> redis (无状态)

    • redis 集成布隆

  • 布隆过滤器只能增加不能删除 key,可以使用布谷鸟过滤器等支持删除的过滤器代替,或做一个空 key

image.png

分布式锁

  • 步骤

    • setnx

    • 过期时间

    • 多线程(守护线程)延长过期

  • redisson

  • zookeeper 做分布式锁

image.png

API

  • Spring Boot

  • Spring Data Redis

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容