Redis

1.缓存Cache

1)概念

2)TTL

布隆过滤器可以缓解缓冲穿透问题

================================================================

2.Redis命令

失效时间:

删除:

3.事务

(串联多个命令防止别的命令插队)

事务的错误处理:

组队阶段某个命令出现了报告错误,执行时整个的所有队列会都会被取消。

执行阶段某个命令报出了错误,则只有报错的命令不会被执行,而其他的命令都会执行,不会回滚。

事务锁的机制:

悲观锁:性能低,安全性高

乐观锁:性能高,安全性低

Redis就是利用这种check-and-set(乐观锁)机制实现事务的

4.持久化

类似于HDFS中‘的存储方式

5.主从复制集群

缓解读压力

6.从服务器断线重连

7.哨兵(sentinel)

哨兵由Raft选主

Master由哨兵选出

哨兵工作原理

1)在redis sentinel中,一共有3个定时任务,通过这些任务,来发现新增节点和节点的状态。

每10秒每个sentinel节点对master节点和slave节点执行info操作

每2秒每个sentinel节点通过master节点的channel(sentinel:hello)交换信息

每1秒每个sentintel节点对master节点和slave节点以及其余的sentinel节点执行ping操作

2)主观下线(SDOWN):当前sentintel节点认为某个redis节点不可用。

如果一个实例(instance)距离最后一次有效回复PING命令的时间超过down-after milliseconds所指定的值,那么这个实例会被Sentinel标记为主观下线。

如果一个主服务器被标记为主观下线,那么正在监视这个主服务器的所有Sentinel节点,要以每秒一次的频率确认主服务器的确进入了主观下线状态。

3)客观下线(ODOWN)一定数量sentinel节点认为某个redis节点不可用。

如果一个主服务器被标记为主观下线,并且有足够数量的Sentinel(至少要达到配置文件指定的数量)在指定的时间范围内同意这一判断,那么这个主服务器被标记为客观下线。

在一般情况下,每个Sentinel会以每10秒一次的频率,向它已知的所有主服务器和从服务器发送INFO命令。当一个主服务器被Sentinel标记为客观下线时,Sentinel向下线主服务器的所有从服务器发送INFO命令的频率,会从10秒一次改为每秒一次。

Sentinel和其他Sentinel协商主节点的状态,如果主节点处于SDOWN状态,则投票自动选出新的主节点。将剩余的从节点指向新的主节点进行数据复制。

4)当没有足够数量的Sentinel同意主服务器下线时,主服务器的客观下线状态就会被移除。

5)当主服务器重新向Sentinel的PING命令返回有效回复时,主服务器的主观下线状态就会被移除。

故障转移流程

哨兵内部领导者选举

1). 每个做主观下线的sentinel节点向其他sentinel节点发送上面那条命令,要求将它设置为领导者。

2). 收到命令的sentinel节点如果还没有同意过其他的sentinel发送的命令(还未投过票),那么就会同意,否则拒绝。

3). 如果该sentinel节点发现自己的票数已经过半且达到了quorum的值,就会成为领导者。

4). 如果这个过程出现多个sentinel成为领导者,则会等待一段时间重新选举。

Master选举

选择slave-priority最高的slave节点

选择复制偏移量最大的节点

选runId最小的(启动最早)

状态更换

选举出新的master节点,其余的节点变更为新的master节点的slave节点原有的master节点重新上线,成为新的master节点的slave节点。

通知客户端

当所有节点配置结束后,sentinel会通知客户端节点变更信息。

客户端连接新的master节点

8.高可用

持久化:持久化是最简单的高可用方法。它的主要作用是数据备份,即将数据存储在硬盘,保证数据不会因进程退出而丢失。

复制:复制是高可用Redis的基础,哨兵和集群都是在复制基础上实现高可用的。复制主要实现了数据的多机备份以及对于读操作的负载均衡和简单的故障恢复。缺陷是故障恢复无法自动化、写操作无法负载均衡、存储能力受到单机的限制。

哨兵:在复制的基础上,哨兵实现了自动化的故障恢复。缺陷是写操作无法负载均衡,存储能力受到单机的限制。

集群:通过集群,Redis解决了写操作无法负载均衡以及存储能力受到单机限制的问题,实现了较为完善的高可用方案。

=================================================

集群设计思想

cluster可以说是sentinel和主从模式的结合体,通过cluster可以实现主从和master重选功能

不同节点分别管理不同的key

同一个Key的操作只让一个master去处理

为了保证master节点的(单点故障和效率)问题,每个主节点至少准备一个slave节点

集群是一个可以在多个 Redis 节点之间进行数据共享的设施

集群不支持那些需要同时处理多个键的 Redis 命令

9.一致性Hash

容错性

当我们添加服务器或者删除服务器

它只影响处理节点的下一个节点

========================================================

尽量负载均衡(防止数据倾斜)

均匀一致性hash的目标是如果服务器有N台,客户端的hash值有M个,

那么每个服务器应该处理大概M/N个用户的。也就是每台服务器负载尽量均衡

10.Redis的Slot槽

Redis集群使用数据分片而非一致性哈希来实现:

一个Redis集群包含16384个哈希槽(hashslot),数据库中的每个键都属于这16384个哈希槽的其中一个,集群使用公式CRC16(key)%16384来计算键key于哪个槽,其中CRC16(key)语句用于计算键key的CRC16校验和

将一个哈希槽从一个节点移动到另一个节点不会造成节点阻塞,所以无论是添加新节点还是移除已存在节点,又或者改变某个节点包含的哈希槽数量,都不会造成集群下线。

对象保存到Redis之前先经过CRC16哈希到一个指定的Node

每个Node被平均分配了一个Slot段,对应着0-16383Slot不能重复也不能缺失,否则会导致对象重复存储或无法存储。

Node之间也互相监听,一旦有Node退出或者加入,会按照Slot为单位做数据的迁移Node1如果掉线了,0-5640这些Slot将会平均分摊到Node2Node3

优缺点

优点:将Redis的写操作分摊到了多个节点上,提高写的并发能力,扩容简单。

缺点:每个Node承担着互相监听、高并发数据写入、高并发数据读出,工作任务繁重

集群 跟 分片 有什么区别 我们在谈到 服务器多实例的时候,常常会说到Tomcat 集群,xxx集群等; 是因为 类似Tomcat 这样的 集群 强调的是 机器提供的 服务 而 redis 这样的“集群"强调的是 数据,(因为redis 主要是来存数据的)就称为分片 将数据分为一片一片的区域,所以redis 集群 一般会说redis 分片。强调的是 数据的分片。

11.案例

使用Redis来实现频率控制(青铜1小时3贴 白银1小时5贴 黄金1小时8贴)

统计每日活跃用户

Redis HyperLogLog(类似于布隆过滤器) 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。

在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。

摇一摇快速获取距离

GEO功能在Redis3.2版本提供(自带的),支持存储地理位置信息用来实现诸如附近位置、摇一摇这类依赖于地理位置信息的功能.geo的数据类型为zset.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值