突破与重塑:逃离Java舒适区,借Go语言复刻Redis的自我突破和成长

文章目录
    • 写在文章开头
    • 为什么想尝试用go复刻redis
    • 复刻redis的心路历程
    • 程序员对于舒适区的一点看法
    • 关于mini-redis的一些展望
    • 结语

写在文章开头

在程序员的技术生涯长河中,我们常常会在熟悉的领域中建立起自己的“舒适区”。于我而言,Java 就是这片承载了多年奋斗与成果的舒适天地。在过去的时光里,我凭借 Java 技术,在项目开发中如鱼得水,解决了一个又一个难题,收获了无数的经验与成绩。

然而,技术的浪潮滚滚向前,不进则退。在不断探索新技术边界的过程中,我意识到,一直蜷缩在舒适区内,虽然安稳,但也意味着逐渐失去对新技术敏锐的感知和应对变化的能力。为了突破自我,寻求技术上的更大成长,我决定勇敢地迈出这一步——告别 Java 的舒适区,选择 Go 语言开启新的挑战。

而基于 Go 语言复刻 Redis 这个项目,成为了我这场挑战之旅的核心战场。这不仅是不同编程语言之间的转换,更是思维模式、编程习惯的全方位冲击与重塑。在这一年里,我经历了无数次的迷茫与困惑,也收获了数不清的惊喜与突破。现在,站在这一年的末尾,回顾这段充满挑战的历程,感慨万千,有必要好好总结一下这段独特的技术探索之旅中的设计思路和技术心得 。

在这里插入图片描述

为什么想尝试用go复刻redis

由于工作上的需求,作为一名 Java 开发者,我深知 Redis 在实际项目中的重要性。为了更深入地理解和熟练掌握 Redis 的运行机制,我决定仔细研读 Redis 的核心源码实现。在阅读过程中,Redis 对单线程性能极致挖掘的设计理念深深地吸引了我。为了能更透彻地领悟 Redis 设计的精妙之处,我萌生出复刻一个简易版 Redis 的想法。

在过去几年里,因个人学习与实践的需要,我接触到了 Go 语言。对于这门语言的语法和设计理念,不同开发者有着各自的看法。以我个人多年的 Java 开发经验,再结合对 Go 语言的使用感受来说,Go 语言在语法表达上与传统的 Java 语言有着显著区别,它有着更直观形象的表达方式。

就拿 Go 语言中的 channel 管道机制来说,其在数据流向的表达上十分清晰明了。以我正在开发的 mini - redis 为例,在这个项目中,我利用 channel 来监听系统中各种针对 Redis 进程的关闭操作。通过 chan 关键字,整个数据流向和操作逻辑非常直观,让开发者能够迅速理解代码的意图。这种独特的语法表达方式,与我们 Java 语言严谨的面向对象语法体系相比,有着别样的魅力和优势:

//监听针对当前进程的关闭信号
	sigCh := make(chan os.Signal)
	signal.Notify(sigCh, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT)
	go func(server *redisServer) {
		//阻塞监听,收到信号后直接传输到sig上
		sig := <-sigCh
		//针对sig信号类型进行响应处理
		switch sig {
		case syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT://如果是关闭信号,则将redis服务进程关闭
			closeRedisServer()
			//并将关闭标识置为1,通知其他协程也可以开始处理关闭操作
			server.done.Store(1)
		}
	}(&server)

总的来讲,Redis 是一款使用 C 语言编写的内存型非关系型数据库。它涉及大量底层 API 的运用以及复杂的内存管理操作,这使得 Redis 的实现极为精巧且繁杂。

在复刻 Redis 的过程中,需要精准考虑各种函数的语义表达,同时还要兼顾内存管理的高效性。由于 C 语言在底层操作和内存管理方面具有优势,而 Java 虽然功能强大,但在处理这类底层细节时,相对不够灵活,且内存管理成本较高。为了能更好地模拟 Redis 的底层实现逻辑,同时找到一种在函数语义表达和内存管理成本方面更合适的解决方案,我决定走出 Java 的舒适区。

Go 语言虽然对我来说并非像 Java 那样熟练,属于相对陌生的“副手语言”,但它具备简洁高效的语法以及出色的并发性能,在内存管理方面也有着独特的优势,非常适合用来复刻 Redis 这种对底层操作和性能要求极高的项目。因此,我最终选择了 Go 语言开启 Redis 的复刻工作 。

复刻redis的心路历程

依照我的习惯,每当面对一个目标时,我总会遵循一套固定的流程来完成:

  1. 制定计划与目标
  2. 拆解任务,明确规划
  3. 收集相关资料,逐步攻克难题
  4. 进行复盘总结与优化迭代

下面先谈谈制定计划和目标这一环节。Redis 的源码是用 C 语言编写的,而我打算使用 Go 语言进行复刻。对于像我这样以 Java 开发为主的工作者而言,C 语言和 Go 语言都属于相对陌生的领域。因此,在计划的初始阶段,我考虑过挑选一些优质的学习资料,对这两门语言进行系统性的基础学习,以便消除知识盲区。
在有了初步的想法之后,我进一步从综合成本的角度进行考量。考虑到时间成本以及计划推进的效率问题(毕竟我个人本身已经具备一定的 C 语言和 Go 语言基础),我最终决定采用一种更具导向性的方法——项目驱动法。具体来说,就是从宏观层面入手,阅读 Redis 源码,以此来逐步了解其实现的各个步骤。随后,针对在阅读过程中遇到的不同语义、语法以及函数等方面的问题,逐一进行学习和理解,进而全面掌握 Redis 每个模块的实现原理。

所以在上述的综合考量后,笔者的关于复刻计划任务的拆解思路为:

  1. 指定复刻目标,以笔者为例便是实现redis中所有常见数据结构的核心指令,这一点可以参考笔者mini-redis中readme的说明:

在这里插入图片描述

  1. 着手查找各类适配的学习素材,具体包括详细且深入的 Redis 源码讲解资料、能够系统进行 C 语言语法扫盲的学习资源,以及有助于提升 Go 语言进阶使用技巧的相关材料。这一步至关重要,丰富且精准的资料将为后续的学习和复刻工作奠定坚实基础。
  2. 借助获取到的 Redis 源码讲解素材,对 Redis 指令的请求流程、处理方式以及解析思路进行全面且细致的走读分析。在这个过程中,详细记录关键信息,并将整个过程拆解,形成一份条理清晰、逻辑严谨的阅读理解文档。这份文档不仅能够加深对 Redis 指令处理机制的理解,更能为后续的开发工作提供明确指引。基于这份梳理文档,结合自身对项目的理解和规划,制定出贴合实际需求的开发计划。同时,根据开发计划和 Redis 的功能特点,设计并规划与之相关的测试单元,确保开发过程中的每一个环节都能得到有效验证。
  3. 延续上述走读方式,基于 Redis 源码讲解深入探究各种数据结构的设计理念与实现思路。这要求我们从源码层面剖析每一种数据结构的设计初衷、所具备的优势以及如何在实际应用中高效实现。同样,按照前一步骤的方法,将这一过程详细记录并拆解,形成相应的文档。依据这份文档制定开发计划,逐步完成对 Redis 数据结构的复刻工作,确保每一个数据结构的复刻都能准确还原其功能和特性。
  4. 在完成各个阶段的开发和复刻工作之后,进行全面细致的梳理与自我走查。这一过程需要对整个项目进行系统性回顾,从代码逻辑、功能实现到性能优化等各个方面进行深入检查,找出其中存在的不足之处。针对这些问题,制定详细的修复方案,并在接下来的开发周期中予以解决。同时,做好复盘总结工作,分析问题产生的原因,总结经验教训,为后续项目的开发提供宝贵参考,以不断提升开发水平和项目质量。

针对redis的源码阅读的参考资料,笔者不得不推荐一下黄健宏老师的编写的这本《redis设计与实现》

在这里插入图片描述

通过对这本书籍的通篇阅读,笔者非常轻松的从思想层面了解到源码的实现思路,结合书本中的前几章笔者很好的理解掌握的redis底层数据结构的逻辑结构和设计理念,结合书中对于关键点的提示和C语言语法糖扫盲,笔者很好的梳理出Redis源码整体的实现和落地思路细节:

在这里插入图片描述

然后基于笔者输出的这一份拆解文档得出自己的开发计划和复刻思路,从而得出自己的复刻思路,以go语言的姿态复刻出带有C语言味道的mini-redis:

在这里插入图片描述

在完成开发之后,笔者也会梳理出个人的开发思路与不足点与朋友们进行交流,从而得出下一步的迭代计划,也正是这样周而复始的不断前进,笔者终于在2024年完成mini-redis核心数据结构及其操作指令的实现:

在这里插入图片描述

程序员对于舒适区的一点看法

我们再来说说舒适区的这个概念,对笔者而言,在一个领域或者具体一点来说是一门技术、一门语言长时间的接触和使用之后,都会有着一个相对稳定的舒适区,私以为这个舒适区对于工作来说,他可以较好的保证系统迭代的质量,但对于个人发展而言,舒适区的存在往往会因为人的惰性而逐步让人消沉,随着时间的推移可能会让人失去探索的热情。

在这里插入图片描述

这也就是为什么笔者总是喜欢在技术上各种作死的原因,通过在陌生的领域进行摸索、学习、输出总结,感知从未知到已知的过程,保持日常对于跳出舒适区的习惯和节奏,以保持我们对于职业生涯的探索和人情,从而不断的进步。

关于mini-redis的一些展望

回归到技术层面,聊一聊我作为一名对 Redis 源码有着稍微的理解与掌握的程序员,对于mini - redis的展望。

在开发 mini - redis 的过程中,我目前仅仅完成了对几个核心指令的复刻工作。要知道,Redis 作为一款功能强大且应用广泛的内存数据结构存储系统,其蕴含的技术深度和广度远超于此。像持久化机制,它关乎数据在断电等异常情况下的可靠保存,是保障数据完整性的关键部分;缓存置换策略,这决定了在内存有限的情况下,如何高效地替换旧数据以接纳新数据,对系统的性能和资源利用起着至关重要的作用;还有分布式和高可用特性,它们让 Redis 能够适应大规模、高并发的复杂生产环境,确保服务的稳定运行。

很遗憾,到目前为止,对于这些重要的功能模块,我还未来得及在 mini - redis 中完成复刻。在新的一年里,我由衷地希望能有更多志同道合的读者,特别是那些同样热衷于探索底层技术的朋友们,能够和我保持密切的交流。我们可以一起深入剖析 Redis 这些功能点在源码层面的实现思路,从数据结构的设计、算法的优化到系统架构的考量,全方位地进行探讨。我相信,通过大家的智慧碰撞,一定能够推动 mini - redis 不断发展前进,让它逐渐成为一个更加完善、功能更加丰富的 Redis 复刻项目。

结语

在这一年即将画上句号之际,我内心满是感激之情,想要特别感谢sharkChili技术交流圈里的每一位读者(尤其是建立之初积极助力吸引读者的Leo、强总、人生大佬、知秋大佬、渣凯、李现同学以及好学的人生弟)。

这一年来,大家围绕Redis技术点展开的日常提问与积极交流,就像源源不断的动力,极大地激发了我深入钻研Redis的热情。每一次与大家探讨那些复杂的技术难题,每一回解答大家提出的疑惑,都让我对Redis有了更为透彻的认知,也促使我在这条技术探索之路上不断迈进。

在这里插入图片描述

在这里插入图片描述

正是因为有你们的存在,这个交流圈充满了活力与智慧的碰撞。你们的每一个问题,都像是打开新知识大门的钥匙;你们分享的每一种见解,都丰富了我对Redis技术体系的理解。所以,真心地向大家致以我最诚挚的感谢。

新的一年已经悄然来临,衷心希望我们能够携手并进,在技术的海洋里继续畅游。无论是Redis技术的新领域,还是其他相关的技术方向,都期待我们能一同挖掘更多的宝藏,实现更大的突破。希望大家在追求技术成长的道路上,都能遇见更好的自己,收获满满的成就感。

另外,我还要把这份感谢送给渣凯小同学。从你身上,我真切地看到了软件行业蓬勃的新生力量。你积极进取的态度和对新技术的敏锐洞察力,都让我深感欣慰。你就像一颗正在崛起的新星,闪耀着无限的潜力。

在新的行业征程中,愿你能凭借自身的才华和努力,稳扎稳打地前行。希望你在面对各种挑战时,都能保持那份热情与执着,不断积累经验,攻克一个又一个难关。衷心祝愿你在这个充满机遇与挑战的领域里有所建树,创造出属于自己的辉煌成就 ,在新赛道增添一抹绚丽的色彩。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/968192.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【自然语言处理】TextRank 算法提取关键词、短语、句(Python源码实现)

文章目录 一、TextRank 算法提取关键词 [工具包]二、TextRank 算法提取关键短语[工具包]三、TextRank 算法提取关键句[工具包]四、TextRank 算法提取关键句&#xff08;Python源码实现&#xff09; 一、TextRank 算法提取关键词 [工具包] 见链接 【自然语言处理】TextRank 算法…

展厅为何倾向使用三维数字沙盘进行多媒体互动设计?优势探讨!

随着数字技术的迅猛进步&#xff0c;展厅多媒体互动设计正迎来深刻变革。其中&#xff0c;三维数字沙盘作为经典沙盘模型的革新之作&#xff0c;不仅保留了其空间布局直观展示的优点&#xff0c;更巧妙融入光影互动与中控系统&#xff0c;推动展览展示向智能化迈进。今日&#…

SDKMAN! 的英文全称是 Software Development Kit Manager(软件开发工具包管理器)

文章目录 SDKMAN! 的核心功能SDKMAN! 的常用命令SDKMAN! 的优势总结 SDKMAN! 的英文全称是 Software Development Kit Manager。它是一个用于管理多个软件开发工具&#xff08;如 Java、Groovy、Scala、Kotlin 等&#xff09;版本的工具。SDKMAN! 提供了一个简单的方式来安装、…

java配置api,vue网页调用api从oracle数据库读取数据

一、主入口文件 1&#xff1a;java后端端口号 2&#xff1a;数据库类型 和 数据库所在服务器ip地址 3&#xff1a;服务器用户名和密码 二、映射数据库表中的数据 resources/mapper/.xml文件 1&#xff1a;column后变量名是数据库中存储的变量名 property的值是column值的…

蓝桥杯C语言组:分治问题研究

蓝桥杯C语言组分治问题研究 摘要 本文针对蓝桥杯C语言组中的分治问题展开深入研究&#xff0c;详细介绍了分治算法的原理、实现方法及其在解决复杂问题中的应用。通过对经典例题的分析与代码实现&#xff0c;展示了分治算法在提高编程效率和解决实际问题中的重要作用&#xff…

Golang GORM系列:GORM CRUM操作实战

在数据库管理中&#xff0c;CRUD操作是应用程序的主干&#xff0c;支持数据的创建、检索、更新和删除。强大的Go对象关系映射库GORM通过抽象SQL语句的复杂性&#xff0c;使这些操作变得轻而易举。本文是掌握使用GORM进行CRUD操作的全面指南&#xff0c;提供了在Go应用程序中有效…

如何评估云原生GenAI应用开发中的安全风险(下)

以上就是如何评估云原生GenAI应用开发中的安全风险系列中的上篇内容&#xff0c;在本篇中我们介绍了在云原生AI应用开发中不同层级的风险&#xff0c;并了解了如何定义AI系统的风险。在本系列下篇中我们会继续探索我们为我们的云原生AI应用评估风险的背景和意义&#xff0c;并且…

2025 年 2 月 TIOBE 指数

2025 年 2 月 TIOBE 指数 二月头条:快,更快,最快! 现在,世界需要每秒处理越来越多的数字,而硬件的发展速度却不够快,程序的速度变得越来越重要。话虽如此,快速编程语言在 TIOBE 指数中取得进展也就不足为奇了。编程语言 C++ 最近攀升至第 2 位,Go 已稳居前 10 名,Ru…

YOLOv11实时目标检测 | 摄像头视频图片文件检测

在上篇文章中YOLO11环境部署 || 从检测到训练https://blog.csdn.net/2301_79442295/article/details/145414103#comments_36164492&#xff0c;我们详细探讨了YOLO11的部署以及推理训练&#xff0c;但是评论区的观众老爷就说了&#xff1a;“博主博主&#xff0c;你这个只能推理…

Segformer模型的平台部署和项目应用

最近因为离职太忙了之前的很多内容没有更新&#xff0c;离开BYD进入新的环境中成长。 本文包含了Segformer的网络结构重构后如何部署到算法平台中方便标注训练推理的过程&#xff0c;以及如何应用到项目中&#xff08;BYD最后一个项目&#xff1a;异物检测系统&#xff09; C做…

react redux用法学习

参考资料&#xff1a; https://www.bilibili.com/video/BV1ZB4y1Z7o8 https://cn.redux.js.org/tutorials/essentials/part-5-async-logic AI工具&#xff1a;deepseek&#xff0c;通义灵码 第一天 安装相关依赖&#xff1a; 使用redux的中间件&#xff1a; npm i react-redu…

【2025 Unity Meta Quest MR 开发教程】透视 Passthrough 模块配置(戴上头显看见现实画面)

XR 开发者社区&#xff1a;https://www.spatialxr.tech/ 文章目录 &#x1f4d5;导入透视模块&#x1f4d5;OVRManager&#x1f4d5;OVRPassthroughLayer 脚本&#x1f4d5;相机 教程中使用的 SDK&#xff1a;Meta XR SDK v72&#xff08;可以从 Unity 资源商店添加 Meta XR A…

UWB功耗大数据插桩调研

一、摘要 UWB功耗点 插桩点 日志关键字 电流 蓝牙持锁 BatteryStats的锁统计 vendor_bluetooth_lock 30~40mA 测距 UwbSessionManager.startRanging UwbSessionManager.stoptRanging 或接入fadiKey Uwb状态广播 "com.fadiui.dkservice.action.uwb.state.change&q…

旅游行业内容管理系统CMS提升网站建设效率与体验

内容概要 在如今快速发展的互联网时代&#xff0c;旅游行业对网站的要求越来越高&#xff0c;内容管理系统&#xff08;CMS&#xff09;的应用不可或缺。以 Baklib 为代表的先进CMS可显著提高旅游网站的建设效率与用户体验。为了满足不断变化的市场需求&#xff0c;这些系统通…

【vscode+latex】实现overleaf本地高效编译

overleaf本地高效编译 1. 配置本地latex环境2. vscode插件与配置3. 使用 之前觉得用overleaf在线写论文很方便&#xff0c;特别是有辅助生成latex格式公式的网页&#xff0c;不需要在word上一个一个手打调格式。 然而&#xff0c;最近在写一篇论文的时候&#xff0c;由于这篇论…

消费电子产品中的噪声对TPS54202的影响

本文章是笔者整理的备忘笔记。希望在帮助自己温习避免遗忘的同时&#xff0c;也能帮助其他需要参考的朋友。如有谬误&#xff0c;欢迎大家进行指正。 一、概述 在白色家电领域&#xff0c;降压转换器的应用非常广泛&#xff0c;为了实现不同的功能就需要不同的电源轨。TPS542…

51c自动驾驶~合集49

我自己的原文哦~ https://blog.51cto.com/whaosoft/13164876 #Ultra-AV 轨迹预测新基准&#xff01;清华开源&#xff1a;统一自动驾驶纵向轨迹数据集 自动驾驶车辆在交通运输领域展现出巨大潜力&#xff0c;而理解其纵向驾驶行为是实现安全高效自动驾驶的关键。现有的开…

IGBT的两级关断

IGBT&#xff08;绝缘栅双极型晶体管&#xff09;的两级关断&#xff08;Two-stage turn-off&#xff09;是一种优化关断过程的方法&#xff0c;主要用于减少关断时的电压过冲和dv/dt&#xff08;电压变化率&#xff09;过高的问题&#xff0c;特别是在大功率应用中&#xff08…

centos 7 关于引用stdatomic.h的问题

问题&#xff1a;/tmp/tmp4usxmdso/main.c:6:23: fatal error: stdatomic.h: No such file or directory #include <stdatomic.h> 解决步骤&#xff1a; 1.这个错误是因为缺少C编译器的标准原子操作头文件 stdatomic.h。在Linux系统中&#xff0c;我们需要安装开发工具…

20250211解决荣品的RK3566核心板在Android13下出现charge_extrem_low_power的问题

20250211解决荣品的RK3566核心板在Android13下出现charge_extrem_low_power的问题 2025/2/11 17:45 缘起&#xff1a;荣品的RK3566核心板在Android13下&#xff0c;出现charge_extrem_low_power之后就直接挂住了。 由于我司使用了CW2217这个电量计&#xff0c;没有使用核心板自…