Redis
1.缓存Cache
1.1 缓存的概念
在距离近或者访问更快的地方存放一份数据,提高访问效率,笼统成为缓存
1.2缓存的问题
1:缓存穿透:是指访问者传递了一个缓存和数据库中都不存在的id,这样会造成每次缓存都不命中数据,去访问db数据库,造成穿透
2:缓存击穿:是指在某个热点数据失效后,大量访问这个热点数据的请求都会落在db数据库上,会造成数据库压力过大【一般不会造成数据库宕机】
3:缓存雪崩:是指大量缓存的信息在某一个时间段集体失效过期,会造成大量的缓存击穿现象,所有请求落在db数据库上,引起db数据库压力过大,可能造成数据库宕机
2 布隆过滤器
布隆过滤器:是指设置固定范围的key,然后使用算法对一组内容取余判断,取余结果是否落点在固定范围中,如果落在范围中,表示这个数据可能存在,如果不落在范围中,就一定不存在
3 Redis简介
Redis是一非关系性数据库,基于内存高速缓存数据库,使用C语言编写,Redis是一个key-value存储系统,
支持五种数据类型,String、list、set、zset、hash
常被用做缓存来提高项目查询的效率
4 命名空间 namespace
为了避免在设置值得过程中,出现key值重复,出现了命名空间这个概念,namespace:key格式
这样在同一个命名空间下,保证key不重复就可以
5 Redis事务机制
Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程
中,不会被其他客户端发送来的命令请求所打断。
三个命令来管理事务【Multi、Exec、discard】
输入Multi命令开始,输入的命令都会依次进入命令队列中,但不会执行,
输入Exec后,Redis会将之前的命令队列中的命令依次执行。
组队的过程中可以通过discard来放弃组队
【组队阶段就是输入命令的时候,当命令运行之后就是执行阶段】
组队阶段某个命令出现了报告错误,执行时整个的所有队列会都会被取消。
执行阶段某个命令报出了错误,则只有报错的命令不会被执行,而其他的命令都会执行,不会
回滚
6 Redis持久化
6.1 RDB
RDB是通过拍摄快照方式,在指定时间间隔内对数据拍摄快照,默认持久化方案是RDB
-
Save
此命令会阻塞redis中所有命令,当RDB过程完毕,才能执行其他命令
-
bgsave
会开启一个子进程,RDB持久化过程交给子进程,但是创建子进程的过程称为fork ,在fork阶段会发生阻塞
-
save
在配置文件中配置,满足条件,在指定时间内容发生指定条数据发生变化,就会自动持久化
6.2 AOF
Redis会将每一个收到的写命令都通过write函数追加到文件中。通俗的理解就是日志记录.
由于一直记录,日志内容会太大,所以会有日志重写机制,将多余的操作内容删除掉,减少日志大小
将内存中的数据以命令的方式保存到临时文件中,同时会fork出一条新进程来将文件重写
7 主从服务器
有两种方式
直接修改配置文件,指定是否主服务器,从服务器的主服务器位置端口,已经从服务器是否有写的权限等
通过命令方式
replicaof 127.0.0.1 7100 【设置当前redis的主服务器】
config set masterauth 123456 【同步主服务器数据,需要输入密码】slaveof no one 【结束主从关系】
8 数据同步方式
主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步
8.1 全量同步
- Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份
8.2 增量同步
- Redis增量复制是指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程
9 哨兵机制Sentinel
9.1 哨兵的作用
- 监控节点的状态
- 提醒管理员,节点的问题
- 转移故障
9.2 哨兵工作原理
- 定时任务监听节点状态
- 每10秒每个sentinel节点对master节点和slave节点执行info操作
- 每2秒每个sentinel节点通过master节点的channel(sentinel:hello)交换信息
- 每1秒每个sentintel节点对master节点和slave节点以及其余的sentinel节点执行ping操作
- 当一个哨兵发现一个节点不可用的时候,成为主观下线,然后这个哨兵会通知其他哨兵检查
- 当没有足够数量的Sentinel同意主服务器下线时,主服务器的客观下线状态就会被移除。
- 当主服务器重新向Sentinel的PING命令返回有效回复时,主服务器的主观下线状态就会被移除
- 当一定数量的哨兵检查节点为不可用状态的时候,称为客观下线
- 当客观下线后会开始故障转移流程
9.3 故障转移流程
- 第一个发现节点下线的哨兵会选举自己为哨兵的领导者
- 当一个节点被半数的节点哨兵投票后作为领导者
- 然后领导者哨兵就会选举一个服务器作为主服务器
- 选择slave-priority最高的slave节点
- 选择复制偏移量最大的节点
- 选runId最小的(启动最早)
- 当选举之后,就会更改节点的状态,新的节点跟改为主节点
- 原来主节点上线后会更改为从节点
- 然后通知客户端,客户端会连接新的主节点
10 一致HASH
10.1 使用场景
服务器中需要存储大量数据,一台redis无法存放下所有数据的缓存
需要多台redis服务器配合使用,就需要使用hash取余的方式
对于数据key进行取余,根据结果,可以判断出对应key-value在那个redis服务器查询
**缺点:**redis服务器个数发生变化,添加服务器或者服务器减少,所有的redis服务器缓存数据的位置都会发生变化
10.2 算法原理
- 一致性HASH算法是对固定值取余【
2的31次方
】 - 内部中是一个圆,就是由
2的32次方
的点组成的Hsah环 - 然后对服务器的进行取余,这样每台服务器都落点在对应的Hash环上
- 然后计算数据,对数据取余,数据保存在Hash环上顺时针最近的服务器
优点:
- 当服务器下线的时候,数据会给到下一个服务器承担,不会使得所有服务器数据变化
- 当添加一个服务器的时候,会帮助上一个服务器承担部分数据,也不会影响所有服务器
- 为了避免数据倾斜,有虚拟节点的概念,一台服务器可以落在对应的多个点
- 比如:只有两个服务器,A服务器落在【0,2/4】的位置 ,B服务器落在【1/4,3/4】的位置
11 Redis的solt槽
11.1 solt的槽作用
- Redis局群中对于数据分片【(
sharding
)就是类型hash算法,使得多个redis节点管理缓存数据】 - Redis的Solt槽,在集群中固定是16384个哈希槽,集群使用CRC16(key)%16384对数据计算,得到key属于哪个槽【其中CRC16(key)语句用于计算键key的CRC16校验和】
- 在redis集群启动开启服务的时候,都对应着管理相对应的Slot槽数据【每个node都分配了一个solt段,对应0-16384】
- 当需要保存数据的时候,都会经过CRC16哈希到一个对应的node节点服务器上
- 集群中Node服务器之间相互监听,如果其中有服务器下线或者上线,数据会按照slot作为单位迁移
- 将一个Hash槽 Node节点移动到另一个Node节点,不会造成节点阻塞
11.2 Slot优缺点
- 优点
- 将Redis的写操作分摊在多个节点上,提高了并发能力,扩容也简单
- 缺点
- Node节点之间需要相互监听,高并发数据写入写出,工作任务也繁重了不少
12 redis多主多从集群【分片】
12.1 分片的概念
分片就是将数据拆分到多个redis实例的过程
- redis通过Solt槽来管理多台redis服务器,每台服务器处理不同的redis请求