
缘定红颜:Redis江湖奇遇
文章平均质量分 94
Redis是一种高性能的开源键值对存储系统,可用于缓存、消息队列、分布式锁等场景。它支持多种数据结构(如字符串、哈希表、列表等),具有快速读写能力和丰富的功能(如事务、发布订阅等)。Redis通过将数据存储在内存中,并使用持久化机制将数据写入磁盘,提供了高效的数据访问和持久化存储。
进击的雷神
优快云博客专家、担任过EMV软件工程师、嵌入式软件工程师、JAVA开发工程师、测试开发工程师、某公司测试组长,有自己的测试专利
展开
-
Redis设计与实现之服务器与客户端
接着,程序将客户端、要执行的命令、命令参数等送入命令执行器:执行器调用 setCommand 函数,将数据库中 YEAR 键的值修改为 2013 ,然后将命令的执行结果保存在客户端的回复缓存 中,并为客户端 fd 关联写事件,用于将结果回写给客户端。不过,服务器本身并没有多少需要介绍的新东西,因为服务器除了维持服务器状态之外,最重 要的就是将前面介绍过的各个功能模块组合起来,而这些功能模块在前面的章节里已经介绍过 了,所以本章将焦点放在服务器的初始化过程,以及服务器对命令的处理过程上。原创 2023-12-25 11:00:55 · 1292 阅读 · 0 评论 -
Redis设计与实现之事件
如果事件处理函数返回一个非AE_NOMORE的整数值,那么这个事件为循环执行事件:该 事件会在指定的时间被处理,之后它会按照事件处理函数的返回值,更新事件的 when 属 性,让这个事件在之后的某个时间点再次运行,并以这种方式一直更新并运行下去。5.4.2 时间事件 时间事件记录着那些要在指定时间点运行的事件,多个时间事件以无序链表的形式保存在服务器状态中。这些属性表明,实际处理时间事件的时间,通常会比时间事件所预定的时间要晚,至于延迟的 时间有多长,取决于时间事件执行之前,执行文件事件所消耗的时间。原创 2023-12-25 10:40:09 · 1425 阅读 · 0 评论 -
Redis设计与实现之AOF
Redis 分别提供了 RDB 和 AOF 两种持久化机制:RDB 将数据库的快照(snapshot)以二进制的方式保存到磁盘中。AOF 则以协议文本的方式,将所有对数据库进行过写入的命令(及其参数)记录到 AOF 文件,以此达到记录数据库状态的目的。本章首先介绍 AOF 功能的运作机制,了解命令是如何被保存到 AOF 文件里的,观察不同的 AOF 保存模式对数据的安全性、以及 Redis 性能的影响。之后会介绍从 AOF 文件中恢复数据库状态的方法,以及该方法背后的实现机制。原创 2023-12-23 06:00:00 · 923 阅读 · 0 评论 -
Redis设计与实现之RDB
在运行情况下,Redis 以数据结构的形式将数据维持在内存中,为了让这些数据在 Redis 重启 之后仍然可用,Redis 分别提供了 RDB 和 AOF 两种持久化模式。在 Redis 运行时,RDB 程序将当前内存中的数据库快照保存到磁盘文件中,在 Redis 重启动 时,RDB 程序可以通过载入 RDB 文件来还原数据库的状态。原创 2023-12-22 14:57:02 · 959 阅读 · 0 评论 -
Redis设计与实现之数据库
本章将对 Redis 数据库的构造和实现进行讨论。除了说明数据库是如何储存数据对象之外,本章还会讨论键的过期信息是如何保存,而 Redis 又是如何删除过期键的。原创 2023-12-21 06:00:00 · 1494 阅读 · 0 评论 -
Redis设计与实现之慢查询日志
在每次执行命令之前,Redis 都会用一个参数记录命令执行前的时间,在命令执行完之后,再 计算一次当前时间,然后将两个时间值相减,得出执行命令所耗费的时间值 duration ,并将 duration传给 slowlogPushEntryIfNeed 函数。如果要持久化保存慢查询日志,可以使用Redis的持久化功能将日志写入磁盘文件。slowlog 属性是一个链表,链表里的每个节点保存了一个慢查询日志结构,所有日志按添加时 间从新到旧排序,新的日志在链表的左端,旧的日志在链表的右端。原创 2023-12-19 07:00:00 · 1132 阅读 · 0 评论 -
Redis设计与实现之Lua 脚本
所有被 Redis 执行的 Lua 脚本,在 Lua 环境中都会有一个和该脚本相对应的无参数函数:当 调用 EVAL 命令执行脚本时,程序第一步要完成的工作就是为传入的脚本创建一个相应的 Lua 函数。举个例子,当执行命令 EVAL "return 'hello world'" 0 时,Lua 会为脚本 "return 'hello world'" 创建以下函数:其中,函数名以 f_ 为前缀,后跟脚本的 SHA1 校验和(一个 40 个字符长的字符串)拼接而 成。而函数体(body)则是用户输入的脚本。原创 2023-12-19 06:00:00 · 1215 阅读 · 0 评论 -
Redis设计与实现之订阅与发布
Redis 通过 PUBLISH 、SUBSCRIBE 等命令实现了订阅与发布模式,这个功能提供两种信息 机制,分别是订阅/发布到频道和订阅/发布到模式,下文先讨论订阅/发布到频道的实现,再讨 论订阅/发布到模式的实现。原创 2023-12-18 09:42:33 · 1339 阅读 · 0 评论 -
Redis设计与实现之事务
Redis 通过 MULTI 、DISCARD 、EXEC 和 WATCH 四个命令来实现事务功能,本章首先讨 论使用 MULTI 、DISCARD 和 EXEC 三个命令实现的一般事务,然后再来讨论带有 WATCH 的事务的实现。因为事务的安全性也非常重要,所以本章最后通过常见的 ACID 性质对 Redis 事务的安全性进 行了说明。原创 2023-12-18 06:00:00 · 1263 阅读 · 0 评论 -
Redis设计与实现之集合及有序集
其中,destination是新的有序集合的key,numkeys指定参与合并的有序集合的数量,key是要合并的有序集合的key。使用LIMIT选项可以限制返回的元素数量。Redis 集合类型命令的实现,主要是对 intset 和 dict 两个数据结构的操作函数的包装,以及 一些在两种编码之间进行转换的函数,大部分都没有什么需要解释的地方,唯一比较有趣的是 SINTER、SUNION 等命令之下的算法实现,以下三个小节就分别讨论它们所使用的算法。当有序集中的元素有相同的分数时,按照元素的字典序进行排序。原创 2023-12-17 08:00:00 · 1020 阅读 · 0 评论 -
Redis设计与实现之整数集合
contents 数组的int8_t类型声明比较容易让人误解,实际上, intset并不使用 int8_t类型来保存任何元素,结构中的这个类型声明只是作为一个占位符使用:在对 contents 中的元素进行读取或者写入时,程序并不是直接使用 contents 来对元素进行索引,而是根据 encoding的值,对 contents 进行类型转换和指针运算,计算出元素在内存中的正确位置。当然,如果内存确实十分紧张的话,给 intset 添加降级功能也是可以实现的,不过这可能会让 intset 的代码增长一倍。原创 2023-12-16 08:30:00 · 984 阅读 · 0 评论 -
Redis设计与实现之字符串&哈希表&列表
值得一提的是,当程序添加一个新的被阻塞客户端到 server.blocking_keys 字典的链表中 时,它将该客户端放在链表的最后,而当 handleClientsBlockedOnLists 取消客户端的阻塞 时,它从链表的最前面开始取消阻塞:这个链表形成了一个 FIFO 队列,最先被阻塞的客户端 总值最先脱离阻塞状态,Redis 文档称这种模式为先阻塞先服务(FBFS,first-block-first-serve)。新添加的 key-value 对会被添加到压缩列表的表尾。原创 2023-12-17 06:00:00 · 950 阅读 · 0 评论 -
Redis设计与实现之对象处理机制
既然 Redis 的键值对可以保存不同类型的值,那么很自然就需要对键值的类型进行检查以及多态处理。为了让基于类型的操作更加方便地执行,Redis 创建了自己的类型系统。在这一部分,我们将对 Redis 所使用的对象系统进行了解,并分别观察字符串、哈希表、列表、集合和有序集类型的底层实现。原创 2023-12-16 18:26:49 · 956 阅读 · 0 评论 -
Redis设计与实现之跳跃表
跳跃表(skiplist)是一种随机化的数据,由 William Pugh 在论文《Skip lists: a probabilistic alternative to balanced trees》中提出,这种数据结构以有序的方式在层次化的链表中保存元 素,它的效率可以和平衡树媲美——查找、删除、添加等操作都可以在对数期望时间下完成, 并且比起平衡树来说,跳跃表的实现要简单直观得多。在每个有序集合中,Redis维护了一个正常的有序跳跃表,同时还维护了一个用于支持并发的层级跳跃表。原创 2023-12-16 06:00:00 · 901 阅读 · 0 评论 -
Redis设计与实现之双端链表
但是大多数情况下,数据的丢失概率非常低。举个例子:当删除一个 listNode 时,如果包含这个节点的 list 的 list->free 函数不为空, 那么删除函数就会先调用 list->free(listNode->value) 清空节点的值,再执行余下的删除 操作(比如说,释放节点)。双端链表作为一种常见的数据结构,在大部分的数据结构或者算法书里都有讲解,因此,这一 章关注的是 Redis 双端链表的具体实现,以及该实现的 API ,而对于双端链表本身,以及双端 链表所对应的算法,则不做任何解释。原创 2023-12-15 05:45:00 · 1729 阅读 · 0 评论 -
Redis设计与实现之字典
在前面介绍字典的应用时也说到过,一个数据库就是一个字典,数据库里的哈希类型键也是一个字典,当 Redis使用子进程对数据库执行后台持久化任务时(比如执行 BGSAVE或BGREWRITEAOF 时) ,为了最大化地利用系统的 copy on write 机制,程序会暂时将dict_can_resize 设为假,避免执行自然 rehash,从而减少程序对内存的触碰( touch)。另一方面,要求服务器必须阻塞直到 rehash完成,这对于 Redis服务器本身也是不能接受的。原创 2023-12-15 09:00:00 · 849 阅读 · 0 评论 -
Redis设计与实现之简单的动态
Note:“包含字符串值的字符串对象”,这种说法初听上去可能会有点奇怪,但是在 Redis中,一个字符串对象除了可以保存字符串值之外,还可以保存 long类型的值,所以为了严谨起见,这里需要强调一下:当字符串对象保存的是字符串时,它包含的才是 sds值,否则的话,它就是一个long类型的值。执行过 APPEND 命令的字符串会带有额外的预分配空间,这些预分配空间不会被释放,除非 该字符串所对应的键被删除,或者等到关闭 Redis 之后,再次启动时重新载入的字符串对象将 不会有预分配空间。原创 2023-12-14 10:43:50 · 1394 阅读 · 0 评论 -
redis集群
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库。它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如下:字符串类型String散列类型 hashmap列表类型 list集合类型有序集合类型。sortedset。原创 2023-06-08 07:00:00 · 2323 阅读 · 0 评论 -
redis基本操作命令
一、redis键值对的管理和操作1. DEL key该命令用户key存在时删除key2. DUMP key序列化给定的key,并返回被序列化的值3. EXISTS key检查给定 key 是否存在。4. EXPIRE key seconds为给定 key 设置过期时间。5. EXPIREAT key timestampEXPIREAT 的作...原创 2018-12-28 14:34:23 · 557 阅读 · 1 评论