Redis

Redis的数据类型

1.Redis支持5种核心的数据类型,分别是字符串哈希列表集合有序集合

2.Redis还提供了Bitmap、HyperLogLog、Geo类型,但这些类型都是基于上述核心数据类型实现的;

 

Redis单线程为什么这么快?

1.单线程避免了多线程之间切换和竞争产生的消耗

2.大部分操作都是在内存上完成的(高性能的重要原因)

3.采用IO多路复用,使其在网络IO操作中能处理大量的客户端请求,实现高吞吐量

Redis的缓存雪崩、穿透和击穿

雪崩 针对所有的请求,本来缓存可以抗住高峰期大量请求,但缓存发生意外,导致所有请求落在数据库上
穿透 针对黑客攻击,发出大量数据库不存在的请求,绕过缓存,落在数据库上导致崩溃
击穿 针对单一的热点key请求,缓存故障后,相同一摸一样的请求落在数据上

 

缓存雪崩

缓存本来可以抗住高峰期的大量请求、但缓存机器发生意外全盘宕机,导致大量请求全部落在数据库,数据库崩溃。

解决方案:

1、限流组件、设置每秒的请求,允许一部分的请求落在数据库,剩余未通过的请求降级,或者返回一些空值或者友情提示。

 

缓存穿透

客户端请求缓存和数据库中不存在的数据,导致所有请求打在数据库

解决方案:

1、如果是相同的不存在请求,在数据库中只要没查到,就写一个空值到缓存里,然后设置一个过期时间,这样相同的key来访问时,在缓存失效前就可以直接从缓存中取数据(但是这种对长时间且每次请求不一样的攻击不管用)

2、做好参数检验,对于不合理的参数要及时return结束

3、(经常做法)设置布隆过滤器,将数据库中所有可能的数据哈希映射到布隆过滤器中,然后对每个请求进行判断:

    请求的数据不存在于布隆过滤器中,可以确定数据一定不在数据库中,系统可以立即返回不存在

    请求的数据存在于布隆过滤器中,则继续再向缓存中查询。

 

缓存击穿

某个key特别热点,访问非常频繁,当这个缓存key在失效的瞬间,大量的请求就击穿了缓存,直接请求数据库,就像是在数据库中击穿了一个洞

解决方案:

1、如果缓存的数据基本不更新,可以将热点数据设置为永不过期

2、如果缓存数更新不频繁,并且缓存刷新时间耗时较少,可以利用redis等分布式中间件的分布式互斥锁,保证只有少量的请求能够请求数据库并且重新构建缓存,其余线程在锁释放后访问新缓存。

3、如果缓存更新频繁并且耗时较长,可以利用定时线程在缓存过期前主动的重新构建缓存或者延后缓存的过期时间,保证所有的请求能一直访问到对应的缓存

posted @ 2023-02-23 12:54  _Judge  阅读(67)  评论(0)    收藏  举报