Redis知识扩充

15 篇文章 0 订阅
  1. RDB持久化根据执行持久化的对象不同又分为SAVA和BGSAVA两种方式

    SAVA即让Redis服务进程来执行持久化,所以直到RDB持久化结束之前,Redis服务进程会一直处于阻塞状态,无法处理任何命令。

    BGSAVE则会通过fork()来创建一个子进程,然后让子进程来接管RDB持久化,而父进程继续处理命令请求

  2. 为了保证文件的安全以及容量更小,RDB持续化所生成的RDB文件是一个经过压缩的二进制文件,通过这个文件就可以还原数据库的状态。

  3. 由于命令太多时,时间消耗会更大,AOF引入了重写的机制,即只保存能够获取最终结果的命令, 重写的流程很简单,就是去直接读取当前数据库中的键值状态,然后构造出对应的命令来进行保存
    例如插入1,2,3,4,5 然后删除4,5,记录是就直接进行一次记录lpush 1 2 3,就可以直接省去了中间的操作。

  4. 混合持久化方式

    混合顾名思义就是结合了RDB和AOF的优点, 在写入的时候, 先把数据以RDB的形式写入文件的开头, 再将后续的操作命令以AOF的格式保存到文件中去, 这样就保证Redis重启时的速度, 又能减轻数据丢失的风险

  5. 哨兵工作原理
    每个哨兵都会以每秒1次的频率, 向已知的主服务器、从服务器和以及其他的哨兵发送一个ping命令
    如果最后一个有效的ping命令回复时间超过默认值是30s的时间, 就会被标记为主观下线
    如果主服务器标记为主观下线, 那么正在监视这个主服务器的所有哨兵节点, 都会以每秒1次的频率进行确认, 一旦确认就进入主观下线状态
    如果有足够数量的哨兵在指定时间范围都认为这个主服务器确认主观下线, 那么这个主服务器被标记为客观下线, 此时所有的哨兵会按照规则协商出一个新的主节点

  6. Redis中的String

    Redis没有直接使用C语言传统的字符串表示,而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型,并将SDS用作Redis的默认字符串表示,是一个可以被修改的字符串值,里面也存储了自己的字符串长度,效率会提高。

  7. Redis中的列表
    列表类型 (List) 是⼀个使用线性结构存储的结构,它的元素插入会按照先后顺序存储到链表结构中。
    列表类型的底层数据结构可以是压缩列表(ZipList)或者链表(LinkedList)

    压缩列表他是内存连续的顺序型数据结构,普通链表节点内存是随机分配的,占用内存零散,但压缩列表是整顿好的,利于内存合理利用。

    他的每个节点可以保存一个字节数组或者一个整数值。

    当列表对象的所有字符串元素长度都小于64字节,并且保存的元素数量小于512个时,使用压缩列表,为了节约内存。
    如果不满足上述条件中的任意一个,都会使用链表(双端链表)

  8. Redis中的hash类型

    哈希类型的底层数据结构可以是压缩列表(ZipList)或者字典(Dict)

    当哈希对象的所有键值对的键和值的字符串长度都小于64字节,并且保存的键值对数量小于512个时,使用压缩列表

    不满足任一条件,就会使用字典

    字典底层采用了哈希表来进行实现。一个哈希表里面可以有多个哈希表节点,而每个哈希表节点就保存了字典中的一个键值对 。

  9. Redis中的Set

    集合类型的底层数据结构可以是整数集合(IntSet)或者字典(Dict)

    当集合对象的所有元素都是整数值,并且保存的元素数量小于512个时,使用整数集合

    如果不满足上述条件中的任意一个,都会使用字典

  10. Redis中的ZSet

    比集合类多了一个排序属性(分值),有序集合的存储元素值是不能重复的,但分值可以重复。

    他的底层数据结构可以是压缩列表或者是跳表

    当有序集合所有元素成员长度都小于64字节,并且保存的元素数量小于128个时,使用压缩列表

    如果不满足任意一个,就会使用跳表

  11. 因为C语言并不具备自动内存回收功能,所以Redis在自己的对象系统中构建了一个引用计数(reference counting)技术实现的内存回收机制,通过这一机制,程序可以通过跟踪对象的引用计数信息,在适当的时候自动释放对象并进行内存回收

  12. 哨兵模式如何实现领导者哨兵节点选举?

    Redis使用了Raft算法实 现领导者选举,进行领导者选举的大致思路:
    每个在线的Sentinel节点都有资格成为领导者,当它确认主节点主观下线时候,会向其他Sentinel节点发送sentinel is-master-down-by-addr命令, 要求将自己设置为领导者

    收到命令的Sentinel节点,如果没有同意过其他Sentinel节点的sentinel is-master-down-by-addr命令,将同意该请求,否则拒绝

    如果该Sentinel节点发现自己的票数已经大于等于所有哨兵数量的一半,那么它将成为领导者

    如果此过程没有选举出领导者,将进入下一次选举

    总之就是看哪个哨兵与其他哨兵联系更快, 基本上谁先完成客观下线,谁就是领导者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lhj_loveFang_1105

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值