redis
文章平均质量分 69
3个字,让你看了3个字
人生归离复归离,借一浮生逃浮生
展开
-
Redis设计与实现(十)—— 哨兵
哨兵的核心功能是主节点的自动故障转移监控:哨兵会不断地检查主节点和从节点是否运作正常。自动故障转移:当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其中 一个从节点升级为新的主节点,并让其他从节点改为复制新的主节点。配置提供者:客户端在初始化时,通过连接哨兵来获得当前Redis服务的主节点地址。通知:哨兵可以将故障转移的结果发送给客户端。在我们的哨兵架构中,主要会有两种节点组成:哨兵节点和数据节点:哨兵节点:哨兵系统由一个或多个哨兵节点组成,哨兵节点是特殊的redis节原创 2022-02-23 11:03:06 · 549 阅读 · 0 评论 -
Redis设计与实现(九)—— 主从复制
主从复制是值将一台Redis的数据,复制到另一台从节点上,数据的复制是单向的,只能由主节点到从节点主从复制的作用:- 数据冗余:主从复制实现数据的热备,是除了持久化之外的一种数据冗余方式- 故障恢复:当主节点出现问题后,从节点可以提供服务,实现快速恢复- 负载均衡:在主从复制的基础上,可以配合读写分离,然后可以由主节点提供写,从节点读,分担负载- 高可用基石:集群等的基石...原创 2022-02-21 18:14:10 · 284 阅读 · 0 评论 -
Redis设计与实现(八)—— 持久化
为什么需要持久化?因为Redis是内存数据库,数据都是存储在内存中,为了避免进程退出导致数据的永久丢失,需要定期将Redis中的数据以某种形式(数据或命令)从内存保存到硬盘;当下次Redis重启时,利用持久化文件实现数据恢复。除此之外,为了进行灾难备份,可以将持久化文件拷贝到一个远程位置。Redis分为两种持久化机制,RDB和AOFRDB将当前数据快照保存到硬盘,AOF则是将每次执行的写命令保存到硬盘(类似于MySQL的binlog);由于AOF持久化的实时性更好,即当进程意外退出时丢失的数据更少,因原创 2022-02-21 17:20:28 · 187 阅读 · 0 评论 -
Redis设计与实现(七)—— 压缩列表
压缩列表是 Redis 为了节约内存而开发的, 由一系列特殊编码的连续内存块组成的顺序型(sequential)数据结构。一个压缩列表可以包含任意多个节点(entry), 每个节点可以保存一个字节数组或者一个整数值。如图所示压缩列表构成zlbytes:长度是4字节,用于记录整个压缩链表占用的内存字节数,在对压缩列表进行内存重分配, 或者计算 zlend 的位置时使用。zltail:长度是4字节,记录压缩列表表尾节点距离压缩列表的起始地址有多少字节,根据这个偏移量,程序可以不用遍历就能确定表尾节点的原创 2022-02-21 16:01:38 · 525 阅读 · 0 评论 -
Redis设计与实现(六)—— 跳表
跳表是一个空间换时间的一个结构,他会增加很多指针,利用指针来快速定位,解决了链表查询时间是O(N)的难题,跳表平均的查询时O(logN),最坏是O(N),N是跳表的长度,我们来看看他的实现我们可以看到我们的跳表的整体实现结构,最左边的是zskiplist,包含了以下属性head:指向跳表的头节点tail:指向跳表的尾节点level:记录跳表中最大层数length:跳表的长度typedef struct zskiplist { // 表头节点和表尾节点 struct zsk原创 2022-02-21 15:33:38 · 638 阅读 · 0 评论 -
Redis设计与实现(五)—— 哈希表
一、哈希表概述在Redis中,哈希表用的很多,首先是我们的数据库,数据库表采用的就是两张哈希表,用于扩容转化,然后我们的数据类型,像Hash和Set两种类型都有Hash的编码类型,然后接下来说说Hash表二、哈希表结构哈希表typedef struct dictht { // 哈希表数组 dictEntry **table; // 哈希表大小 unsigned long size; // 哈希表大小掩码,用于计算索引值 // 总是等于 size -原创 2022-02-20 14:00:44 · 768 阅读 · 0 评论 -
Redis设计与实现(四)—— 链表
我们的链表编码在Redis的List中有使用到,学过java或者数据结构的人很容易理解,Redis中就是做的一个双向链表,包含头结点,尾节点,然后有ListNode作为节点的描述LinkedList结构ListNodetypedef struct listNode { // 前置节点 struct listNode *prev; // 后置节点 struct listNode *next; // 节点的值 void *value;} listN原创 2022-02-20 13:39:13 · 266 阅读 · 0 评论 -
Redis设计与实现(三)—— SDS
一、SDS概述在Redis中,String应该是用的最多的类型了,我们的Key是String类型,由SDS实现,String有SDS,raw,int三种,我们可以把string看成抽象类,然后SDS,raw,int分别是实现类,因为C语言的字符串中有很多使用受限的地方,所以Redis提出了动态字符串SDS二、SDS结构struct sdshdr { // 记录 buf 数组中已使用字节的数量 // 等于 SDS 所保存字符串的长度 int len; // 记录 buf原创 2022-02-20 13:16:01 · 352 阅读 · 0 评论 -
Redis设计与实现(二)—— RedisObject
一、概述Redis提供了多种基本数据类型和高级的数据类型,然后每种都有多种实现,Redis自己内部会进行判断应该使用哪种编码,当我们的数据放入Redis后,会被包装成RedisObject,然后存入,来看看RedisObject的结构吧二、RedisObject结构当我们执行了set hello world的时候,会产生如下的结构dictEntry:Redis的数据库是一张Hash表,然后里面会包含键值对,可以简单理解为java的HashMap,然后他中间包含了指向Key和Value的指针,以及下原创 2022-02-20 11:03:55 · 356 阅读 · 0 评论 -
Redis设计与实现(一)——内存模型
一、Redis内存统计Redis是一个基于内存的缓存中间件,所以,我们可能需要去查看Redis的内存使用情况,我们可以使用info命令来查看内存占用info memoryinfo命令可以显示redis服务器的许多信息,包括服务器基本信息、CPU、内存、持久化、客户端连接信息等等;memory是参数,表示只显示内存相关的信息。二、Redis内存划分Redis是一个基于内存的中间件,所以对于我们需要存储的数据,肯定是需要占用内存的,但是Redis是一个进程,是在不断运行的,所以肯定也会有其他需要的内存原创 2022-02-20 10:48:20 · 288 阅读 · 0 评论