18.缓存

Redis最主要三个用途:
1)存储数据(内存数据库)
2)缓存(redis常见场景)
3)消息队列

1.缓存简介

把常用数据放到访问速度更快的地方,这个地方就是缓存;
最常见的是内存作为硬盘的缓存(redis定位);
缓存容量是通常不足,只能放一些热点数据,二八定律;

2.使用场景

通常是使用redis作为数据库的缓存;

如何提高mysql能承担的并发量?
1)开源:引入更多的机器,构成数据库集群;
2)节流:引入缓存,频繁访问的数据放到缓存中,缓存中有了,就不用访问数据库了;

3.缓存更新策略(重点)

1.定期生成

每隔一段时间,更新缓存;
数据哪里来?通过日志统计,然后数据分析而来;

  • 优点:实现起来比较简单,过程更可控(缓存有什么是可以确定的);
  • 缺点:实时性不足,当遇到一些突发事件,平时不常用的词成热词了,这个热词因为更新不及时,缓存命中不了,从而导致数据库压力过大

2.实时生成

如果在redis查到了,就直接返回;没有查到,从数据库查,查到结果也写入Redis;
但是缓存容量是有上限的,因此需要制定缓存淘汰策略;

1)FIFO,先进先出,队列

2)LRU,最久未使用
3)LFU,最近最少访问次数
4)Random,随机淘汰

4.缓存常见问题

1.缓存预热(Cache preheating)
把定期生成和实时生成结合,先统计处高频key,然后导入,避免mysql压力过大。
2.缓存穿透(Cache penetration)

查询的某个key,在redis中没有,mysql中也没有;这个key不会被更新到redis中;
核心问题:如果说这个key后续还要被反复查询,会给mysql带来很大的压力;


发生场景:
1)业务设计不合理
2)开发/运维误操作,把部分数据从数据库上删除了
3)黑客恶意攻击
如何解决:
1)改进业务/加强监控报警,亡羊补牢
更靠谱的方案:
1)如果发现这个key在redis和mysql都不存在,仍然写入redis中,value设置成非法值;
2)引入布隆过滤器,每次查询redis/mysql之前都先判断一下存在性;

**3.缓存雪崩(Cache avalanche)**短时间内,redis上大规模的key失效,导致缓存命中率陡然下降,mysql压力迅速上升,甚至宕机;

发生场景:
1)redis挂了
2)redis正常,但是短时间设置了大量key过期时间相同
解决:
1)加强监控报警,加强redis集群可用性
2)不给key设置过期时间 / 设置的过期时间添加随机因子

4.缓存击穿(Cache breakdown)
热点key突然过期,导致大量请求直接访问数据库,甚至引起数据库宕机;
解决:
1)基于统计的方式发现热点key,设置成永不过期;
2)必要时进行服务降级,访问数据库使用分布式锁,限制同时访问数据库的并发数;

相关推荐
陈皮波比茶5 小时前
Redis学习
数据库·redis·学习
wear工程师9 小时前
Redis 和 MySQL 缓存一致性,延迟双删为什么不是强一致
redis·mysql
李可以量化10 小时前
Redis 从了解到精通(二)下:发布订阅进阶命令、量化场景落地与避坑指南
数据库·redis·python·qmt·ptrade
添砖java‘’10 小时前
Redis中常用数据结构
数据库·redis·缓存
ruleslol12 小时前
redis的持久化
redis
玛丽莲茼蒿15 小时前
Redis(六)—— Redis高级
数据库·redis·缓存
渣渣盟16 小时前
Flink 写入 Redis 实战:数据模型选型、连接池调优与常见坑
大数据·redis·flink
旺旺仙贝呦16 小时前
MySQL__MongoDB__Redis 入门
redis·mysql·mongodb
陈聪.17 小时前
企业级 NoSQL 数据库 Redis 核心知识整理
数据库·redis·nosql
To_OC1 天前
Next.js + Redis 构建笔记系统:Redis Hash 实战与性能优化
redis·后端·next.js