资讯专栏INFORMATION COLUMN

小型Redis完成! | 自己实现Redis源代码(4)

Render / 3637人阅读

摘要:所以为了锻炼自己的数据结构与算法能力,我参照其中一些数据结构的,对诸如动态字符串,双端链表,字典及其内嵌的哈希表等数据结构进行了实现。

缘起

近期在阅读《Redis设计与实现》一书,我发现如果不动手实践,显然是无法真正理解书上奇形怪状的数据结构的。

所以为了锻炼自己的数据结构与算法能力,我参照其中一些数据结构的API,对诸如动态字符串SDS双端链表list字典dict及其内嵌的哈希表dictht等数据结构进行了实现。

当然,为了让他们有用武之地,我在这基础上构建了一个小型Redis,作为自己的学习记录。当然现在的项目功能还不够完善,后期我会慢慢将其完善,恳请批评指教!

github链接



实现流程

如今本项目还只是实现了key-value的存储功能,其他诸如切换数据库、数据持久化等功能将会在后期慢慢实现。

项目实现流程如下:

基本数据结构的构建

客户端服务端的交互

基本命令的实现



原理分析 1.基本数据结构的构建

下面主要介绍数据库结构redisDb的构建,其他数据结构可以参见我的系列文章:

动态字符串SDS的实现 | 自己实现Redis源代码(1)

双端链表list的实现 | 自己实现Redis源代码(2)

字典与哈希表 | 自己实现Redis源代码(3)

数据库redisDb的基本结构如下:



2. 客户端服务端的交互

客户端与服务端的结构如下

两者通过建立网络连接,进行数据交互,完成通信过程。这里的网络连接的建立是通过套接字socket建立的。

在Redis的单机应用中,一个服务端redisServer进程可以处理多个客户端的请求。对多个客户端的处理部分我们通过创建线程来完成。每次检测到有一个客户端进行连接,便为其创建一个工作线程,在其中执行客户端与服务端的通信操作。

服务端含有一个数据库数组,记录保存在服务端的所有数据库,默认数据库数量为16。

客户端含有一个数据库指针,指向其当前正在使用的目标数据库,方便其进行切换数据库操作。



3. 基本命令的实现

这里主要讲解get/set命令的实现。

服务端结构到客户端输入的命令,需要进行一下操作:

1)判断是否为查看类命令

如,查看帮助文档,查看版本信息等;

2)对命令进行分割
3)判断命令关键字

如,命令为set pig 12,切割后我们可以得到["set","pig","12"],通过对关键字set的判断,可以得知其为set命令。

4)检查命令长度
5)执行相关命令



测试结果




文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/17949.html

相关文章

  • PHP程序员学习路线

    摘要:第一阶段基础阶段基础程序员重点把搞熟练核心是安装配置基本操作目标能够完成基本的系统安装,简单配置维护能够做基本的简单系统的开发能够在中型系统中支持某个功能模块的开发。本项不做重点学习,除非对前端有兴趣。 第一阶段:基础阶段(基础PHP程序员) 重点:把LNMP搞熟练(核心是安装配置基本操作) 目标:能够完成基本的LNMP系统安装,简单配置维护;能够做基本的简单系统的PHP开发;能够在P...

    genedna 评论0 收藏0
  • 《HelloGitHub》第 68 期

    摘要:整个项目简单还具有实用价值,可作为的实战项目学习的调试工具栏。查看文档自动在个人首页展示编程时长的工具。通过学习这些前沿的人工智能论文,提前了解在未来更多可能性可以将图片和视频转换成漫画风格的工具。兴趣是最好的老师,HelloGitHub 让你对编程感兴趣!简介HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。https://github.com/521xueweihan...

    番茄西红柿 评论0 收藏2637

发表评论

0条评论

最新活动
阅读需要支付1元查看
<