Redis 学习记录

Redis 学习记录

一、应用场景

缓存

分布式锁:setnx(不存在则设置)

限流:单线程

发布/订阅

 

二、数据结构

String

Hash

List

Set

zSet(Sorted Set)

 

三、持久化

RDB(Redis DataBase)

AOF(Append Only File)

 

四、部署模式

  • 主从模式

  优点:主从复制,读写分离

  缺点:无法自动完成故障转移;写瓶颈,存储瓶颈;无法实现动态扩容。

  • 哨兵模式

  优点:主节点故障,可以完成故障转移

  缺点:写瓶颈,存储瓶颈;无法实现动态扩容。

  • 集群模式 

  优点:高可用,可扩展  

  核心:Hash虚拟槽分区;CRC16 - 循环冗余校验算法

 

五、Redis集群选举原理

当slave发现自己的master变为FAIL状态时,便尝试进行Failover,以期成为新的master。由于挂掉的master可能会有多个slave,从而存在多个slave竞争成为master节点的过程, 其过程如下:
1.slave发现自己的master变为FAIL
2.将自己记录的集群currentEpoch加1,并广播FAILOVER_AUTH_REQUEST信息
3.其他节点收到该信息,只有master响应,判断请求者的合法性,并发送FAILOVER_AUTH_ACK,对每一个epoch只发送一次ack
4.尝试failover的slave收集FAILOVER_AUTH_ACK
5.超过半数后变成新Master
6.广播Pong通知其他集群节点。

从节点并不是在主节点一进入 FAIL 状态就马上尝试发起选举,而是有一定延迟,一定的延迟确保我们等待FAIL状态在集群中传播,slave如果立即尝试选举,其它masters或许尚未意识到FAIL状态,可能会拒绝投票

 

延迟计算公式:

DELAY = 500ms + random(0 ~ 500ms) + SLAVE_RANK * 1000ms

SLAVE_RANK表示此slave已经从master复制数据的总量的rank。Rank越小代表已复制的数据越新。这种方式下,持有最新数据的slave将会首先发起选举(理论上)。

 

 

六、Redis 键销毁机制

1、被动删除

  当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key

2、主动删除

  由于惰性删除策略无法保证冷数据被及时删掉,所以Redis会定期主动淘汰一批已过期的key

3、当前已用内存超过maxmemory限定时,触发主动删除策略

 

七、Redis内存回收算法

1、引用计数算法

 

2、LRU算法

LRU是Least Recently Used的缩写,即最近最少使用。

 

八、Redis 穿透,雪崩

1、缓存雪崩

数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机。

解决思路:

缓存高可用,缓存降级,预热

2、缓存穿透

缓存穿透是指查询一个一不存在的数据。例如:从缓存redis没有命中,需要从mysql数据库查询,查不到数据则不写入缓存,

这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。

解决思路:

如果查询数据库也为空,直接设置一个默认值存放到缓存,这样第二次到缓冲中获取就有值了,而不会继续访问数据库。

设置一个过期时间或者当有值的时候将缓存中的值替换掉即可。

可以给key设置一些格式规则,然后查询之前先过滤掉不符合规则的Key。

3、缓存并发

这里的并发指的是多个redis的client同时set key引起的并发问题。其实redis自身就是单线程操作,多个client并发操作,按照先到先执行的原则,先到的先执行,其余的阻塞。

当然,另外的解决方案是把redis.set操作放在队列中使其串行化,必须的一个一个执行。

4、缓存预热

缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。

这样就可以避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据!

解决思路:

4.1、直接写个缓存刷新页面,上线时手工操作下;

4.2、数据量不大,可以在项目启动的时候自动进行加载;

目的就是在系统上线前,将数据加载到缓存中。

以上就是缓存雪崩、预热、降级等的介绍。

 

九、Redis 脑裂

redis的集群脑裂是指因为网络问题,导致redis master节点跟redis slave节点和sentinel集群处于不同的网络分区,

此时因为sentinel集群无法感知到master的存在,所以将slave节点提升为master节点。

此时存在两个不同的master节点,就像一个大脑分裂成了两个。

 

解决方案

min-slaves-to-write 3
min-slaves-max-lag 10

第一个参数表示连接到master的最少slave数量
第二个参数表示slave连接到master的最大延迟时间

按照上面的配置,要求至少3个slave节点,且数据复制和同步的延迟不能超过10秒,否则的话master就会拒绝写请求,配置了这两个参数之后,如果发生集群脑裂,原先的master节点接收到客户端的写入请求会拒绝,就可以减少数据同步之后的数据丢失。

注意:较新版本的redis.conf文件中的参数变成了

min-replicas-to-write 3
min-replicas-max-lag 10

 

 

参考资料

Redis 命令参考

如何解决Redis雪崩、穿透、并发等5大难题

 

redis--RDB和AOF

详解Redis中两种持久化机制RDB和AOF(面试常问,工作常用)

 

redis键的销毁机制

Redis内存回收算法

 

redis分布式锁-SETNX实现

使用 Redis的SETNX命令实现分布式锁

 

Redis的四种模式,单机、主从、哨兵、集群

一文把Redis主从复制、哨兵、Cluster三种模式摸透

Redis 5 集群选举原理分析

redis三种模式对比

redis 主从模式,哨兵模式,cluster(集群)模式 简介

Redis进阶实践之十 Redis主从复制的集群模式

Redis进阶实践之十 Redis哨兵集群模式

Redis进阶实践之十一 Redis的Cluster集群搭建

Redis进阶实践之十二 Redis的Cluster集群动态扩容

Redis 学习笔记(十四)Redis Cluster介绍与搭建

redis单例、主从模式、sentinel以及集群的配置方式及优缺点对比

 

Redis 实现限流的三种方式

程序员,你知道如何使用Redis才能实现高流量的限速器吗?

redis实现流量控制策略

基于Redis的分布式限流器

 

redis集群(主从)脑裂及解决方案

 

redis学习及实践3---Jedis、JedisPool、Jedis分布式实例介绍

redis 工具类 单个redis、JedisPool 及多个redis、shardedJedisPool与spring的集成配置

Java中使用Jedis操作Redis

Spring Data Redis学习

ShardedJedisPool的使用

Codis作者黄东旭细说分布式Redis架构设计和踩过的那些坑

RedisTemplate之opsForValue使用说明

 

posted @ 2020-05-20 10:22  风过无痕521  阅读(92)  评论(0编辑  收藏  举报