从0到1手写缓存cache之实现list命令

  1. 抽取公关逻辑到接口command
  • 支持不同命令都能从传入参数中获取键值。

图片

它的实现类就是各个命令。

图片

  1. 通过commands注册所有命令

图片

  1. 通过Reply封装redis返回数据类型

图片

包括整形、错误、简单字符串、复杂字符串和数组。

图片

  1. LPUSH命令的实现
  • 实现command接口
  • 重写name方法
  • 实现执行逻辑exec:获取参数和值,在缓存中实现具体逻辑,返回int类型结果。

图片

在cache中lpush逻辑如下,借用LinkedList的addFirst实现。

图片

底层使用Map作为缓存数据结构, CacheEntry封装值的类型

图片

图片

  1. LPOP命名的实现
  • 实现command接口
  • 重写name方法
  • 实现执行逻辑exec:获取参数和值,在缓存中实现具体逻辑,返回bulkString类型结果。

图片

在cache中缓存的具体逻辑实现如下,借用LinkedList的removeFirst实现。

图片

  1. 测试

通过redis客户端都可以实现命令lpush/lpop/rpush/rpop/lindex/lrange/llen。

图片

  • REDIS 协议规范 https://redis.com.cn/topics/protocol.html在 RESP 中,数据的类型依赖于首字节:单行字符串(Simple Strings): 响应的首字节是 “+”错误(Errors): 响应的首字节是 “-“整型(Integers): 响应的首字节是 “:”多行字符串(Bulk Strings): 响应的首字节是”$“数组(Arrays): 响应的首字节是 “*“RESP协议的不同部分总是以 “\r\n” (CRLF**) 结束。

源码:https://github.com/midnight2104/midnight-cache

从0到1手写缓存cache之实现string命令

  1. 自定义缓存MidnightCache

图片

  1. 实现redis协议

图片

integr编码处理

图片

错误编码处理

图片

数组编码处理

图片

负责字符串处理

图片

  1. 测试

图片

  • REDIS 协议规范 https://redis.com.cn/topics/protocol.html在 RESP 中,数据的类型依赖于首字节:单行字符串(Simple Strings): 响应的首字节是 “+”错误(Errors): 响应的首字节是 “-“整型(Integers): 响应的首字节是 “:”多行字符串(Bulk Strings): 响应的首字节是”$“数组(Arrays): 响应的首字节是 “*“RESP协议的不同部分总是以 “\r\n” (CRLF**) 结束。

源码:https://github.com/midnight2104/midnight-cache

从0到1手写缓存cache之初步实现缓存框架

实现原理如下:

图片

  1. 定义插件接口
  • init初始化方法;
  • startup启动方法;
  • shutdown停止方法;

图片

  1. 实现CacheServer
  • 声明为bean
  • 定义端口6379;
  • 定义boss和worker

图片

在startup方法中定义netty server,添加CacheHandle和CacheDecoder

图片

在shutdown方法中,关闭channel,boss和worker

图片

  1. 实现CacheDecoder

继承ByteToMessageDecoder,从ByteBuf中读取输入,转成String输出

图片

  1. 实现CacheHandle

继承SimpleChannelInboundHandler,重写channelRead0方法。

图片

在channelRead0方法,读取参数,解析命令,支持命令COMMAND,PING,INFO。*和$都是redis协议规范。

图片

解析命令后,构造输出。

图片

  1. 实现MidnightApplicationListener

事件ApplicationReadyEvent启动插件,完成初始化。ContextClosedEvent事件关闭插件。

图片

  1. 测试

启动redis client,命令都可以正常解析。

图片

源码:https://github.com/midnight2104/midnight-cache