这是我参与更文挑战的第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设置不同的超时时间。
强依赖于穿透解决方案,增加互斥锁,控制数据库请求。
关键词:不同超时时间、互斥锁