说说Redis的主从复制,读写分离,哨兵机制,集群、
1、单台Redis会存在读和写的瓶颈,而且还会存在单点故障。 2、Redis集群的模式
a)主从架构模式:把多态Redis节点分为,一主多从,主负责写的操作,从负责读的操作 1)数据的备份 2)提供Redis的读的速度
b)读写分离:主数据只负责写的操作,从数据库只负责的读的操作 c)哨兵机制:对Redis节点的监控和选举 a)哨兵的数量至少是3台
Redis主从结构中如何完成数据同步?
全量同步
Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体步骤如下: -
从服务器连接主服务器,发送SYNC命令; -
主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令; -
主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令; -
从服务器收到快照文件后丢弃所有旧数据,载入收到的快照; - 主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令; -
从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;完成上面几个步骤后就完成了从服务器数据初始化的所有操作,从服务器此时可以接收来自用户的读请求。
增量同步
Redis增量复制是指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。
增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。Redis主从同步策略
主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave 在任何时候都可以发起全量同步。redis
策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步。
说说Redis哈希槽的概念?
Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value
时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,
这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大
致均等的将哈希槽映射到不同的节点。
Redis 集群没有使用一致性hash, 而是引入了哈希槽的概念。
Redis
集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽。这种结构很容易添加或者删除节点,并且无论是添加删除或者修改某一个节点,都不会造成集群不可用的状态。使用哈希槽的好处就在于可以方便的添加或移除节点。
当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点就可以了;
当需要移除节点时,只需要把移除节点上的哈希槽挪到其他节点就行了;
在这一点上,我们以后新增或移除节点的时候不用先停掉所有的 redis 服务。
Redis集群最大节点个数是多少 ?
16384
redis并发竞争key问题如何解决
>同时有多个客户端去set一个key。
解决方法: 乐观锁,注意不要在分片集群中使用
分布式锁,适合分布式系统环境
时间戳,适合有序场景
消息队列,串行化处理
.什么是缓存穿透?
一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去数据库查询。
一些恶意的请求会故意大量查询不存在的key,就会对数据库造成很大的压力。这就叫做缓存穿透。
什么是缓存击穿?
缓存击穿
实际上是缓存雪崩的一个特例,大家使用过微博的应该都知道,微博有一个热门话题的功能,用户对于热门话题的搜索量往往在一些时刻会大大的高于其他话题,这种我们称为缓存的
“热点”,由于系统中对这些热点的数据缓存也存在失效时间,在热点的缓存到达失效时间时,此时依然可能会有大量的请求到达系统,没有了缓存层的保护,这些请求同样的会到达
db 从而可能引起故障。击穿与雪崩的区别即在于击穿是对于特定的热点数据来说,而雪崩是全部数据。
解决方案
二级缓存:对于热点数据进行二级缓存,并对于不同级别的缓存设定不同的失效时间,则请求不会直接击穿缓存层到达数据库。