这是我参与「第五届青训营 」伴学笔记创作活动的第 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做变更操作时,不同步变更缓存,而是删除缓存中的对应条目
该策略又可以细分为「读策略」和「写策略」
-
写策略
更新数据库中的数据; 删除缓存中的数据。
-
读策略的步骤:
读取的数据命中了缓存,则直接返回数据;
如果读取的数据没有命中缓存,则从数据库中读取数据,然后回写到缓存,
最后返回数据给用户
写策略的两种顺序(下回)