数据类型
持久化
缓存
缓存问题 | 问题来源 | 解决办法 | |
---|---|---|---|
缓存穿透 | 缓存和数据库都没有数据,而用户不算发起请求。在流量大时,数据库可能会垮掉。或者有心人用该方式对网站进行攻击 | 1. 布隆过滤器【相当于拦截器,在redis之前座一层拦截】2. 设置黑白名单【实时监控,排查请求数据,限制服务】 | |
缓存击穿 | 缓存中没有,但数据库中由数据,这时由于用户特别多,同时读缓存又没有读到的数据,由同时去数据库中去读,引起数据库压力过大。 | 查询同一条数据导致的DB压力大 | 1. 设置热点数据永不过期、2. 动态调整key的过期时长、 3.热点数据仅从二级缓存、4. 设置分布所 |
缓存雪崩 | 缓存中的数据大批量过期,而查询数据量巨大引起的数据库压力过大甚至宕机。 | 不同数据都过期,导致的DB压力大 | 1. 均匀设置过期时间、2. 互斥锁【限制缓存的业务】、3. 双key策略、4. 后台不断更新缓存、5. 请求限流、6. 构建Redis高可用集群 |
如何保证数据一致性
为什么会出现数据不一致
- 在高并发以及多线程的情况下会出现数据不一致,读与缓存的顺序不能保证一直
- 单库产生数据不一致
- 主从同步,读写分离产生数据不一致
解决方案
- 缓存延时双删:先删除缓存,在更新数据库,休眠一会,再次删除缓存。
- 删除缓存重试机制:
- 同步binlog异步删除缓存。
数据淘汰机制
- 从已过期的数据集中 最近最少使用的数据淘汰
- 从已过期的数据集中 将要过期的数据淘汰
- 从已过期的数据集中 任意选择数据淘汰
- 从数据集中 挑选 最近最少使用的数据淘汰
- 从数据集中 挑选 任意选择数据淘汰
- 禁止驱逐数据