1.为什么使用redis?
1.1Redis 具备高性能
操作数据库是在硬盘上操作,但是操作redis就可以直接读取缓存,是在内存中操作的
1.2、 Redis 具备高并发
单台设备的 Redis 的 QPS(Query Per Second,每秒钟处理完请求的次数) 是 MySQL 的 10 倍,Redis 单机的 QPS 能轻松破 10w,而 MySQL 单机的 QPS 很难破 1w。
2.如何保证 redis 和 mysql 数据缓存一致性问题?
2.1消息队列方案
我们可以引入消息队列,将第二个操作(删除缓存)要操作的数据加入到消息队列,由消费者来操作数据。
- 如果应用删除缓存失败,可以从消息队列中重新读取数据,然后再次删除缓存,这个就是重试机制。当然,如果重试超过的一定次数,还是没有成功,我们就需要向业务层发送报错信息了。
- 如果删除缓存成功,就要把数据从消息队列中移除,避免重复操作,否则就继续重试。
重试删除缓存机制还可以,就是会造成好多业务代码入侵。
2.2先更新数据库,再删缓存
「先更新数据库,再删缓存」的策略的第一步是更新数据库,那么更新数据库成功,就会产生一条变更日志,记录在 binlog 里。
于是我们就可以通过订阅 binlog 日志,拿到具体要操作的数据,然后再执行缓存删除,阿里巴巴开源的 Canal 中间件就是基于这个实现的。
Canal 模拟 MySQL 主从复制的交互协议,把自己伪装成一个 MySQL 的从节点,向 MySQL 主节点发送 dump 请求,MySQL 收到请求后,就会开始推送 Binlog 给 Canal,Canal 解析 Binlog 字节流之后,转换为便于读取的结构化数据,供下游程序订阅使用
3.缓存雪崩、击穿、穿透是什么?怎么解决?
3.1是什么
缓存雪崩:
是指大量缓存数据在同一时间集体失效,或者redis挂了,导致大量请求访问到数据库,导致数据库压力过大崩溃
缓存击穿:
是指某一个热点key过期后,大量该key的请求访问到数据库,导致数据库压力过大,
缓存穿透:
是指该请求在redis缓存中找不到,然后在数据库中也找不到,这样的无效请求大量请求过来,对数据库造成攻击
3.2怎么解决
缓存雪崩怎么解决:
- 均匀设置过期时间:如果要给缓存数据设置过期时间,应该避免将大量的数据设置成同一个过期时间。我们可以在对缓存数据设置过期时间时,给这些数据的过期时间加上一个随机数,这样就保证数据不会在同一时间过期。
缓存击穿怎么解决:
方法一:使用锁来解决,当一个线程到达热点key的时候,就去获取锁,然后后面的线程只有锁释放的时候才能继续访问
方法二:设置逻辑过期时间,实际过期时间设置为永不过期,当一个线程获得锁的时候,开启额外线程,完成数据重构的操作,其他的线程在没有获得锁的时候,只返回旧数据,好处是不用让那么多线程等着了,效率会变高,但缺点是返回的数据不能保证高度一致
缓存穿透怎么解决:
**缓存空对象思路分析:**当我们客户端访问不存在的数据时,先请求redis,但是此时redis中没有数据,此时会访问到数据库,但是数据库中也没有数据,这个数据穿透了缓存,直击数据库,我们都知道数据库能够承载的并发不如redis这么高,如果大量的请求同时过来访问这种不存在的数据,这些请求就都会访问到数据库,简单的解决方案就是哪怕这个数据在数据库中也不存在,我们也把这个数据存入到redis中去,这样,下次用户过来访问这个不存在的数据,那么在redis中也能找到这个数据就不会进入到缓存了
**布隆过滤:**布隆过滤器其实采用的是哈希思想来解决这个问题,通过一个庞大的二进制数组,走哈希思想去判断当前这个要查询的这个数据是否存在,如果布隆过滤器判断存在,则放行,这个请求会去访问redis,哪怕此时redis中的数据过期了,但是数据库中一定存在这个数据,在数据库中查询出来这个数据后,再将其放入到redis中,
假设布隆过滤器判断这个数据不存在,则直接返回
这种方式优点在于节约内存空间,存在误判,误判原因在于:布隆过滤器走的是哈希思想,只要哈希思想,就可能存在哈希冲突
Author: chenjunda
Link: http://example.com/2025/09/16/redis%E5%AD%A6%E4%B9%A0Day1/
Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.