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

相关推荐
程序猿乐锅1 小时前
【黑马点评 | 第一篇】从 Session 到 Redis+Token 的改造与拦截器实现
数据库·redis·缓存
野生技术架构师2 小时前
Redis Hot Key 与 Big Key:危害、发现与解决方案
数据库·redis·缓存
学渣超2 小时前
从一次早高峰数据库告警说起:你真的理解缓存该如何落地应用吗?
redis·后端·架构
程序员清风4 小时前
Python 操作 MySQL、Redis 与消息队列的完整实践
redis·python·mysql
momo0611717 小时前
Redis新手入门 -- 学习笔记
redis·后端
吃饱了得干活1 天前
Redisson 进阶实战:看门狗机制与分布式锁完全指南
java·redis·后端
我是苏苏1 天前
Redis开发09:Windows系统下主从复制的配置教程
数据库·redis·缓存
写后端的胖头鱼1 天前
【高频面试题】如何找出redis中的慢查询记录
redis·慢日志
彧azz2 天前
Redis 全面指南:从核心概念到高可用架构实战
数据库·redis·架构
香菜TTT2 天前
Redis的哨兵机制
java·数据库·redis