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)必要时进行服务降级,访问数据库使用分布式锁,限制同时访问数据库的并发数;

相关推荐
曾经的三心草2 小时前
redis-9-哨兵
数据库·redis·bootstrap
张小凡vip2 小时前
Kubernetes--k8s中部署redis数据库服务
redis·kubernetes
惊讶的猫3 小时前
Redis持久化介绍
数据库·redis·缓存
啦啦啦_99995 小时前
Redis-5-doFormatAsync()方法
数据库·redis·c#
生产队队长5 小时前
Redis:Windows环境安装Redis,并将 Redis 进程注册为服务
数据库·redis·缓存
xu_yule6 小时前
Redis存储(15)Redis的应用_分布式锁_Lua脚本/Redlock算法
数据库·redis·分布式
清风拂山岗 明月照大江8 小时前
Redis笔记汇总
java·redis·缓存
消失的旧时光-194310 小时前
第十四课:Redis 在后端到底扮演什么角色?——缓存模型全景图
java·redis·缓存
消失的旧时光-194311 小时前
第十四课 · 实战篇:Redis 缓存系统落地指南(Spring Boot 从 0 到可用)
spring boot·redis·缓存
飞升不如收破烂~12 小时前
Redis 分布式锁+接口幂等性使用+当下流行的限流方案「落地实操」+用户连续点击两下按钮的解决方案自用总结
数据库·redis·分布式