Redis击穿、雪崩和穿透知识科普

181 阅读3分钟

这是我参与更文挑战的第16天,活动详情查看: 更文挑战

Redis是什么?

运行速度很快,并发很强的一种非关系性数据库,是一个通过ANSI C语言编写的开源、支持多种数据结构、可选持久化的键值对存储数据库。

特点:

  • C/S通讯模型
  • 单进程单线程模型
  • 丰富的数据类型
  • 操作具有原子性
  • 持久化
  • 高并发读写
  • 支持lua脚本

哪些场景可以应用到redis?

热点数据存储(多读少写)、计数器、消息队列系统、临时数据标记。

主要的数据类型?

String类型、哈希类型、List列表、Set集合类型和顺序集合类型。

为什么用redis?

提高访问效率。针对一些不常变动,或者使用时间超短的数据,可以加入到缓存中,获取时先判断缓存中是否有数据,有就直接从缓存中拿到,为空才去数据库里面拿,并将数据放到缓存里面。

吃透redis的穿透、击穿和雪崩?
redis穿透

这可以看成是一个性能问题,遇不到好说,遇到就是崩溃。

它是说客户持续向服务器发起对不存在服务器中数据的请求。客户先在Redis中查询,查询不到后去数据库中查询。

例如像黑客攻击redis,发出了1000个请求,但是这1000个请求的key值都不存在,就会导致查询进到数据库里,这就会发生穿透。

怎么解决?

redis是单线程,即使在高并发也是一个一个解决的,当第一个请求进来时,发现key不存在,此时用多线程,一个去查数据库,并用分布式setnx对key上锁,并设置锁的过期时间,另外的线程去监控这个锁,如果锁的失效时间到了,还没有获取数据,那么就延迟锁的过期时间。然后如果查到数据了就塞到redis中,当锁的过期时间到了之后,就在一个请求进来。

关键词 :分布式锁、过期时间、多线程。

redis击穿

击穿像是穿透和雪崩的中和,是说有一个热点key非常受欢迎,大家都喜欢访问他,当高并发时大量用户都去请求这个key,此时key失效了,那么大量请求就会落到数据库上,把数据库击穿。

这种情况怎么解决,当然是希望这个热点key永久有效就最好了

关键词:布隆过滤器。

redis雪崩

是说大量的redis数据同一时间失效,造成大量的访问打到DB上。

怎么解决?

避免缓存集中失效,不同的key设置不同的超时时间。

强依赖于穿透解决方案,增加互斥锁,控制数据库请求。

关键词:不同超时时间、互斥锁