Redis
文章平均质量分 93
工作笔记
星光之子0317
这个作者很懒,什么都没留下…
展开
-
Redis集群-节点、槽、分片、复制、故障转移、消息
Redis集群:启动节点、集群数据结构、槽指派、集群执行命令、计算键属于哪个槽、MOVED、节点数据库实现、重新分片、ASK、故障检测、故障转移、选举新节点原创 2021-12-05 00:35:42 · 643 阅读 · 0 评论 -
Redis哨兵-Sentinel
Redis哨兵-Sentinel概述1.启动并初始化Sentinel1.1 初始化服务器使用Sentinel专用代码1.3 初始化Sentinel状态1.4 初始化Sentinel状态的masters属性1.5 创建连向主服务器的网络连接为什么有两个连接?2.获取主服务器信息3.获取从服务器信息4.向主服务器和从服务器发送信息5.接收来自主服务器和从服务器的频道信息5.1 更新sentinels字典5.2 创建连向其他Sentinel的命令连接6.检测主观下线状态7.检测客观下线状态8.选举领头Sentin原创 2021-10-30 17:53:12 · 124 阅读 · 0 评论 -
Redis主从复制(SYNC、PSYNC、部分重同步)
Redis主从复制-SYNC、PSYNC、部分重同步概述旧版复制功能同步操作命令传播操作旧版复制的缺陷SYNC命令是一个非常耗费资源的操作新版复制功能部分重同步的实现复制偏移量复制 挤压缓冲区根据需要 调整 复制积压缓冲区的大小服务器运行ID-runIdPSYNC命令的实现复制的实现步骤1:设置主服务器的地址和端口步骤2:建立套接字连接步骤3:发送PING命令步骤4:身份验证步骤5:发送端口信息步骤6:同步步骤7:命令传播心跳检测检测主从服务器的网络连接状态辅助实现min-slaves配置选项检测命令丢失R原创 2021-10-20 00:38:10 · 1741 阅读 · 0 评论 -
Redis-键生存时间/过期时间、过期键删除策略 及 备份和复制对于过期键处理
Redis过期键的删除策略 及 备份和复制对于过期键处理被动删除定时删除定期删除删除策略RDB对过期键的处理AOF对过期键的处理复制功能对过期键的处理被动删除只有 key 被操作时(如GET),REDIS 才会 被动检查 该key是否过期,如果过期 则 删除之 并且 返回NIL这种删除策略对CPU是友好的,删除操作 只有在 不得不的情况下 才会进行,不会其他的expire key上浪费无谓的CPU时间。这种策略对内存不友好,一个key已经过期,但是在它被操作之前不会被删除,仍然占据内存空间如果有大原创 2021-09-10 22:35:37 · 266 阅读 · 0 评论 -
Redis数据库、键空间 及 相关命令
数据库、键服务器中的数据库切换数据库数据库(的)键空间读写键空间时的维护操作服务器中的数据库Redis服务器 将 所有数据库 都保存 在服务器状态redis.h/redisServer结构的db数组中db数组的每个项都是一个redis.h/redisDb结构,每个redisDb结构代表一个数据库:struct redisServer { // ... // 一个数组,保存着服务器中的所有数据库 redisDb *db; // ...};在初始化服务器时,程序会根原创 2022-01-13 14:49:30 · 466 阅读 · 1 评论 -
Redis-对象共享、内存优化
对象共享、内存优化对象的引用计数对象共享为什么开启maxmemory和LRU淘汰策略后对象池无效?(面试题)为什么Redis不共享包含字符串的对象?(面试题)对象的空转时长内存消耗内存使用统计内存消耗划分对象内存缓冲内存内存碎片子进程内存消耗内存管理设置内存上限动态调整内存上限内存回收策略(重要!!!)删除过期键对象内存溢出控制策略内存优化了解redisObjec对象缩减键值对象(长度)共享对象池字符串优化(embstr编码)编码(类型)优化(重要!!!)Redis为什么对一种数据结构实现多种编码方式?(面原创 2022-01-12 21:37:50 · 1379 阅读 · 1 评论 -
Redis数据类型(七)-类型检查 与 命令多态
类型检查 与 命令多态概述类型检查的实现命令多态的实现概述Redis中用于操作键的命令基本上可以分为两种类型一种命令可以对任何类型的键执行,比如说DEL命令、EXPIRE命令、RENAME命令、TYPE命令、OBJECT命令等另一种命令只能对特定类型的键执行,比如说:SET、GET、APPEND、STRLEN等命令只能对字符串键执行HDEL、HSET、HGET、HLEN等命令只能对哈希键执行RPUSH、LPOP、LINSERT、LLEN等命令只能对列表键执行SADD、SPOP、SINTER原创 2022-01-12 15:29:49 · 279 阅读 · 0 评论 -
Redis数据类型(六)-有序集合对象
Redis数据类型-集合对象、有序集合对象集合对象集合对象的编码转换集合对象的命令集合内操作1.添加元素-sadd2.删除元素-srem3.计算元素个数-scard4.判断元素是否在集合中-sismember5.随机从集合 返回 指定个数 元素-srandmember6.从集合随机弹出元素-spop7.获取所有元素-smembers集合间操作1.求多个集合的交集-sinter2.求多个集合的并集-suinon3.求多个集合的差集-sdiff4.将交集、并集、差集的结果保存集合对象的使用场景(重要!!!)总结原创 2021-10-14 00:27:49 · 401 阅读 · 0 评论 -
Redis数据类型(五)-集合对象
Redis数据类型-集合对象集合对象集合对象的编码转换集合对象的命令(包括不同编码情况下的实现方法)集合对象相关命令集合内操作1.添加元素-sadd2.删除元素-srem3.将元素从一个集合移动到另一个集合-smove4.计算元素个数-scard5.判断元素是否在集合中-sismember6.随机从集合内 返回 指定个数 元素-srandmember7.从集合内随机弹出(删除)元素-spop8.获取所有元素-smembers集合间操作1.求多个集合的交集-sinter2.求多个集合的并集-suinon3.求原创 2022-01-11 12:06:01 · 551 阅读 · 1 评论 -
Redis数据类型(四)-哈希对象
Redis数据类型-哈希对象哈希对象编码转换哈希对象的命令1.设置值2.获取值3.删除field4.计算field个数5.批量设置或获取field-value6.判断field是否存在7.获取所有field8.获取所有value9.获取所有的field-value10.hincrby、hincrbyfloat11.计算value的字符串长度(需要Redis3.2以上)使用场景(重要!!!)哈希对象哈希对象的编码可以是ziplist或者hashtableziplist编码 的 哈希对象 使用 压缩列表原创 2021-10-13 23:15:53 · 312 阅读 · 0 评论 -
Redis数据类型(三)-列表对象
Redis数据类型-列表对象列表对象编码转换列表对象的命令添加操作-rpush、lpush、linsert1.从右边插入元素2.从左边插入元素3.向某个元素 前 或者 后 插入元素查操作-lrange、lindex、llen1.获取指定范围内的元素列表2.获取列表指定索引下标的元素3.获取列表长度删除操作-lpop、rpop、lrem、ltrim1.从列表左侧弹出元素2.从列表右侧弹出3.删除指定元素4.按照索引范围修剪列表修改操作-lset修改指定索引下标的元素阻塞操作(重要!!!)-blpop、brpo原创 2021-10-13 22:13:59 · 254 阅读 · 0 评论 -
Redis数据类型(二)-字符串对象
Redis数据类型-字符串对象字符串对象字符串对象 保存 各类型值 的 编码方式(重要!!!)embstr编码(重要!!!)编码的转换字符串对象的命令常用命令1.设置值-set、setex、setnx2.获取值-get3.批量设置值-mset4.批量获取值-mget5.计数-incr、decr、incrby、decrby不常用命令1.追加值-append2.字符串长度-strlen3.设置并返回原值-getset4.设置指定位置的字符-setrange4.获取部分字符串-getrange使用场景(重要!!!原创 2021-10-11 22:14:00 · 249 阅读 · 0 评论 -
Redis数据类型(一)-对象(常说的数据类型)
对象-常说的Redis数据类型概述对象的类型与编码对象的类型编码和底层实现概述Redis并没有直接使用 之前整理的这些数据结构 来实现 键值对数据库,而是 基于这些数据结构 创建了一个 对象系统,这个系统 包含 字符串对象、列表对象、哈希对象、集合对象 和 有序集合对象 这五种类型的对象,每种对象都用到了至少一种前面所整理的数据结构好处:通过这五种不同类型的对象,Redis可以在执行命令之前,根据 对象的类型 来判断 一个对象 是否可以执行 给定的命令使用对象的另一个好处是,可以针对不同的使用场景原创 2021-09-30 18:04:48 · 185 阅读 · 0 评论 -
Redis数据结构(六)-压缩列表ziplist
压缩列表-ziplist概述压缩列表压缩列表节点-entryprevious_entry_length属性encoding属性字节数组编码整数编码content压缩列表的连锁更新压缩列表API概述压缩列表(ziplist)是 列表键 和 哈希键 的 底层实现之一当一个列表键只包含少量列表项,并且每个列表项要么就是小整数值,要么就是长度比较短的字符串,那么Redis就会使用压缩列表来做列表键的底层实现另外,当一个哈希键只包含少量键值对,比且每个键值对的键和值要么就是小整数值,要么就是长度比较短的字符串原创 2021-09-30 17:27:31 · 644 阅读 · 0 评论 -
Redis数据结构(五)-整数集合(intset)
整数集合-intset概述整数集合的实现整数集合的升级升级之后新元素的摆放位置升级的好处提升灵活性节约内存整数集合的降级整数集合API概述整数集合(intset)是 集合键 的 底层实现之一当一个集合 只包含 整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现整数集合的实现整数集合(intset)是 Redis 用于保存 整数值 的 集合抽象数据结构,它可以保存类型为int16_t、int32_t或者int64_t的整数值,并且保证集合中不会出现重复元素每个原创 2021-09-30 11:52:06 · 224 阅读 · 0 评论 -
Redis数据结构(四)-跳跃表、跳跃表节点(前进指针、跨度等)
跳跃表概述跳跃表的实现跳跃表节点层(level)前进指针(forward)跨度(span)后退指针(backward)分值(score) 和 成员(obj)跳跃表跳跃表API跳跃表的查询跳跃表的插入跳跃表的删除概述跳跃表(skiplist) 是一种 有序数据结构,它通过 在每个节点中 维持 多个 指向其他节点的指针,从而达到 快速访问节点 的 目的跳跃表 支持 平均O(logN)、最坏O(N)复杂度的节点查找,还可以通过 顺序性操作 来批量 处理节点在大部分情况下,跳跃表的效率可以和平衡树相媲美,并原创 2021-09-30 11:09:03 · 583 阅读 · 0 评论 -
Redis数据结构(三)-字典(映射)
字典概述字典的实现哈希表哈希表节点字典dictType结构哈希算法解决键冲突rehash(重要!!!)哈希表的扩展/收缩触发场景(重要!!!)负载因子计算公式渐进式rehash(重要!!!)字典(的)API概述字典,又称为符号表(symbol table)、关联数组(associative array)或映射(map),是一种用于保存 键值对(key-value pair)的抽象数据结构在字典中,一个键(key)可以和一个值(value)进行关联(或者说将键映射为值),这些关联的键和值就称为键值对字原创 2021-09-30 00:05:17 · 296 阅读 · 0 评论 -
Redis数据结构(二)-链表
链表概述链表和链表节点的实现Redis链表实现特性(重要!!!)链表和链表节点的API概述链表 提供了 高效的 节点重排能力,以及 顺序性的节点访问方式,并且可以通过 增删节点 来灵活地调整 链表的长度作为一种常用数据结构,链表内置在很多高级的编程语言里面,因为Redis使用的C语言并没有内置这种数据结构,所以Redis构建了自己的链表实现链表在Redis中的应用非常广泛,比如列表键的底层实现之一就是链表当一个列表键包含了数量比较多的元素,又或者列表中包含的元素都是比较长的字符串时,Redis就会原创 2021-09-29 23:29:36 · 150 阅读 · 0 评论 -
Redis数据结构(一)-简单动态字符串(simple dynamic string,SDS)
简单动态字符串-SDS概述SDS定义SDS与C字符串的区别常数复杂度 获取 字符串长度杜绝缓冲区溢出减少修改字符串时带来的内存重分配次数空间预分配策略惰性空间释放二进制安全兼容部分C字符串函数总结(重要!!!)SDS API概述Redis没有直接使用 C语言传统的字符串表示(以 空字符 结尾的字符数组,以下简称C字符串),而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型,并将SDS 用作 Redis的默认字符串表示在Redis里面,C字符串 只会作为原创 2021-09-29 23:10:13 · 232 阅读 · 0 评论 -
Redis线程模型(I/O 多路复用程序、文件事件类型、文件事件处理器)
Redis线程模型线程模型消息处理流程I/O 多路复用程序的实现文件事件类型文件事件处理器连接应答处理器命令请求处理器命令回复处理器线程模型Redis 基于 Reactor 模式 开发了 自己的网络事件处理器: 这个处理器 被称为 文件事件处理器(file event handler)文件事件处理器 使用 I/O 多路复用(multiplexing)程序 来 同时 监听 多个套接字-Socket并根据 套接字目前执行的任务 来为 套接字 关联(动词) 不同的 事件处理器消息处理流程当 被监听原创 2021-09-10 23:31:37 · 434 阅读 · 0 评论 -
Redis服务器(三)-服务器启动初始化
服务器启动初始化概述1.初始化 服务器状态(的)结构2.载入 配置选项3.初始化 服务器(的)数据结构4.还原数据库状态5.执行事件循环概述Redis服务器 从启动 到 能够接受客户端的命令请求,需要经过一系列的初始化和设置过程,比如 初始化服务器状态,接受用户指定的服务器配置,创建相应的数据结构和网络连接等等1.初始化 服务器状态(的)结构初始化服务器的第一步 就是 创建一个 struct redisServer类型 的 实例变量server 作为 服务器的状态,并为 结构中的各个属性 设置 默认原创 2021-09-27 22:59:33 · 366 阅读 · 0 评论 -
Redis服务器(二)-serverCron函数
serverCron函数概述更新服务器时间缓存更新LRU时钟更新 服务器 每秒执行命令次数更新 服务器(的)内存峰值记录处理SIGTERM信号管理客户端资源管理数据库资源行被延迟的BGREWRITEAOF检查持久化操作的运行状态将AOF缓冲区中的内容写入AOF文件关闭异步客户端增加cronloops计数器的值概述Redis服务器中的serverCron函数默认每隔100毫秒执行一次这个函数负责管理服务器的资源,并保持服务器自身的良好运转更新服务器时间缓存Redis服务器中 有不少功能 需要 获取系原创 2021-09-27 22:41:19 · 404 阅读 · 0 评论 -
Redis服务器(一)-命令请求的执行过程
命令请求的执行过程概述1.发送命令请求2.读取命令请求3.命令执行器(1):查找 命令实现概述客户端发送SET KEY VALUE命令到获得回复OK期间,客户端和服务器共需要执行以下操作客户端向服务器发送命令请求SET KEY VALUE服务器接收并处理客户端发来的命令请求SET KEY VALUE,在数据库中进行设置操作,并产生命令回复OK服务器将命令回复OK发送给客户端客户端接收服务器返回的命令回复OK,并将这个回复打印给用户观看1.发送命令请求Redis服务器 的 命令请求 来自原创 2021-09-27 22:15:19 · 294 阅读 · 0 评论 -
Redis事件-文件事件、时间事件、事件调度与执行
文件事件、时间事件、事件调度与执行概述文件事件文件事件处理器的构成(重要!!!)事件类型(读事件 和 写事件)文件事件相关APII/O多路复用程序的实现(重要!!!)文件事件处理器(重要!!!)连接应答处理器命令请求处理器命令回复处理器一次完整的客户端与服务器连接事件示例(重要!!!)时间事件时间事件的实现(重要!!!)事件时间相关APIserverCron函数事件的调度与执行概述Redis服务器是一个事件驱动程序,服务器需要处理以下两类事件:文件事件(file event):Redis服务器 通过原创 2021-09-29 22:16:34 · 241 阅读 · 0 评论 -
Redis持久化(七)-问题定位和优化
持久化问题定位和优化fork操作子进程开销监控和优化CPU消耗内存消耗内存消耗优化硬盘消耗AOF追加阻塞fork操作当Redis做RDB或AOF重写时,一个必不可少的操作就是执行fork操作创建子进程,对于大多数操作系统来说fork是个重量级错误虽然fork创建的子进程不需要拷贝父进程的物理内存空间,但是会复制父进程的空间内存页表例如对于10GB的Redis进程,需要复制大约20MB的内存页表,因此fork操作耗时跟进程总内存量息息相关,如果使用虚拟化技术,特别是Xen虚拟机,fork操作会更耗时原创 2022-01-14 16:42:00 · 222 阅读 · 0 评论 -
Redis持久化(六)-RDB+AOF混合持久化
RDB-AOF混合持久化RDB+AOF同时使用RDB-AOF混合持久化RDB+AOF同时使用同时使用RDB持久化和AOF持久化是可行的,只要注意以下问题即可:同时使用两种持久化功能需要耗费大量系统资源,系统的硬件必须能够支撑运行这两种功能所需的资源消耗,否则会给系统性能带来影响Redis服务器在启动时,会优先使用AOF文件进行数据恢复,只有在没有检测到AOF文件时,才会考虑寻找并使用RDB文件进行数据恢复当Redis服务器正在后台生成新的RDB文件时,如果有用户向服务器发送BGREWRITEAO原创 2022-01-14 17:32:21 · 4326 阅读 · 3 评论 -
Redis持久化(五)-AOF文件的载入与数据还原、AOF文件重写实现原理
AOF文件的载入与数据还原AOF文件的载入与数据还原AOF文件重写实现原理AOF后台重写(BGREWRITEAOF命令实现原理)触发AOF后台重写的条件(重要!!!)AOF文件的载入与数据还原因为AOF文件里面包含了重建数据库状态所需的所有写命令,所以服务器只要读入并重新执行一遍AOF文件里面保存的写命令,就可以还原服务器关闭之前的数据库状态Redis读取AOF文件并还原数据库状态的详细步骤如下:创建一个不带网络连接的伪客户端(fake client):因为Redis的命令只能在客户端上下文中执行原创 2021-09-28 16:05:17 · 1191 阅读 · 1 评论 -
Redis持久化(四)-AOF持久化实现
AOF概述AOF持久化的实现1.命令追加2.AOF文件的写入与同步文件的写入和同步AOF持久化的效率和安全性(重要!!!)概述与RDB持久化通过保存数据库中的键值对来记录数据库状态不同,AOF持久化 是通过 保存Redis服务器 所执行的写命令 来记录 数据库状态的被写入AOF文件的所有命令 都是以 Redis的命令请求协议格式 保存的,因为Redis的命令请求协议是纯文本格式所以可以直接打开一个AOF文件,观察里面的内容服务器在启动时,可以通过载入和执行AOF文件中保存的命令来还原服务器关闭之原创 2021-09-28 14:38:38 · 216 阅读 · 0 评论 -
Redis持久化(二)-RDB文件自动间隔性保存
RDB文件自动间隔性保存save选项saveparam结构dirty计数器 和 lastsave属性save选项因为BGSAVE命令 可以在 不阻塞服务器进程的情况下执行,所以Redis允许 通过 设置 服务器配置的save选项,让服务器每隔一段时间自动执行一次BGSAVE命令用户可以通过 save选项 设置多个保存条件,但只要其中任意一个条件被满足,服务器就会执行BGSAVE命令,例如:save 900 1save 300 10save 60 10000那么只要满足以下三个条件中的任意一个原创 2021-09-28 00:45:25 · 699 阅读 · 0 评论 -
Redis持久化(一)-RDB文件的创建和载入
RDB文件的创建和载入概述RDB文件的创建RDB文件的载入SAVE命令执行时的服务器状态BGSAVE命令执行时的服务器状态RDB文件载入时的服务器状态概述Redis是一个键值对数据库服务器,服务器中通常包含着任意个非空数据库,而每个非空数据库中又可以包含任意个键值对,为了方便起见,将 服务器中的非空数据库 以及 它们的键值对 统称为 数据库状态因为Redis是内存数据库,它将 自己的 数据库状态 储存在 内存里面,所以如果不想办法将储存在内存中的数据库状态保存到磁盘里面,那么一旦服务器进程退出,服务器原创 2021-09-28 00:26:37 · 1871 阅读 · 0 评论 -
Redis事务(三)-ACID
Redis事务的ACID原子性为什么Redis不支持回滚(面试题)一致性入队错误Redis 2.6.5以前的入队错误处理执行错误服务器停机隔离性持久性no-appendfsync-on-rewrite配置选项对持久性的影响原子性对于Redis的事务功能来说,事务队列中的命令要么就全部都执行,要么就一个都不执行,因此,Redis的事务是具有原子性的Redis的事务 和 传统的关系型数据库事务 的 最大区别在于,Redis不支持事务回滚机制(rollback)即使 事务队列中的某个命令 在执行期间 出现原创 2021-09-18 16:57:02 · 275 阅读 · 0 评论 -
Redis事务(二)-WATCH命令的实现
WATCH命令的实现概述使用WATCH命令监视数据库键监视机制的触发判断事务是否安全概述WATCH命令是一个乐观锁(optimistic locking)它可以在EXEC命令执行之前,监视 任意数量 的数据库键并在EXEC命令执行时,检查 被监视的键 是否 至少有一个 已经被修改过了如果是的话,服务器将拒绝执行事务,并向 客户端 返回 代表事务执行失败的空回复,举例如下:redis> WATCH "name"OKredis> MULTIOKredis> SET "nam原创 2021-09-18 16:08:23 · 272 阅读 · 0 评论 -
Redis事务(一)-事务的实现(事务开始、命令入队、事务队列、执行事务)
事务的实现概述事务的实现事务开始命令入队事务队列执行事务概述Redis事务没有回滚机制Redis通过MULTI,EXEC,WATCH等命令来实现事务功能。、事务首先以一个MULTI命令开始,然后将多个命令放入事务中,最后由EXEC命令将这个事务提交给服务器执行事务的实现一个事务从开始到结束通常会经历以下三个阶段:事务开始命令入队事务执行事务开始MULTI命令的执行标志着事务的开始redis> MULTIOKMULTI命令 可以将 执行该命令的客户端 从 非事务状态 切原创 2021-09-17 00:23:11 · 594 阅读 · 0 评论 -
缓存雪崩、缓存穿透、缓存击穿
缓存雪崩同一时间点 大面积key失效,导致后续的请求都落在数据库上,造成数据库短时间内承受大量请求可能导致雪崩的场景:缓存重启第一次启动服务 缓存从还没有数据 会导致雪崩解决方案:过期时间 随机设置给每一个缓存增加 相应的缓存标记,记录 缓存 是否失效,如果 缓存标记 失效了,则更新缓存数据。比较消耗性能,要一直监控缓存标记缓存预热,启动应用之前,先把部分热点数据提前放到缓存中互斥锁,在第一次判断缓存没有要查询数据库的时候,把 对应的缓存key 锁起来,查询完数据库之后将数据放入缓存原创 2021-09-10 21:47:07 · 94 阅读 · 0 评论