Redis & RabbitMQ
2020-08-05 14:07:02 32 举报
redis
作者其他创作
大纲/内容
求交集,并集,差集(共同关注)
Redis单线程为什么这么快?
秒杀正常情况
setnx+expire
雪崩场景:正常情况下秒杀时有6000个请求过来,redis能处理5000个,mysql真正处理的也就1000个请求,但是现在Redis中的key全部失效,这6000个请求会直接打在数据库上,它会直接挂掉穿透场景:恶意用户不断发起请求,请求缓存和数据库中都不存在的数据,会导致数据库压力过大而挂掉击穿场景:大并发集中对这一个点进行访问,这个key失效的瞬间,持续的大并发击破缓存,直接请求数据库。----------------------------------------------------------------雪崩解决方案 :1 在批量往Redis中存数据的时候设置每个key的失效时间为1个随机值,可以保证数据不会同一时间大面积失效。 2 设置热点数据永不过期----------------------------------------------------------------穿透解决方案: 1 在接口层增加参数校验,不合法的参数直接return。 2 数据库和缓存中都没有的数据,将这个key对应的value值写为空,下次再访问这个key就返回null。 3 网关层nginx也可以配置单个IP每秒最高访问次数 4 布隆过滤器利用高效的数据结构和算法快速判断出这个key是否在数据库中存在-----------------------------------------------------------------击穿解决方案:1,设置热点数据永不过期
定期删除
Sentinel(哨兵)三节点实现故障转移选取新的master
单线程避免了多线程环境下的上下文切换,还有加锁解锁带来的性能消耗,也不会出现死锁问题
false
Redis
同一时刻只有一个系统实例通过Zookeeper获取分布式锁,然后操作某个key
Set
主从同步:多个redis实例实现读写分离
命令回复处理器
下单系统
Hash
redis的持久化(4.0以后默认是AOF+RDB)
1,启动一个slave是,它会发送一个命令给master
Redis基本数据类型
命令请求处理器
优点:rdb直接写内存,文件小恢复快缺点:全量同步会产生大量的IO操作影响性能redis挂掉后会丢失数据
用作缓存,共享用户session
poll
RabbitMQ
List
根据Socket上的事件来选择对应的事件处理器进行处理
每隔10秒看一下,如果还持有锁,就延长时间
Redisson实现的分布式锁
基于纯内存操作,数据都存在内存中,内存读写速度是非常快的
查询时判断过期就删除
用作异步队列,rpush生产消息,lpop消费消息
线程1(getLock())
Redisson
优点:数据可读性高,数据不易丢失缺点:,文件体积大,回放和执行操作日志导致恢复时间长
没有数据去数据库中查
缓存雪崩
线程2
allkeys-lru回收最近最少使用的键
Redis的性能瓶颈不在CPU,而是在机器内存和网络带宽上,单线程容易实现。
用户
使用IO多路复用程序监听多个Socket
while循环,不断重试
多个socket连接复用一个线程,redis底层封装了像epoll这样io多路复用函数
Redis原生分布式锁
查到数据存入缓存
redis
存对象
采取了IO多路复用技术,可以处理并发的连接
true
能否加锁
惰性删除
select
Redis的线程模型
Redis集群高可用
mysql
通过lua脚本
epoll
删除锁lock.unlock()
文件事件处理器(单线程)
数据结构简单key-value类型数据查找效率高
AOF
内存淘汰
连接应答处理器
Redis的过期策略
只是网络请求模块使用了单线程(文件事件处理器),一个线程处理所有网络请求,保证了每个操作的原子性
如果slave第一次连接master
保存写操作日志
保存某一时刻的内存快照
原理:fork一个子进程非阻塞
微博热搜榜,优先级队列
原理:fork子进程进行rdb操作
Redis分布式锁
加锁lock.lock()
开源框架,业务逻辑封装在一个lua脚本中然后交给redis去执行,保证了原子性
将用户socket对应的文件描述符注册到epoll,epoll监听哪些socket上有消息到达
触发RDB,master启动一个线程生成RDB快照。同时master把新的请求缓存在内存中。master将RDB发送给slave,salvage拿到RDB会写进磁盘,加载进内存,master把内存中的新数据都发给slave
String
key全部失效
watch dog
默认100ms随机抽取一些设置了过期事件的key,过期了就删除
SortedSet
RDB
加锁成功
有数据
将这些监听到的消息压入一个队列,根据消息类型调用不同的事件处理器
Zookeeper
0 条评论
下一页