从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