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

相关推荐
知我Deja_Vu5 天前
redisCommonHelper.generateCode(“GROUP“),Redis 生成码方法
数据库·redis·缓存
Charlie_lll5 天前
Redis脑裂问题处理——基于min-replicas-to-write配置
redis·后端
奇点爆破XC5 天前
Redis迁移
数据库·redis·bootstrap
断手当码农5 天前
Redis 实现分布式锁的三种方式
数据库·redis·分布式
菜鸟小九5 天前
redis原理篇(基本数据结构)
数据结构·数据库·redis
没有bug.的程序员5 天前
电商秒杀系统深度进阶:高并发流量建模、库存零超卖内核与 Redis+MQ 闭环
数据库·redis·缓存·高并发·电商秒杀·流量建模·库存零超卖
菜鸟小九5 天前
redis原理篇(五种数据结构)
数据结构·数据库·redis
初次攀爬者5 天前
Redis分布式锁实现的三种方式-基于setnx,lua脚本和Redisson
redis·分布式·后端
June`5 天前
Redis缓存深度解析:20%数据应对80%请求
数据库·redis
m0_738120725 天前
应急响应——Solar月赛emergency靶场溯源过程(内含靶机下载以及流量分析)
java·开发语言·网络·redis·web安全·系统安全