分布式缓存
2024-03-26 16:46:33 0 举报
分布式缓存知识点
作者其他创作
大纲/内容
为什么要用缓存
高性能
高并发
缓存走的是内存
常见的缓存问题
读写不一致
缓存雪崩
缓存穿透
缓存并发竞争
redis
redis和memcached的区别
redis支持的数据结构较多,可以支持更多场景
性能对比:小数据redis,大数据memecached
集群模式:memecached没有原生的集群模式,redis官方支持
redis的线程模型
核心是文件事物处理器
如果客户端连接redis,那么socket会关联连接应答处理器
如果客户端往redis写数据,那么socket会关联命令请求处理器
如果客户端从redis读数据,那么socket会关联命令回复处理器
客户端与redis之间的一次通讯
1、在redis初始化的时候,redis会将连接应答处理器和RE_READABLE事件关联起来,当客户端跟redis进行连接,会生成一个RE_READABLE事件,这个事件经过IO多路复用器的监听将事件放到队列中,被文件事件分派器分派给连接应答处理器进行关联,从而创建和这个客户端对应的socket,并将这个socket和RE_READABLE关联起来。
2、当客户端想redis发起请求的时候(读或写),会找到对应的socket进行连接,这个socket将生产一个RE_READABLE事件,这个事件会被IO多路复用器监听到,将其放到队列中,被文件事件分派器分派给命令请求处理器,命令请求处理器会根据这个socket中的相关数据进行执行和处理(内存中)。
3、当redis中将返回的数据准备好,就会生成一个RE_WRITEABLE事件,经过上述步骤,被文件事件分派器分派到命令回复处理器,命令回复器会对对应socket输出内容,最后会删除socket上RE_WRITEABLE事件和命令回复器之间的关联。
为什么单线程的redis比多线程的memecahed效率高?
纯内存操作。
核心是非阻塞IO,IO的多路复用机制。
单线程避免了多线程上下文频繁切换带来的问题。
redis有哪些数据类型?
string
hash
list
set
sorted set
redis过期策略
根据数据的重要程度,设置过期时间
redis删除数据--定期删除和惰性删除
定期删除时redis每个100ms,就会随机抽取(不是去便利全部的key)一些过期时间的key,检查是否过去,过期就删除。
惰性删除:在取某个key的时候,redis会检查一下,这个key设置的过期时间是否过期,如果过期了将其删除。
内存淘汰(存在大量redis堆积,导致redis内存快要耗尽)
noeviction:当内存不足已重新写入时,新写入操作报错。
allkeys-lru:当内存不足已重新写入时,在键空间中,移除最近最少使用的key。
allkeys-random:当内存不足已重新写入时,在键空间中,随机移除key。
volatile-lru:当内存不足已重新写入时,在设置了过期时间的键空间中,移除最近最少使用的key。
volatile-random:当内存不足已重新写入时,在设置了过期时间的键空间中,随机移除key。
volatile-ttl:当内存不足已重新写入时,在设置了过期时间的键空间中,有更早设置过期时间的key移除。
如何保证redis高并发和高可用?redis的主从复制原理?redis哨兵模式原理?
读写分离,写的数据操作走master-redis,然后将数据复制到slave,读的操作走slave-redis;(一主多从)可以水平扩容
master必须开启持久化开启RDB和AOF
replication(复制)核心机制
reids 采用异步的方式复制到slave节点,从2.8开始,slave node 会周期性的确认自己每次复制的量
slave node可以链接其他的slave node
slave node 做复制的时候,是不会被block master node的正常工作的
slave node在做复制的时候,也不会block对自己的查询操作,他会用旧的数据集来提供服务,但是完成复制的时候,需要删除旧的数据集,加载新的数据集,这个时候就会暂停对外界的服务了
slave node主要作用是用来做横向扩容的,增加读的承载力
主从复制架构核心原理
当slave node 第一次链接时会触发一个全量复制,master node 会生成一个rdb的快照,,将rdb中的数据全部复制到slave node中,后续如果再链接就是复制部分数据
主从复制断点续传
master node 会在内存中维护一个backlog,master 和 slave都会保存一个replica offset还有一个master id(run id) ;如果master和slave网络断掉了,slave会让master从上次relica offset开始继续复制,如果没有找到对应的offset或者runid不一致就会执行一次全量复制。
全量复制
master执行一个bgsave操作,在本地生成一份rdb快照
master node 将rdb快照文件发送给slave node,如果rdb复制时间超过60s(repl-timeout),那么slave node 就会认为复制失败,所以根据需求可适当调大这个参数。
master node 在生成rdb时,会将所有新写的命令缓存在内存中,在slave node保存了rdb后,再将新的写命令复制给slave node.
client-output-buffer-limit slave 256m 64m 60,如果再复制期间写入文件大小一下超过256m或者在60s内大小持续超过64m就会停止复制,认为复制失败
slave node 接受到rdb文件后,后将该文件内容写道自己的内存中,在复制期间会基于旧的数据版本对外提供服务
果如slave node开启了AOF,那么会立即执行bgrewriteaof,重写AOF
无磁盘化复制
master再内存中直接创建rdb,然后发送给slave,不会落在自己的磁盘上
过期key处理
slave不会去过期key,如果key过期由master告诉slave将数据给删了,模拟一条del命令给slave
哨兵模式
只保证高可用,不保证数据不丢,主备切换
异步复制导致数据丢失
集群脑裂-》master主节点,出现了异常性,导致出现了两个master,这种请况也会导致数据丢失;某个master突然应为网络原因脱离了正常网络,跟其他的slave node 链接不上,但其实maste node其实还存活着,此时哨兵可能就认为master宕机了,开始进行选举,将其他的slave node 选举为master node,这个时候就有两个master了,这就是脑裂。
解决异步复制和脑裂数据丢失
min-slave-to-write 1
min-slaves-max-log 10 超过10s就停止对外部写入redis,由client端做降级处理写入到磁盘中,如果数据量很大,再做降级处理用限流处理。
脑裂的化:就是当master无法像slave同步数据超过10s就拒绝客户端的写入操作,后续流程和上述一样。
sdown和odown(主观宕机和客观宕机)
sdown是只要有一个哨兵觉得master宕机了,那就会去选举新的master;odown是必须要所有的哨兵(qorum定义的哨兵数量)都觉得master宕机了,才会去选举新的master
slave和master的选举算法
1、每个slave跟master断开连接的时间长度:如果一个slave和master断开连接已经超过了:down-after-millseconds的10倍,外加master的宕机时长,那么slave就会认为不适合选举为master
2、slave优先级:slave priority越低,优先级越高
3、复制offset:如果优先级一样,那么就要看replica offset,那个offset越靠后,那么优先级就越高
4、slave的run id:如果以上两个条件都一样,那么就选择一个run id较小的slave
redis持久化
RDB和AOF
RDB持久化机制,对redis中的数据执行周期性的持久化
AOF机制对每条写入命令作为日志,来一条写一条 redis-> os cache ->AOF,内存的大小是一定量的,当数据到一定大小的时候,redis就会用缓存淘汰算法LUR,自动将一部分数据从内存中清除(不常用的)。
AOF是存放每条写入命令的,所以是会不断膨胀的,当到一定大小时,AOF会做rewrite操作:基于当时redis内存中的数据,重新构造一个更小的AOF文件,然后将膨胀到很大的AOF删除
RDB和AOF优略势对比
RDB对比优点
RDB适合做全量做冷备份,会生成多个文件,每个文件代表一个时间的数据,AOF需要自己每隔一段时间去copy一份出来
在做恢复得时候RDB就是一些数据可以直接加载到redis的内存中恢复比较快,AOF是一条条的指令,需要回放执行所有的指令日志
RDB每次写都是写到内存中,然后每隔一段时间再写到磁盘上,AOF是每次都要写到文件
RDB缺点
会有丢失数据的问题存在
RDB再fork子进程执行RDB快照文件时,如果文件过大,会导致对外提供服务暂停几秒
AOF优点
更好的保护数据
AOF缺点
文件会比RDB快照文件更大
redis cluster
replication+sentinal 适用于数据量不是很大,但是要求保证高可用和读的吞吐量
redis cluster 主要是针对海量数据+高并发+高可用的场景
hash算法(一般常见于分库分表,分布式缓存基本不用)
假设有三个master,来了一个key后,然后对节点数量(3)取模,将取模的结果(0~2一定小于等于节点数量)得到的数量分布到master上
一致性hash算法+虚拟节点(实现负载均衡)
相比较hash算法,一致性hash算法,相当于就是把节点放到圆环上,数据进来直接在环上找最近的节点
虚拟节点就是在每个节点之间房多个虚拟节点,这样热点数据就不会全部都要一个master节点上,起到了负载均衡的作用。
cluster 算法
是对hash solt取模,不是对机器节点取模,所以机器宕机对其他节点没有影响,而且其中一台机器宕机,redis会将宕掉的master node上的hash solt分配到其他的机器上。
如何解决缓存雪崩?
分三步走:事前采用redis高可用,可以采用集群的方式;事中:采用限流和降级的形式保证数据库不死;事后:redis的持久化将磁盘的数据恢复到redis
如何解决缓存穿透?
每次系统从数据库中没有找到值,就写一个控制到缓存中去,下次加用这个参数请求就直接从缓存中返回空值
数据库与缓存双写不一致问题解决
最初级的情况下 没有并发等情况---先删除缓存,再去操作数据库
当缓存删除的时候,一个读请求同时进来造成的不一致问题---更新数据的时候,根据数据的唯一标识,操作路由发送到jvm的队列中,一个队列对应一个工作线程;串行化
redis 并发竞争问题,改如何解决?
就是多个系统都同时去操作一个redis;采用分布式锁+shijian的形式解决
0 条评论
下一页