Redis
过期数据
注: 过期数据会在Redis存储空间中额外占用一块地方(expires),里面存储的字段-值的形式的哈希存储,字段存储了过期数据的存储地址,值存储了过期数据的过期时间,通过这块区域的字段找到相应的过期数据的存储位置,然后删除掉过期数据
处理方式
1.定时删除:(不建议用)
到点就删,节约内存,但是占用cpu很大,很耗性能,拿时间换空间
2.惰性删除:
数据到期也不做处理,直到下一次访问该数据时才删除,节约cpu性能,拿空间换时间。
3.定期删除:
周期性轮询redis库中的时效性数据,采用随机抽取的策略,利用过期数据占比的方式控制删除频度,是一个折衷的方案。
数据淘汰策略
1.LRU :
Least Recently Used:长时间不用的数据会被优先淘汰
2.LFU :
Least Frequently Used:一段时间内使用次数少的会被优先淘汰
主从复制
1.同步数据
注: 数据提供方master将数据同步到数据接收方slave上,master一般进行写操作,而slave只进行都操作,这样便实现了读写分离,由slave分担了master的负载,实现了负载均衡,同时当master出现问题的时候,由slave提供服务,快速实现故障恢复,通过数据的热备份,即一种数据冗余的方式,来实现数据的持久化,即当master宕机后,由于slave和master的数据同步,slave可以替代master,相对于数据来说,只不过是搭载的角色由原来的master变成了新的master,其他没有太大变化,实现了持久化存储。
2.工作流程
1.建立连接阶段
slave发送连接的指令,master接收到后,给予响应,slave受到响应后,将反馈过来的master的IP和端口进行保存,然后根据保存的信息创建连接master的socket,然后再周期性的ping master,这样时刻与master保持连接,master则响应pang,此后slave发送指令告诉master它自己的端口号,这样master可以通过传送过来的端口号来对slave进行其他操作。
2.数据同步阶段
slave发送请求,请求与master进行数据同步,master接收到请求后先将数据保存并且打包,而且在第一个slave与master连接时,master会创建一个复制缓冲区(队列),打包保存后,生成了RDB文件,然后通过socket发送给slave,slave接收到了RDB,清空自己原有的数据,并进行RDB文件的恢复过程,这一过程称为全量复制,而在master将数据打包保存变成RDB之后的时间内,其他的指令便会被保存在复制缓冲区,然后在全量复制过程完成后,slave会告知master,RDB已经恢复完成,这样master就会将复制缓冲区的信息发送给slave,slave则执行命令,恢复数据,而这一过程便成为部分复制,至此数据同步才算是完成。
注: 如果复制缓冲区设置的过小的话,当全量复制这一过程中缓冲区内数据满了,就会溢出,造成部分数据丢失,然后在slave进入部分复制的过程的时候,发现丢失了数据,就会再一次进行全量复制,这样就使得slave陷入了死循环状态。所以建议在此期间关闭对外服务。
3.命令传播阶段
当master数据库状态被修改后,导致主从服务器数据库状态不一致,此时需要让主从数据同步到一致的状态,哦同步的动作则称为命令传播。
心跳机制
1.master心跳:ping slave,看看slave是否在线。
2.slave心跳:汇报自己的复制偏移量,获取最新的数据变更指令,同时看看master是否在线。
3.常见问题
1.频繁的全量复制
1.master重启导致
内部优化调整方案:在master内部创建master_replid变量,在master持久化RDB,并传送给slave时,runid也会被传送给slave,本机保存上次的runid,重启后恢复该值,那么slave通过该值确认master是否还是原来的master。
2.网络中断,slave不提供服务,复制缓冲区太小,断网后,溢出,触发全量复制
优化复制缓冲区空间
2.数据不一致
优化主从间的网络环境,通常放置在同一个机房部署。
哨兵模式
注: sentinel监控每一个主从结构中的服务器的情况,当master宕机后,多个slave没有了master,不能再向外提供服务,这时便由哨兵们通过投票选举的办法选出一个slave任命为master,代替以前的master,继续向外提供服务。每一个sentinel都会对所有的服务器进行监控,sentinel越多,投票选举出的master越精准。
1.监控阶段
同步信息
2.通知阶段
保持联通
3.故障转移阶段
此阶段内出现问题,master下线,哨兵们通过内部的投票选举,来竞选出负责人,然后负责人根据优化方案,即不在线的out掉,响应慢的out掉,与原master断开时间久的out掉,最后根据优先原则:优先级,offset,runid来选出新的master,其他slave则与新官建立连接,原master变为slave故障恢复后连接。
Cluster集群
数据存储设计
通过算法设计来计算key的存储空间
注: Redis存储空间可以被多台服务器所承担,每台服务器可以有很多槽,整个存储空间可以有16384个槽,可以说一个槽就是一个小的存储空间,里面可以存有很多数据,每个服务器都有其他服务器包含的槽的信息,即哪台服务器有哪些槽。当进行数据查询时,最多两次就可以命中,找到数据的存储位置。如果新部署了一台服务器,没有槽,可以从其他服务器中拿过来一些槽作为自己的,即分槽。当想要一个master下线的时候,需要将它的槽分给别人,只有当它没有了槽之后才可以允许正常辞职下线。
自带主从切换
企业级解决方案
缓存预热
缓存雪崩
缓存击穿
缓存穿透