chenjunda
长期主义

redis学习Day1

2025-09-16 redis

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.

< PreviousPost
diary2025-9-17
NextPost >
测试基础
CATALOG
  1. 1. 1.为什么使用redis?
    1. 1.1. 1.1Redis 具备高性能
    2. 1.2. 1.2、 Redis 具备高并发
  2. 2. 2.如何保证 redis 和 mysql 数据缓存一致性问题?
    1. 2.1. 2.1消息队列方案
    2. 2.2. 2.2先更新数据库,再删缓存
  3. 3. 3.缓存雪崩、击穿、穿透是什么?怎么解决?
    1. 3.1. 3.1是什么
    2. 3.2. 3.2怎么解决