redis的那些事儿(一)

redis的那些事儿(一),第1张

redis的那些事儿(一)

Redis(Remote Dictionary Service)  国内使用最为广泛的存储中间件,由意大利人 Salvatore Sanfilippo(网名叫Antirez)开发。

用途:缓存、分布式锁 、存储、延时队列、限流等等

1. redis的小故事

   为什么 Redis 的默认端口是 6379 ? 

这个端口号不是随机选的,而是由手机键盘字母「MERZ」的位置决定的。「MERZ」在 Antirez(Redis的开发者网名) 的朋友圈语言中是 「愚蠢」的代名词,它源于意大利广告女「Alessia Merz」在电视节目上说了一堆愚蠢的话。

发现没?每个技术大佬都有一个有趣的灵魂。

2.redis的数据结构

Redis 有 5 种基础数据结构

string (字符串):Redis 所有的数据结构都是以唯一的 key字符串作为名称,然后通过这个唯一 key                           来获取相应value值,Redis 的字符串是动态字符串,是可变字符串,采用预分配冗                           余空间的方式来减少内存的频繁分配。当字符串长度< 1M 时,扩容都是加倍现有                           的空间,如果超过 1M,扩容时一次只会多扩 1M 的空间,最大长度为 512M。

list (列表): 是链表而不是数组,类似Java 里面的 linkedList,list 的插入和删除 *** 作快,时间                          复杂度为 O(1),但是查询很慢,时间复杂度为O(n)。

set (集合):键值对是无序的唯一,相当于 Java 里面的 HashSet,字典中所有的 value 都是一个                       值: NULL

hash (哈希) :是无序字典,内部实现结构上同Java 的 HashMap,数组加链表二维结构。Redis 的                      字典的值只能是字符串,为了高性能不堵塞服务,所以采用了渐进式 rehash 策略。

                   缺点:hash 结构的存储消耗要高于单个字符串

zset (有序集合):类似于 Java 的 SortedSet 和 HashMap 的结合体,一方面它是一个 set,保证了                            内部value 的唯一性,它可以给每个 value 赋予一个 score,代表这个                                              value 的排序权重。它的内部实现用的是一种叫着「跳跃列表」的数据结构(内                              部排序通过这个来实现)

扩展部分:HyperLogLog、Bloom Filter

                  HyperLogLog:redis高级数据结构,可在不需要太精确的业务场景下使用,比如不精                                               确的去重计数方案,有pfadd、pfcount、pfmerge几个常用指令,后续                                              补充说明。

                 Bloom Filter:一个不怎么精确的 set 结构,有二个基本指令,bf.add 添加元素,bf.exists                                         查询元素是否存在.如果一次添加多个可用bf.madd,如果需要一次查询多个                                      元素是否存在可用 bf.mexists。

3.redis数据持久化

 Redis 的持久化机制有两种:快照、AOF 日志。

对比:1.快照是一次全量备份,AOF 日志是连续的增量备份

           2.快照是内存数据的二进制序列化形式,紧凑型存储;AOF日志记录的是内存数据修改的                  指令记录文本。

           3.AOF日志在长期的运行过程中会变的无比庞大,数据库重启时需要加载 AOF 日志进行指               令重放,这个时间就会无比漫长。所以需要定期进行 AOF 重写,给 AOF 日志进行瘦身。

4.redis同步机制

一、主从同步

分布式系统的节点通常都是分布在不同的机器上进行网络隔离,这意味着必然会有
网络断开的风险,这个网络断开场景的专业词汇:「 网络分区」

CAP 原理:网络分区发生时,一致性和可用性两难全

C - Consistent 一致性
A - Availability 可用性
P - Partition tolerance 分区容忍性

Redis 的主从数据是异步同步的,所以分布式的 Redis 系统并不满足「 一致性」要求,只能保证「 最终一致性」

二、增量同步

Redis 同步的是指令流,主节点会将那些对自己的状态产生修改性影响的指令记录在本
地的内存 buffer 中,然后异步将 buffer 中的指令同步到从节点,从节点一边执行同步的指
令流来达到和主节点一样的状态,一遍向主节点反馈自己同步到哪里了 (偏移量)。复制内存 buffer 是一个定长的环形数组,如果数组内容满了,就会从头开始覆盖前面的内容

三、快照同步

首先在主库上进行一次 bgsave 将当前内存的数据全部快照到磁盘文件中,然后再将快照文件的内容全部传送到从节点。从节点将快照文件接受完毕后,立即执行一次全量加载,加载之前先要将当前内存的数据清空。加载完毕后通知主节点继续进行增量同步。

redis哨兵

Redis Sentinel 集群可以看成是一个 ZooKeeper 集群,它是集群高可用的心脏,
它一般是由单数节点组成(通常大于3),这样挂了个别节点集群还可以正常运转

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4667955.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-06
下一篇 2022-11-06

发表评论

登录后才能评论

评论列表(0条)

保存