LIKE-Redis--一个简易版的仿Redis服务端

1.首先呢,我们要来了解一下Redis

1.1简介

Redis是一个开源的,底层用c语言编写的,遵守BSD协议,支持网络的key-value存储的数据库..它提供了丰富的数据结构:所存储的值可以是String(字符串) , Hash(哈希)  , List(链表) , set(集合) , zset(有序集合);

1.2BSD协议

 

1.3Redis的数据类型

Redis是以  key-value的形式存储的

key为String(string 类型是二进制安全的。意思是redis 的string 可以包含任何数据)

value为字符串(String),哈希(Hash),列表(List),集合(Set)和有序集合(sorted Set)等类型。

2.项目实现:

2.1项目简介:

     模拟实现redis服务端

2.2思路流程图

2.3具体实现

实现过程:

  • 使用Socket套接字实现服务器与客户端的连接
  • 字节流对象遵循BSD协议规则反序列化为Java对象(Object)Protocol:字节流-------->java对象
  • 确认对象类型并转换为所属类型,通过反射机制找到其相应的类
  • 该类从数据库(并非磁盘中的数据库,是存放数据的一个类)中得到数据
  • 在该类中对所收到的数据与数据库中的数据信息结合处理
  • 把处理完毕信息状态(Java对象)遵循BSD协议规则序列化为字节流响应给client

具体实现:

一个用户与服务端的交互:

 1.协议解析-------.字节流对象遵循BSD协议规则反序列化为Java对象

        实现此过程,主要基本d的I/O流处理操作,字符读取结束的判断

 2.确认对象类型并转换为所属类型,通过反射机制找到其相应的类

 3.在该类对象中处理指令,目前实现了LPUSH,LRANGE,HSET,HGET四个指令

 4.指令执行成功与否,都要向用户反馈,成功,告知用户该操作成功,否则告诉用户输入存在问题。

并发用户与服务端的交互

使用线程池来处理多个用户请求。每连接到一个用户,就会有一个线程去执行任务。

我写的服务器上把ServerSocker的端口号固定为Redis的端口号,下载一个redis-2.4.5-win32-win64,使用该客户端连接我的服务器,检测各个功仍然能正常实现。

2.4运行结果

3.测试

 

4.难点

刚开始写的是单个客户端连接服务器,然后给老师看了一下,老师说让我改成多进程的,即多个客户端,我刚开始是懵的,因为我刚开始只是知道redis是单线程的,心里想怎么能用多线程实现呢,但是老师当时有点忙,就让我自己去查查资料,经过查资料,

1.发现,客户端和服务器是socket通信方式,socket服务端监听可同时接受多个客户端请求。这里可以理解为本质上与redis无关,这里仅仅做网络连接

2.redis会基于这些建立的连接去探测哪个连接已经接收完了客户端的请求数据(注意:不是探测哪个连接建立好了,而是探测哪个接收完了请求数据),而且这里的探测动作就是单线程的开始,一旦探测到则基于接收到的数据开始数据处理阶段,然后返回数据,再继续探测下一个已经接收完请求数据的网络连接。注意,从探测到数据处理再到数据返回,全程单线程。这应该就是所谓的redis单线程。

5.源码

https://github.com/Rong0825/LIKE-Redis

      

 

 

 

 

 

 

Guess you like

Origin blog.csdn.net/qq_40408443/article/details/100100125