redis学习(5) | 青训营笔记

85 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 13 天

缓存

缓存预热

将数据从DB加载到cache,加载方式:

  • 系统启动时
  • 定时

过期键的删除策略

  • expire 字典 (ptr to all expire keys, timestamp)

    定期定量扫描expire 字典 删除,可平衡CPU和内存的资源使用

  • 惰性删除,推迟到访问key时,判断过期并删除,对内存不友好

缓存更新

更新,意味保持cache和db的一致性

  • 写请求

    每次写数据都更新cache,强一致性

  • 读请求

    读的时候,先判断缓存是否存在或过期,来进行更新

  • 定时更新

    适合数据少的应用

  • 过期更新

    定时的 将缓存中 expire 数据更新

缓存淘汰策略

超出存储时的

  • FIFO

    first in first out,最早载入缓存的

  • LRU

    least Recently used,最长时间没有访问的

  • LFU

    least Frequently used,使用次数最少的,即 冷键

缓存雪崩、缓存穿透、缓存击穿

概念

  • 缓存key大面积失效,缓存 数据库都没有的Key,缓存没有 但数据库有的Key
  • 同一时间高并发访问,导致请求集中导向DB,使得DB崩溃

解决

  • 给缓存设置不同过期时间;缓存预热;请求加互斥锁,进行排队
  • 缓存设置空值;布隆过滤器,过滤不存在的key;接口层面过滤
  • 设置不过期的热Key;加互斥锁

和Mysql保持数据一致性

cache-aside 策略

对DB做变更操作时,不同步变更缓存,而是删除缓存中的对应条目

该策略又可以细分为「读策略」和「写策略」

  • 写策略

    更新数据库中的数据; 删除缓存中的数据。

  • 读策略的步骤:

    读取的数据命中了缓存,则直接返回数据;

    如果读取的数据没有命中缓存,则从数据库中读取数据,然后回写到缓存,

    最后返回数据给用户

写策略的两种顺序(下回)