Redis 学习笔记(二)——相关问题


1、缓存雪崩

  问题描述:在原缓存数据失效,而新缓存数据未到位期间(例如:当设置缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期),此时所有原本应该访问缓存的请求都去查询数据库了,从而对数据库 CPU 和内存造成巨大压力。
  解决方法:

  • 方法一,对访问数据库的代码块使用加锁或队列的方式避免大量线程同时访问数据库,这种方法会造成大量线程排队阻塞,并不会提高系统吞吐量,在高并发场景中很少使用。
  • 方法二,利用随机值等方式为不同的 key 设置不同的失效时间,尽量使失效时间均匀分布。
  • 方法三,二级缓存,设置 A1 为主缓存,A2 为副缓存,A1 的失效时间设置为短期,A2 为长期,当 A1 失效时,线程可以先去访问 A2。
  • 方法四,为每一个缓存数据都对应一个标志(该标志实质上也是缓存系统中一个数据),设置标志的过期时间小于对应数据的过期时间。这样,当查询该数据时,若发现标志已过期,则提前去更新该数据(可先将老数据给用户)。

2、缓存穿透

  问题描述:线程查询某个数据时,数据库并不存在该数据,自然缓存中也不会有该数据,导致线程每次查询时,在缓存中找不到,都会再去数据库中查一次。
  解决方法:

  • 方法一,布隆过滤器,将所有存在的数据哈希到一个足够大的bitmap中,查询不存在的数据会被bitmap拦截,从而避免对底层存储系统的压力。
  • 方法二,若一次查询的返回为空,仍然将这个“空值”进行缓存(但一般设置很短的过期时间),这样下次再查询就可以从缓存中读到空值,不会再继续访问数据库。

3、缓存预热

  系统上线后,可以选择将缓存数据直接加载到缓存系统中,避免用户第一次请求时总是先查询数据库,再缓存数据。

4、redis 为什么这么快

  • 基于内存,绝大部分请求是纯粹基于内存的操作,速度快;
  • 数据结构简单,所以对数据的操作也简单快速;
  • 网络请求模块采用单线程模式,避免了不必要的上下文切换和竞争条件;
  • 使用多路 I/O 复用模型,非阻塞 IO。

  需要注意的是,redis 的单线程只是说网络请求模块的单线程的。同时 redis 使用了多路 I/O 复用模型,多路 I/O 复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流)。这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络 IO 的时间消耗),且 redis 在内存中操作数据的速度非常快,也就是说内存内的操作不会成为影响 redis 性能的瓶颈,主要由以上几点造就了 redis 具有很高的吞吐量。
在这里插入图片描述


参考链接

https://www.toutiao.com/a6533812974807679495

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值