Redis 知识整理
1、 redis 内存模型
、单线程
、Redis性能高的原因
。
- Redis指令处理逻辑
1
2
3
4
5
6
7
8
9
10
11Redis 基于Reactor模式开发了一个名为 File Event Handler 的网络事件处理器;
这个事件处理器是单线程的,所以称Redis 是单线程的。
Redis 核心是通过IO多路复用的方式监听多个socket,并根据socket传输的事件类型将
事件分发给不同的事件处理器处理。
Redis的核心模块包含四个:被监听的多个Socket、IO多路复用程序、事件分派器、事件处理器。
IO多路复用程序通过将会将有事件的多个socket 放入队列,每次取出一个socket,
并根据事件类型通过事件分派器将事件分给对应的事件处理器处理;每次处理一个,处理完一个取一个;
以上,便是redis处理命令的基本逻辑。 - 高性能原因:
1
2
3
4
5而 Redis 性能高的原因可以分为以下三点:
1、纯内存操作
2、采用非阻塞的IO多路复用所以快
3、单线程方式由于没有多线程方式需要来回切换上下文的操作,所以快。
2、 缓存的三大问题 缓存雪崩、缓存击穿、缓存穿透
与解决办法
- 缓存雪崩:缓存在某段时间内大面积失效,后面的请求都落在db上,导致数据库短时间承受大量请求进而崩溃。
- 解决办法(4个)
- 将缓存的过期时间设置的随即些,以防止缓存同一时间大面积失效。
- 在缓存中追加缓存字段,当缓存失效,则更新缓存。
- 缓存预热(即,针对项目启动时,缓存中无数据的场景,此时应从数据库中取出数据使用并缓存,而后的请求便可以直接使用缓存数据)。
- 使用互斥锁。(即保证接受到多个请求时,只有一个请求操作缓存,当缓存失效取出db中的数据以更新缓存;之后的请求,可以使用缓存)。
- 解决办法(4个)
- 缓存击穿:
1
2
3缓存中不存在数据,数据库中存在数据,而并发用户数增加,同时请求某一条这样的数据,同时从缓存中未取到数据,又同时从数据库中取,进而导致数据库
短时间接受的请求增多,压力增大;
缓存击穿 说的是针对同一数据的并发量增大,导致db压力增大;缓存雪崩 说的是不同数据同时国旗,导致db接受请求增多,压力增大。- 解决办法(2个):
- 将热数据的有效期设为永不过期
- 使用互斥锁。
- 解决办法(2个):
- 缓存穿透:缓存中无数据,数据库中也无数据,此时所有的请求均落在db上,导致数据库承受大量请求进而崩溃
- 解决办法(3个):
- 接口层增加逻辑校验,例如权限校验、id!<=0 等,以期望拦截无效请求。
- 针对 缓存、db都没有的数据,以key-null 的形式缓存;并设置较短的有效期(太长可能会影响性能)。
- 使用布隆过滤器,即将所有可能的数据hash并放入足够大的bitmap;接受到请求后,判断请求对应的hash是否在bitmap中,如果没有则拦截( 有请求,必有hash在bitmap,有hash 在bitmap
不一定有数据,原因:hash算法存在hash碰撞(即:不同的数据,hash后的值可能存在相同))
- 解决办法(3个):
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.