forked from p53841790/wheat-cache
!73 storage 的 listx
Merge pull request !73 from bandl/feat-listx-option
This commit is contained in:
commit
ab277fb66e
|
@ -0,0 +1,32 @@
|
|||
### 构建工具文档
|
||||
|
||||
#### dcgen
|
||||
1. 根据结构体接口模板生成 proto 文件
|
||||
2. 迁移 proto 到 pkg/proto 下
|
||||
3. 更新结构体常量
|
||||
|
||||
>PS : 开发一个 storage 的新接口时一般有以下步骤
|
||||
>1. 修改 storage 接口配置文件
|
||||
>2. make dcgen
|
||||
>3. 修改生成的 proto 文件
|
||||
>4. make dcgen
|
||||
>5. 添加 storage 的操作接口
|
||||
|
||||
|
||||
#### build-storage
|
||||
编译并且生成 /bin/storage
|
||||
|
||||
#### build-gateway
|
||||
编译并且生成 /bin/gateway
|
||||
|
||||
#### install
|
||||
1. 安装项目,需要 sudo
|
||||
|
||||
#### storage
|
||||
根据配置文件启动 storage
|
||||
|
||||
#### gateway
|
||||
根据配置文件启动 gateway
|
||||
|
||||
#### init-conf
|
||||
根据配置文件文档初始化配置文件到 /etc/wheat-cache/wheat-cache.yaml
|
|
@ -1,17 +0,0 @@
|
|||
## 构建工具文档
|
||||
|
||||
### 构建 proto (grpc-go)
|
||||
```shell
|
||||
make dcgen
|
||||
```
|
||||
|
||||
### 编译全部的 go 项目
|
||||
```shell
|
||||
make build
|
||||
```
|
||||
|
||||
### 启动 storage 服务
|
||||
```shell
|
||||
make dev
|
||||
```
|
||||
### 根据配置生成 结构体命令
|
|
@ -29,7 +29,7 @@ type MiddleToolsInterface interface {
|
|||
}
|
||||
|
||||
### 插件的New方法规定为 NewMiddleWare()
|
||||
每个插件都要定义NewMiddleWare()
|
||||
每个插件都要定义 NewMiddleWare()
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,60 @@
|
|||
### 结构体开发文档
|
||||
|
||||
#### 基础结构体开发
|
||||
|
||||
- 基础结构体放到 /pkg/structure。
|
||||
|
||||
- 每个结构 类型都以 x 结尾,如 listx, stringx。
|
||||
|
||||
- 在 pkg/structure/define.go 文件中添加对应结构体的接口,主要为 了保证项目可以扩展线程安全结构体, 以及结构体接口的实现, 目前 lru 采用 single 模式, 可以只开发 single 的结构体,如 stringxSingle。
|
||||
|
||||
- 请在结构体包中 补充单元测试。
|
||||
|
||||
#### 目前实现结构体接口说明
|
||||
|
||||
> ps: 所有的详细用法都可以查看单元测试文件。
|
||||
|
||||
```go
|
||||
// stringx
|
||||
type StringXInterface interface {
|
||||
KeyBaseInterface
|
||||
// 重新设置一个 值
|
||||
Set(string) (string, UpdateLength)
|
||||
// 获取值的 string 形式
|
||||
Get() string
|
||||
// 值自动增加 一个值,只对 float 和 string 有效
|
||||
Add(int32) (string, error)
|
||||
// 值自动增加 减少值,只对 float 和 string 有效
|
||||
Reduce(int32) (string, error)
|
||||
// 使用位图类型
|
||||
Setbit(int32, bool) UpdateLength
|
||||
Getbit(int32) (bool, error)
|
||||
// 获取字符串的切片
|
||||
Getrange(start, end int32) (string, error)
|
||||
GetLength() int
|
||||
}
|
||||
|
||||
// listx
|
||||
type ListXInterface interface {
|
||||
KeyBaseInterface
|
||||
LPush(...string) UpdateLength
|
||||
RPush(...string) UpdateLength
|
||||
LPop(int) ([]string, UpdateLength)
|
||||
RPop(int) ([]string, UpdateLength)
|
||||
Index(int) (string, error)
|
||||
// 插入一组数据, bool 类型表示是否右插(尾插),false 时采用左插(头插)
|
||||
Insert(int, bool, ...string) (UpdateLength, error)
|
||||
Length() int
|
||||
// 切片, O(n)复杂度
|
||||
Slice(start, end int) (UpdateLength, error)
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
### structure.Value 类型
|
||||
- 结构体的数据区域全部使用 structure.Value 类型存储。
|
||||
- structure.Value 主要实现了 sting, int64, float64 的存储接口。
|
||||
- structure.Value 非常容易计算内存占用。
|
||||
- structure.UpdateLength 指的是在进行某一个操作以后,内存大小的变化。
|
||||
- 为了保证 lru 的存储效率,lru 不会去遍历全部的 key 来重新计算大小,而是根据 UpdateLength 来动态更新 lru 的大小,具体实现在 dao 中。
|
||||
- structure.Value 类型的使用方法可以在 pkg/structure/value_test.go 中获取。
|
File diff suppressed because it is too large
Load Diff
|
@ -30,35 +30,66 @@ var File_storage_proto protoreflect.FileDescriptor
|
|||
|
||||
var file_storage_proto_rawDesc = []byte{
|
||||
0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,
|
||||
0x0d, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x78, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0xa2,
|
||||
0x03, 0x0a, 0x0a, 0x43, 0x6f, 0x6d, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x20, 0x0a,
|
||||
0x03, 0x53, 0x65, 0x74, 0x12, 0x0b, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
|
||||
0x74, 0x1a, 0x0c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
|
||||
0x20, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x0b, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75,
|
||||
0x65, 0x73, 0x74, 0x1a, 0x0c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
|
||||
0x65, 0x12, 0x20, 0x0a, 0x03, 0x41, 0x64, 0x64, 0x12, 0x0b, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65,
|
||||
0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f,
|
||||
0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x52, 0x65, 0x64, 0x75, 0x63, 0x65, 0x12, 0x0e, 0x2e,
|
||||
0x52, 0x65, 0x64, 0x75, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e,
|
||||
0x52, 0x65, 0x64, 0x75, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29,
|
||||
0x0a, 0x06, 0x53, 0x65, 0x74, 0x62, 0x69, 0x74, 0x12, 0x0e, 0x2e, 0x53, 0x65, 0x74, 0x62, 0x69,
|
||||
0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x53, 0x65, 0x74, 0x62, 0x69,
|
||||
0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x47, 0x65, 0x74,
|
||||
0x62, 0x69, 0x74, 0x12, 0x0e, 0x2e, 0x47, 0x65, 0x74, 0x62, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75,
|
||||
0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x47, 0x65, 0x74, 0x62, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70,
|
||||
0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x72, 0x61, 0x6e, 0x67, 0x65,
|
||||
0x12, 0x10, 0x2e, 0x47, 0x65, 0x74, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
|
||||
0x73, 0x74, 0x1a, 0x11, 0x2e, 0x47, 0x65, 0x74, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73,
|
||||
0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x73, 0x65, 0x74, 0x12,
|
||||
0x0e, 0x2e, 0x47, 0x65, 0x74, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
|
||||
0x0f, 0x2e, 0x47, 0x65, 0x74, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
|
||||
0x12, 0x29, 0x0a, 0x06, 0x53, 0x74, 0x72, 0x6c, 0x65, 0x6e, 0x12, 0x0e, 0x2e, 0x53, 0x74, 0x72,
|
||||
0x6c, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x53, 0x74, 0x72,
|
||||
0x6c, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x05, 0x53,
|
||||
0x65, 0x74, 0x6e, 0x78, 0x12, 0x0d, 0x2e, 0x53, 0x65, 0x74, 0x6e, 0x78, 0x52, 0x65, 0x71, 0x75,
|
||||
0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x53, 0x65, 0x74, 0x6e, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f,
|
||||
0x6e, 0x73, 0x65, 0x42, 0x0b, 0x5a, 0x09, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
|
||||
0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
0x0d, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x78, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0b,
|
||||
0x6c, 0x69, 0x73, 0x74, 0x78, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0xff, 0x06, 0x0a, 0x0a,
|
||||
0x43, 0x6f, 0x6d, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x03, 0x53, 0x65,
|
||||
0x74, 0x12, 0x0b, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0c,
|
||||
0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x03,
|
||||
0x47, 0x65, 0x74, 0x12, 0x0b, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
|
||||
0x1a, 0x0c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20,
|
||||
0x0a, 0x03, 0x41, 0x64, 0x64, 0x12, 0x0b, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65,
|
||||
0x73, 0x74, 0x1a, 0x0c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
|
||||
0x12, 0x29, 0x0a, 0x06, 0x52, 0x65, 0x64, 0x75, 0x63, 0x65, 0x12, 0x0e, 0x2e, 0x52, 0x65, 0x64,
|
||||
0x75, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x52, 0x65, 0x64,
|
||||
0x75, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x53,
|
||||
0x65, 0x74, 0x62, 0x69, 0x74, 0x12, 0x0e, 0x2e, 0x53, 0x65, 0x74, 0x62, 0x69, 0x74, 0x52, 0x65,
|
||||
0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x53, 0x65, 0x74, 0x62, 0x69, 0x74, 0x52, 0x65,
|
||||
0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x62, 0x69, 0x74,
|
||||
0x12, 0x0e, 0x2e, 0x47, 0x65, 0x74, 0x62, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
|
||||
0x1a, 0x0f, 0x2e, 0x47, 0x65, 0x74, 0x62, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
|
||||
0x65, 0x12, 0x2f, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x10, 0x2e,
|
||||
0x47, 0x65, 0x74, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
|
||||
0x11, 0x2e, 0x47, 0x65, 0x74, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
|
||||
0x73, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x73, 0x65, 0x74, 0x12, 0x0e, 0x2e, 0x47,
|
||||
0x65, 0x74, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x47,
|
||||
0x65, 0x74, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a,
|
||||
0x06, 0x53, 0x74, 0x72, 0x6c, 0x65, 0x6e, 0x12, 0x0e, 0x2e, 0x53, 0x74, 0x72, 0x6c, 0x65, 0x6e,
|
||||
0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x53, 0x74, 0x72, 0x6c, 0x65, 0x6e,
|
||||
0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x05, 0x53, 0x65, 0x74, 0x6e,
|
||||
0x78, 0x12, 0x0d, 0x2e, 0x53, 0x65, 0x74, 0x6e, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
|
||||
0x1a, 0x0e, 0x2e, 0x53, 0x65, 0x74, 0x6e, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
|
||||
0x12, 0x29, 0x0a, 0x06, 0x4c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x0e, 0x2e, 0x4c, 0x69, 0x6e,
|
||||
0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x4c, 0x69, 0x6e,
|
||||
0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x04, 0x4c,
|
||||
0x6c, 0x65, 0x6e, 0x12, 0x0c, 0x2e, 0x4c, 0x6c, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
|
||||
0x74, 0x1a, 0x0d, 0x2e, 0x4c, 0x6c, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
|
||||
0x12, 0x23, 0x0a, 0x04, 0x4c, 0x70, 0x6f, 0x70, 0x12, 0x0c, 0x2e, 0x4c, 0x70, 0x6f, 0x70, 0x52,
|
||||
0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x4c, 0x70, 0x6f, 0x70, 0x52, 0x65, 0x73,
|
||||
0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x05, 0x4c, 0x70, 0x75, 0x73, 0x68, 0x12, 0x0d,
|
||||
0x2e, 0x4c, 0x70, 0x75, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e,
|
||||
0x4c, 0x70, 0x75, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a,
|
||||
0x06, 0x4c, 0x70, 0x75, 0x73, 0x68, 0x78, 0x12, 0x0e, 0x2e, 0x4c, 0x70, 0x75, 0x73, 0x68, 0x78,
|
||||
0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x4c, 0x70, 0x75, 0x73, 0x68, 0x78,
|
||||
0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x4c, 0x72, 0x61, 0x6e,
|
||||
0x67, 0x65, 0x12, 0x0e, 0x2e, 0x4c, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
|
||||
0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x4c, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f,
|
||||
0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x04, 0x4c, 0x72, 0x65, 0x6d, 0x12, 0x0c, 0x2e, 0x4c, 0x72,
|
||||
0x65, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x4c, 0x72, 0x65, 0x6d,
|
||||
0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x04, 0x4c, 0x73, 0x65, 0x74,
|
||||
0x12, 0x0c, 0x2e, 0x4c, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d,
|
||||
0x2e, 0x4c, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a,
|
||||
0x04, 0x52, 0x70, 0x6f, 0x70, 0x12, 0x0c, 0x2e, 0x52, 0x70, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75,
|
||||
0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x52, 0x70, 0x6f, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
|
||||
0x73, 0x65, 0x12, 0x26, 0x0a, 0x05, 0x4c, 0x74, 0x72, 0x69, 0x6d, 0x12, 0x0d, 0x2e, 0x4c, 0x74,
|
||||
0x72, 0x69, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x4c, 0x74, 0x72,
|
||||
0x69, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x05, 0x52, 0x70,
|
||||
0x75, 0x73, 0x68, 0x12, 0x0d, 0x2e, 0x52, 0x70, 0x75, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65,
|
||||
0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x52, 0x70, 0x75, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
|
||||
0x73, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x52, 0x70, 0x75, 0x73, 0x68, 0x78, 0x12, 0x0e, 0x2e, 0x52,
|
||||
0x70, 0x75, 0x73, 0x68, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x52,
|
||||
0x70, 0x75, 0x73, 0x68, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x0b, 0x5a,
|
||||
0x09, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
|
||||
0x6f, 0x33,
|
||||
}
|
||||
|
||||
var file_storage_proto_goTypes = []interface{}{
|
||||
|
@ -72,16 +103,40 @@ var file_storage_proto_goTypes = []interface{}{
|
|||
(*GetsetRequest)(nil), // 7: GetsetRequest
|
||||
(*StrlenRequest)(nil), // 8: StrlenRequest
|
||||
(*SetnxRequest)(nil), // 9: SetnxRequest
|
||||
(*SetResponse)(nil), // 10: SetResponse
|
||||
(*GetResponse)(nil), // 11: GetResponse
|
||||
(*AddResponse)(nil), // 12: AddResponse
|
||||
(*ReduceResponse)(nil), // 13: ReduceResponse
|
||||
(*SetbitResponse)(nil), // 14: SetbitResponse
|
||||
(*GetbitResponse)(nil), // 15: GetbitResponse
|
||||
(*GetrangeResponse)(nil), // 16: GetrangeResponse
|
||||
(*GetsetResponse)(nil), // 17: GetsetResponse
|
||||
(*StrlenResponse)(nil), // 18: StrlenResponse
|
||||
(*SetnxResponse)(nil), // 19: SetnxResponse
|
||||
(*LindexRequest)(nil), // 10: LindexRequest
|
||||
(*LlenRequest)(nil), // 11: LlenRequest
|
||||
(*LpopRequest)(nil), // 12: LpopRequest
|
||||
(*LpushRequest)(nil), // 13: LpushRequest
|
||||
(*LpushxRequest)(nil), // 14: LpushxRequest
|
||||
(*LrangeRequest)(nil), // 15: LrangeRequest
|
||||
(*LremRequest)(nil), // 16: LremRequest
|
||||
(*LsetRequest)(nil), // 17: LsetRequest
|
||||
(*RpopRequest)(nil), // 18: RpopRequest
|
||||
(*LtrimRequest)(nil), // 19: LtrimRequest
|
||||
(*RpushRequest)(nil), // 20: RpushRequest
|
||||
(*RpushxRequest)(nil), // 21: RpushxRequest
|
||||
(*SetResponse)(nil), // 22: SetResponse
|
||||
(*GetResponse)(nil), // 23: GetResponse
|
||||
(*AddResponse)(nil), // 24: AddResponse
|
||||
(*ReduceResponse)(nil), // 25: ReduceResponse
|
||||
(*SetbitResponse)(nil), // 26: SetbitResponse
|
||||
(*GetbitResponse)(nil), // 27: GetbitResponse
|
||||
(*GetrangeResponse)(nil), // 28: GetrangeResponse
|
||||
(*GetsetResponse)(nil), // 29: GetsetResponse
|
||||
(*StrlenResponse)(nil), // 30: StrlenResponse
|
||||
(*SetnxResponse)(nil), // 31: SetnxResponse
|
||||
(*LindexResponse)(nil), // 32: LindexResponse
|
||||
(*LlenResponse)(nil), // 33: LlenResponse
|
||||
(*LpopResponse)(nil), // 34: LpopResponse
|
||||
(*LpushResponse)(nil), // 35: LpushResponse
|
||||
(*LpushxResponse)(nil), // 36: LpushxResponse
|
||||
(*LrangeResponse)(nil), // 37: LrangeResponse
|
||||
(*LremResponse)(nil), // 38: LremResponse
|
||||
(*LsetResponse)(nil), // 39: LsetResponse
|
||||
(*RpopResponse)(nil), // 40: RpopResponse
|
||||
(*LtrimResponse)(nil), // 41: LtrimResponse
|
||||
(*RpushResponse)(nil), // 42: RpushResponse
|
||||
(*RpushxResponse)(nil), // 43: RpushxResponse
|
||||
}
|
||||
var file_storage_proto_depIdxs = []int32{
|
||||
0, // 0: CommServer.Set:input_type -> SetRequest
|
||||
|
@ -94,18 +149,42 @@ var file_storage_proto_depIdxs = []int32{
|
|||
7, // 7: CommServer.Getset:input_type -> GetsetRequest
|
||||
8, // 8: CommServer.Strlen:input_type -> StrlenRequest
|
||||
9, // 9: CommServer.Setnx:input_type -> SetnxRequest
|
||||
10, // 10: CommServer.Set:output_type -> SetResponse
|
||||
11, // 11: CommServer.Get:output_type -> GetResponse
|
||||
12, // 12: CommServer.Add:output_type -> AddResponse
|
||||
13, // 13: CommServer.Reduce:output_type -> ReduceResponse
|
||||
14, // 14: CommServer.Setbit:output_type -> SetbitResponse
|
||||
15, // 15: CommServer.Getbit:output_type -> GetbitResponse
|
||||
16, // 16: CommServer.Getrange:output_type -> GetrangeResponse
|
||||
17, // 17: CommServer.Getset:output_type -> GetsetResponse
|
||||
18, // 18: CommServer.Strlen:output_type -> StrlenResponse
|
||||
19, // 19: CommServer.Setnx:output_type -> SetnxResponse
|
||||
10, // [10:20] is the sub-list for method output_type
|
||||
0, // [0:10] is the sub-list for method input_type
|
||||
10, // 10: CommServer.Lindex:input_type -> LindexRequest
|
||||
11, // 11: CommServer.Llen:input_type -> LlenRequest
|
||||
12, // 12: CommServer.Lpop:input_type -> LpopRequest
|
||||
13, // 13: CommServer.Lpush:input_type -> LpushRequest
|
||||
14, // 14: CommServer.Lpushx:input_type -> LpushxRequest
|
||||
15, // 15: CommServer.Lrange:input_type -> LrangeRequest
|
||||
16, // 16: CommServer.Lrem:input_type -> LremRequest
|
||||
17, // 17: CommServer.Lset:input_type -> LsetRequest
|
||||
18, // 18: CommServer.Rpop:input_type -> RpopRequest
|
||||
19, // 19: CommServer.Ltrim:input_type -> LtrimRequest
|
||||
20, // 20: CommServer.Rpush:input_type -> RpushRequest
|
||||
21, // 21: CommServer.Rpushx:input_type -> RpushxRequest
|
||||
22, // 22: CommServer.Set:output_type -> SetResponse
|
||||
23, // 23: CommServer.Get:output_type -> GetResponse
|
||||
24, // 24: CommServer.Add:output_type -> AddResponse
|
||||
25, // 25: CommServer.Reduce:output_type -> ReduceResponse
|
||||
26, // 26: CommServer.Setbit:output_type -> SetbitResponse
|
||||
27, // 27: CommServer.Getbit:output_type -> GetbitResponse
|
||||
28, // 28: CommServer.Getrange:output_type -> GetrangeResponse
|
||||
29, // 29: CommServer.Getset:output_type -> GetsetResponse
|
||||
30, // 30: CommServer.Strlen:output_type -> StrlenResponse
|
||||
31, // 31: CommServer.Setnx:output_type -> SetnxResponse
|
||||
32, // 32: CommServer.Lindex:output_type -> LindexResponse
|
||||
33, // 33: CommServer.Llen:output_type -> LlenResponse
|
||||
34, // 34: CommServer.Lpop:output_type -> LpopResponse
|
||||
35, // 35: CommServer.Lpush:output_type -> LpushResponse
|
||||
36, // 36: CommServer.Lpushx:output_type -> LpushxResponse
|
||||
37, // 37: CommServer.Lrange:output_type -> LrangeResponse
|
||||
38, // 38: CommServer.Lrem:output_type -> LremResponse
|
||||
39, // 39: CommServer.Lset:output_type -> LsetResponse
|
||||
40, // 40: CommServer.Rpop:output_type -> RpopResponse
|
||||
41, // 41: CommServer.Ltrim:output_type -> LtrimResponse
|
||||
42, // 42: CommServer.Rpush:output_type -> RpushResponse
|
||||
43, // 43: CommServer.Rpushx:output_type -> RpushxResponse
|
||||
22, // [22:44] is the sub-list for method output_type
|
||||
0, // [0:22] is the sub-list for method input_type
|
||||
0, // [0:0] is the sub-list for extension type_name
|
||||
0, // [0:0] is the sub-list for extension extendee
|
||||
0, // [0:0] is the sub-list for field type_name
|
||||
|
@ -117,6 +196,7 @@ func file_storage_proto_init() {
|
|||
return
|
||||
}
|
||||
file_stringx_proto_init()
|
||||
file_listx_proto_init()
|
||||
type x struct{}
|
||||
out := protoimpl.TypeBuilder{
|
||||
File: protoimpl.DescBuilder{
|
||||
|
@ -158,6 +238,18 @@ type CommServerClient interface {
|
|||
Getset(ctx context.Context, in *GetsetRequest, opts ...grpc.CallOption) (*GetsetResponse, error)
|
||||
Strlen(ctx context.Context, in *StrlenRequest, opts ...grpc.CallOption) (*StrlenResponse, error)
|
||||
Setnx(ctx context.Context, in *SetnxRequest, opts ...grpc.CallOption) (*SetnxResponse, error)
|
||||
Lindex(ctx context.Context, in *LindexRequest, opts ...grpc.CallOption) (*LindexResponse, error)
|
||||
Llen(ctx context.Context, in *LlenRequest, opts ...grpc.CallOption) (*LlenResponse, error)
|
||||
Lpop(ctx context.Context, in *LpopRequest, opts ...grpc.CallOption) (*LpopResponse, error)
|
||||
Lpush(ctx context.Context, in *LpushRequest, opts ...grpc.CallOption) (*LpushResponse, error)
|
||||
Lpushx(ctx context.Context, in *LpushxRequest, opts ...grpc.CallOption) (*LpushxResponse, error)
|
||||
Lrange(ctx context.Context, in *LrangeRequest, opts ...grpc.CallOption) (*LrangeResponse, error)
|
||||
Lrem(ctx context.Context, in *LremRequest, opts ...grpc.CallOption) (*LremResponse, error)
|
||||
Lset(ctx context.Context, in *LsetRequest, opts ...grpc.CallOption) (*LsetResponse, error)
|
||||
Rpop(ctx context.Context, in *RpopRequest, opts ...grpc.CallOption) (*RpopResponse, error)
|
||||
Ltrim(ctx context.Context, in *LtrimRequest, opts ...grpc.CallOption) (*LtrimResponse, error)
|
||||
Rpush(ctx context.Context, in *RpushRequest, opts ...grpc.CallOption) (*RpushResponse, error)
|
||||
Rpushx(ctx context.Context, in *RpushxRequest, opts ...grpc.CallOption) (*RpushxResponse, error)
|
||||
}
|
||||
|
||||
type commServerClient struct {
|
||||
|
@ -258,6 +350,114 @@ func (c *commServerClient) Setnx(ctx context.Context, in *SetnxRequest, opts ...
|
|||
return out, nil
|
||||
}
|
||||
|
||||
func (c *commServerClient) Lindex(ctx context.Context, in *LindexRequest, opts ...grpc.CallOption) (*LindexResponse, error) {
|
||||
out := new(LindexResponse)
|
||||
err := c.cc.Invoke(ctx, "/CommServer/Lindex", in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *commServerClient) Llen(ctx context.Context, in *LlenRequest, opts ...grpc.CallOption) (*LlenResponse, error) {
|
||||
out := new(LlenResponse)
|
||||
err := c.cc.Invoke(ctx, "/CommServer/Llen", in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *commServerClient) Lpop(ctx context.Context, in *LpopRequest, opts ...grpc.CallOption) (*LpopResponse, error) {
|
||||
out := new(LpopResponse)
|
||||
err := c.cc.Invoke(ctx, "/CommServer/Lpop", in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *commServerClient) Lpush(ctx context.Context, in *LpushRequest, opts ...grpc.CallOption) (*LpushResponse, error) {
|
||||
out := new(LpushResponse)
|
||||
err := c.cc.Invoke(ctx, "/CommServer/Lpush", in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *commServerClient) Lpushx(ctx context.Context, in *LpushxRequest, opts ...grpc.CallOption) (*LpushxResponse, error) {
|
||||
out := new(LpushxResponse)
|
||||
err := c.cc.Invoke(ctx, "/CommServer/Lpushx", in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *commServerClient) Lrange(ctx context.Context, in *LrangeRequest, opts ...grpc.CallOption) (*LrangeResponse, error) {
|
||||
out := new(LrangeResponse)
|
||||
err := c.cc.Invoke(ctx, "/CommServer/Lrange", in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *commServerClient) Lrem(ctx context.Context, in *LremRequest, opts ...grpc.CallOption) (*LremResponse, error) {
|
||||
out := new(LremResponse)
|
||||
err := c.cc.Invoke(ctx, "/CommServer/Lrem", in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *commServerClient) Lset(ctx context.Context, in *LsetRequest, opts ...grpc.CallOption) (*LsetResponse, error) {
|
||||
out := new(LsetResponse)
|
||||
err := c.cc.Invoke(ctx, "/CommServer/Lset", in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *commServerClient) Rpop(ctx context.Context, in *RpopRequest, opts ...grpc.CallOption) (*RpopResponse, error) {
|
||||
out := new(RpopResponse)
|
||||
err := c.cc.Invoke(ctx, "/CommServer/Rpop", in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *commServerClient) Ltrim(ctx context.Context, in *LtrimRequest, opts ...grpc.CallOption) (*LtrimResponse, error) {
|
||||
out := new(LtrimResponse)
|
||||
err := c.cc.Invoke(ctx, "/CommServer/Ltrim", in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *commServerClient) Rpush(ctx context.Context, in *RpushRequest, opts ...grpc.CallOption) (*RpushResponse, error) {
|
||||
out := new(RpushResponse)
|
||||
err := c.cc.Invoke(ctx, "/CommServer/Rpush", in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *commServerClient) Rpushx(ctx context.Context, in *RpushxRequest, opts ...grpc.CallOption) (*RpushxResponse, error) {
|
||||
out := new(RpushxResponse)
|
||||
err := c.cc.Invoke(ctx, "/CommServer/Rpushx", in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
// CommServerServer is the server API for CommServer service.
|
||||
type CommServerServer interface {
|
||||
Set(context.Context, *SetRequest) (*SetResponse, error)
|
||||
|
@ -270,6 +470,18 @@ type CommServerServer interface {
|
|||
Getset(context.Context, *GetsetRequest) (*GetsetResponse, error)
|
||||
Strlen(context.Context, *StrlenRequest) (*StrlenResponse, error)
|
||||
Setnx(context.Context, *SetnxRequest) (*SetnxResponse, error)
|
||||
Lindex(context.Context, *LindexRequest) (*LindexResponse, error)
|
||||
Llen(context.Context, *LlenRequest) (*LlenResponse, error)
|
||||
Lpop(context.Context, *LpopRequest) (*LpopResponse, error)
|
||||
Lpush(context.Context, *LpushRequest) (*LpushResponse, error)
|
||||
Lpushx(context.Context, *LpushxRequest) (*LpushxResponse, error)
|
||||
Lrange(context.Context, *LrangeRequest) (*LrangeResponse, error)
|
||||
Lrem(context.Context, *LremRequest) (*LremResponse, error)
|
||||
Lset(context.Context, *LsetRequest) (*LsetResponse, error)
|
||||
Rpop(context.Context, *RpopRequest) (*RpopResponse, error)
|
||||
Ltrim(context.Context, *LtrimRequest) (*LtrimResponse, error)
|
||||
Rpush(context.Context, *RpushRequest) (*RpushResponse, error)
|
||||
Rpushx(context.Context, *RpushxRequest) (*RpushxResponse, error)
|
||||
}
|
||||
|
||||
// UnimplementedCommServerServer can be embedded to have forward compatible implementations.
|
||||
|
@ -306,6 +518,42 @@ func (*UnimplementedCommServerServer) Strlen(context.Context, *StrlenRequest) (*
|
|||
func (*UnimplementedCommServerServer) Setnx(context.Context, *SetnxRequest) (*SetnxResponse, error) {
|
||||
return nil, status.Errorf(codes.Unimplemented, "method Setnx not implemented")
|
||||
}
|
||||
func (*UnimplementedCommServerServer) Lindex(context.Context, *LindexRequest) (*LindexResponse, error) {
|
||||
return nil, status.Errorf(codes.Unimplemented, "method Lindex not implemented")
|
||||
}
|
||||
func (*UnimplementedCommServerServer) Llen(context.Context, *LlenRequest) (*LlenResponse, error) {
|
||||
return nil, status.Errorf(codes.Unimplemented, "method Llen not implemented")
|
||||
}
|
||||
func (*UnimplementedCommServerServer) Lpop(context.Context, *LpopRequest) (*LpopResponse, error) {
|
||||
return nil, status.Errorf(codes.Unimplemented, "method Lpop not implemented")
|
||||
}
|
||||
func (*UnimplementedCommServerServer) Lpush(context.Context, *LpushRequest) (*LpushResponse, error) {
|
||||
return nil, status.Errorf(codes.Unimplemented, "method Lpush not implemented")
|
||||
}
|
||||
func (*UnimplementedCommServerServer) Lpushx(context.Context, *LpushxRequest) (*LpushxResponse, error) {
|
||||
return nil, status.Errorf(codes.Unimplemented, "method Lpushx not implemented")
|
||||
}
|
||||
func (*UnimplementedCommServerServer) Lrange(context.Context, *LrangeRequest) (*LrangeResponse, error) {
|
||||
return nil, status.Errorf(codes.Unimplemented, "method Lrange not implemented")
|
||||
}
|
||||
func (*UnimplementedCommServerServer) Lrem(context.Context, *LremRequest) (*LremResponse, error) {
|
||||
return nil, status.Errorf(codes.Unimplemented, "method Lrem not implemented")
|
||||
}
|
||||
func (*UnimplementedCommServerServer) Lset(context.Context, *LsetRequest) (*LsetResponse, error) {
|
||||
return nil, status.Errorf(codes.Unimplemented, "method Lset not implemented")
|
||||
}
|
||||
func (*UnimplementedCommServerServer) Rpop(context.Context, *RpopRequest) (*RpopResponse, error) {
|
||||
return nil, status.Errorf(codes.Unimplemented, "method Rpop not implemented")
|
||||
}
|
||||
func (*UnimplementedCommServerServer) Ltrim(context.Context, *LtrimRequest) (*LtrimResponse, error) {
|
||||
return nil, status.Errorf(codes.Unimplemented, "method Ltrim not implemented")
|
||||
}
|
||||
func (*UnimplementedCommServerServer) Rpush(context.Context, *RpushRequest) (*RpushResponse, error) {
|
||||
return nil, status.Errorf(codes.Unimplemented, "method Rpush not implemented")
|
||||
}
|
||||
func (*UnimplementedCommServerServer) Rpushx(context.Context, *RpushxRequest) (*RpushxResponse, error) {
|
||||
return nil, status.Errorf(codes.Unimplemented, "method Rpushx not implemented")
|
||||
}
|
||||
|
||||
func RegisterCommServerServer(s *grpc.Server, srv CommServerServer) {
|
||||
s.RegisterService(&_CommServer_serviceDesc, srv)
|
||||
|
@ -491,6 +739,222 @@ func _CommServer_Setnx_Handler(srv interface{}, ctx context.Context, dec func(in
|
|||
return interceptor(ctx, in, info, handler)
|
||||
}
|
||||
|
||||
func _CommServer_Lindex_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||
in := new(LindexRequest)
|
||||
if err := dec(in); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if interceptor == nil {
|
||||
return srv.(CommServerServer).Lindex(ctx, in)
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/CommServer/Lindex",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(CommServerServer).Lindex(ctx, req.(*LindexRequest))
|
||||
}
|
||||
return interceptor(ctx, in, info, handler)
|
||||
}
|
||||
|
||||
func _CommServer_Llen_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||
in := new(LlenRequest)
|
||||
if err := dec(in); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if interceptor == nil {
|
||||
return srv.(CommServerServer).Llen(ctx, in)
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/CommServer/Llen",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(CommServerServer).Llen(ctx, req.(*LlenRequest))
|
||||
}
|
||||
return interceptor(ctx, in, info, handler)
|
||||
}
|
||||
|
||||
func _CommServer_Lpop_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||
in := new(LpopRequest)
|
||||
if err := dec(in); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if interceptor == nil {
|
||||
return srv.(CommServerServer).Lpop(ctx, in)
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/CommServer/Lpop",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(CommServerServer).Lpop(ctx, req.(*LpopRequest))
|
||||
}
|
||||
return interceptor(ctx, in, info, handler)
|
||||
}
|
||||
|
||||
func _CommServer_Lpush_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||
in := new(LpushRequest)
|
||||
if err := dec(in); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if interceptor == nil {
|
||||
return srv.(CommServerServer).Lpush(ctx, in)
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/CommServer/Lpush",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(CommServerServer).Lpush(ctx, req.(*LpushRequest))
|
||||
}
|
||||
return interceptor(ctx, in, info, handler)
|
||||
}
|
||||
|
||||
func _CommServer_Lpushx_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||
in := new(LpushxRequest)
|
||||
if err := dec(in); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if interceptor == nil {
|
||||
return srv.(CommServerServer).Lpushx(ctx, in)
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/CommServer/Lpushx",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(CommServerServer).Lpushx(ctx, req.(*LpushxRequest))
|
||||
}
|
||||
return interceptor(ctx, in, info, handler)
|
||||
}
|
||||
|
||||
func _CommServer_Lrange_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||
in := new(LrangeRequest)
|
||||
if err := dec(in); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if interceptor == nil {
|
||||
return srv.(CommServerServer).Lrange(ctx, in)
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/CommServer/Lrange",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(CommServerServer).Lrange(ctx, req.(*LrangeRequest))
|
||||
}
|
||||
return interceptor(ctx, in, info, handler)
|
||||
}
|
||||
|
||||
func _CommServer_Lrem_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||
in := new(LremRequest)
|
||||
if err := dec(in); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if interceptor == nil {
|
||||
return srv.(CommServerServer).Lrem(ctx, in)
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/CommServer/Lrem",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(CommServerServer).Lrem(ctx, req.(*LremRequest))
|
||||
}
|
||||
return interceptor(ctx, in, info, handler)
|
||||
}
|
||||
|
||||
func _CommServer_Lset_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||
in := new(LsetRequest)
|
||||
if err := dec(in); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if interceptor == nil {
|
||||
return srv.(CommServerServer).Lset(ctx, in)
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/CommServer/Lset",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(CommServerServer).Lset(ctx, req.(*LsetRequest))
|
||||
}
|
||||
return interceptor(ctx, in, info, handler)
|
||||
}
|
||||
|
||||
func _CommServer_Rpop_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||
in := new(RpopRequest)
|
||||
if err := dec(in); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if interceptor == nil {
|
||||
return srv.(CommServerServer).Rpop(ctx, in)
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/CommServer/Rpop",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(CommServerServer).Rpop(ctx, req.(*RpopRequest))
|
||||
}
|
||||
return interceptor(ctx, in, info, handler)
|
||||
}
|
||||
|
||||
func _CommServer_Ltrim_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||
in := new(LtrimRequest)
|
||||
if err := dec(in); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if interceptor == nil {
|
||||
return srv.(CommServerServer).Ltrim(ctx, in)
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/CommServer/Ltrim",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(CommServerServer).Ltrim(ctx, req.(*LtrimRequest))
|
||||
}
|
||||
return interceptor(ctx, in, info, handler)
|
||||
}
|
||||
|
||||
func _CommServer_Rpush_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||
in := new(RpushRequest)
|
||||
if err := dec(in); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if interceptor == nil {
|
||||
return srv.(CommServerServer).Rpush(ctx, in)
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/CommServer/Rpush",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(CommServerServer).Rpush(ctx, req.(*RpushRequest))
|
||||
}
|
||||
return interceptor(ctx, in, info, handler)
|
||||
}
|
||||
|
||||
func _CommServer_Rpushx_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||
in := new(RpushxRequest)
|
||||
if err := dec(in); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if interceptor == nil {
|
||||
return srv.(CommServerServer).Rpushx(ctx, in)
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/CommServer/Rpushx",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(CommServerServer).Rpushx(ctx, req.(*RpushxRequest))
|
||||
}
|
||||
return interceptor(ctx, in, info, handler)
|
||||
}
|
||||
|
||||
var _CommServer_serviceDesc = grpc.ServiceDesc{
|
||||
ServiceName: "CommServer",
|
||||
HandlerType: (*CommServerServer)(nil),
|
||||
|
@ -535,6 +999,54 @@ var _CommServer_serviceDesc = grpc.ServiceDesc{
|
|||
MethodName: "Setnx",
|
||||
Handler: _CommServer_Setnx_Handler,
|
||||
},
|
||||
{
|
||||
MethodName: "Lindex",
|
||||
Handler: _CommServer_Lindex_Handler,
|
||||
},
|
||||
{
|
||||
MethodName: "Llen",
|
||||
Handler: _CommServer_Llen_Handler,
|
||||
},
|
||||
{
|
||||
MethodName: "Lpop",
|
||||
Handler: _CommServer_Lpop_Handler,
|
||||
},
|
||||
{
|
||||
MethodName: "Lpush",
|
||||
Handler: _CommServer_Lpush_Handler,
|
||||
},
|
||||
{
|
||||
MethodName: "Lpushx",
|
||||
Handler: _CommServer_Lpushx_Handler,
|
||||
},
|
||||
{
|
||||
MethodName: "Lrange",
|
||||
Handler: _CommServer_Lrange_Handler,
|
||||
},
|
||||
{
|
||||
MethodName: "Lrem",
|
||||
Handler: _CommServer_Lrem_Handler,
|
||||
},
|
||||
{
|
||||
MethodName: "Lset",
|
||||
Handler: _CommServer_Lset_Handler,
|
||||
},
|
||||
{
|
||||
MethodName: "Rpop",
|
||||
Handler: _CommServer_Rpop_Handler,
|
||||
},
|
||||
{
|
||||
MethodName: "Ltrim",
|
||||
Handler: _CommServer_Ltrim_Handler,
|
||||
},
|
||||
{
|
||||
MethodName: "Rpush",
|
||||
Handler: _CommServer_Rpush_Handler,
|
||||
},
|
||||
{
|
||||
MethodName: "Rpushx",
|
||||
Handler: _CommServer_Rpushx_Handler,
|
||||
},
|
||||
},
|
||||
Streams: []grpc.StreamDesc{},
|
||||
Metadata: "storage.proto",
|
||||
|
|
|
@ -7,6 +7,7 @@ const (
|
|||
DEFAULT_KEY = iota
|
||||
|
||||
STRING_X
|
||||
LIST_X
|
||||
)
|
||||
|
||||
const (
|
||||
|
@ -21,6 +22,18 @@ const (
|
|||
GETSET
|
||||
STRLEN
|
||||
SETNX
|
||||
LINDEX
|
||||
LLEN
|
||||
LPOP
|
||||
LPUSH
|
||||
LPUSHX
|
||||
LRANGE
|
||||
LREM
|
||||
LSET
|
||||
RPOP
|
||||
LTRIM
|
||||
RPUSH
|
||||
RPUSHX
|
||||
)
|
||||
|
||||
var CommKeyString = map[string]int{"set": STRING_X,
|
||||
|
@ -33,6 +46,18 @@ var CommKeyString = map[string]int{"set": STRING_X,
|
|||
"getset": STRING_X,
|
||||
"strlen": STRING_X,
|
||||
"setnx": STRING_X,
|
||||
"lindex": LIST_X,
|
||||
"llen": LIST_X,
|
||||
"lpop": LIST_X,
|
||||
"lpush": LIST_X,
|
||||
"lpushx": LIST_X,
|
||||
"lrange": LIST_X,
|
||||
"lrem": LIST_X,
|
||||
"lset": LIST_X,
|
||||
"rpop": LIST_X,
|
||||
"ltrim": LIST_X,
|
||||
"rpush": LIST_X,
|
||||
"rpushx": LIST_X,
|
||||
}
|
||||
|
||||
var CommKey = map[int]int{SET: STRING_X,
|
||||
|
@ -45,4 +70,16 @@ var CommKey = map[int]int{SET: STRING_X,
|
|||
GETSET: STRING_X,
|
||||
STRLEN: STRING_X,
|
||||
SETNX: STRING_X,
|
||||
LINDEX: LIST_X,
|
||||
LLEN: LIST_X,
|
||||
LPOP: LIST_X,
|
||||
LPUSH: LIST_X,
|
||||
LPUSHX: LIST_X,
|
||||
LRANGE: LIST_X,
|
||||
LREM: LIST_X,
|
||||
LSET: LIST_X,
|
||||
RPOP: LIST_X,
|
||||
LTRIM: LIST_X,
|
||||
RPUSH: LIST_X,
|
||||
RPUSHX: LIST_X,
|
||||
}
|
||||
|
|
|
@ -14,3 +14,42 @@ const (
|
|||
DynamicFloat
|
||||
DynamicString
|
||||
)
|
||||
|
||||
type KeyBaseInterface interface {
|
||||
SizeByte() int64
|
||||
|
||||
// RollBack TODO 事务相关, V2 实现
|
||||
RollBack() error
|
||||
// Begin 事务相关, V2 实现
|
||||
Begin() error
|
||||
// Comment 事务相关, V2 实现
|
||||
Comment() error
|
||||
|
||||
Encode() ([]byte, error)
|
||||
}
|
||||
|
||||
type StringXInterface interface {
|
||||
KeyBaseInterface
|
||||
Set(string) (string, UpdateLength)
|
||||
Get() string
|
||||
Add(int32) (string, error)
|
||||
Reduce(int32) (string, error)
|
||||
Setbit(int32, bool) UpdateLength
|
||||
Getbit(int32) (bool, error)
|
||||
Getrange(start, end int32) (string, error)
|
||||
GetLength() int
|
||||
}
|
||||
|
||||
type ListXInterface interface {
|
||||
KeyBaseInterface
|
||||
LPush(...string) UpdateLength
|
||||
RPush(...string) UpdateLength
|
||||
LPop(int) ([]string, UpdateLength)
|
||||
RPop(int) ([]string, UpdateLength)
|
||||
Index(int) (string, error)
|
||||
Insert(int, bool, ...string) (UpdateLength, error)
|
||||
Length() int
|
||||
Slice(start, end int) (UpdateLength, error) // 切片, O(n)复杂度
|
||||
Range(start, end int) ([]string, error)
|
||||
Remove(value string, count int) (int, UpdateLength)
|
||||
}
|
||||
|
|
|
@ -11,4 +11,18 @@ STRING_X:
|
|||
- getrange
|
||||
- getset
|
||||
- strlen
|
||||
- setnx
|
||||
- setnx
|
||||
|
||||
LIST_X:
|
||||
- lindex
|
||||
- llen
|
||||
- lpop
|
||||
- lpush
|
||||
- lpushx # 列表不存在则不插入
|
||||
- lrange
|
||||
- lrem
|
||||
- lset
|
||||
- rpop
|
||||
- ltrim # 对列表进行切片
|
||||
- rpush
|
||||
- rpushx # 对已经存在的列表尾插
|
|
@ -1,26 +0,0 @@
|
|||
package structure
|
||||
|
||||
type KeyBaseInterface interface {
|
||||
SizeByte() int64
|
||||
|
||||
// RollBack TODO 事务相关, V2 实现
|
||||
RollBack() error
|
||||
// Begin 事务相关, V2 实现
|
||||
Begin() error
|
||||
// Comment 事务相关, V2 实现
|
||||
Comment() error
|
||||
|
||||
Encode() ([]byte, error)
|
||||
}
|
||||
|
||||
type StringXInterface interface {
|
||||
KeyBaseInterface
|
||||
Set(string) (string, UpdateLength)
|
||||
Get() string
|
||||
Add(int32) (string, error)
|
||||
Reduce(int32) (string, error)
|
||||
Setbit(int32, bool) UpdateLength
|
||||
Getbit(int32) (bool, error)
|
||||
Getrange(start, end int32) (string, error)
|
||||
GetLength() int
|
||||
}
|
|
@ -0,0 +1,428 @@
|
|||
package listx
|
||||
|
||||
import (
|
||||
"gitee.com/timedb/wheatCache/pkg/errorx"
|
||||
"gitee.com/timedb/wheatCache/pkg/structure"
|
||||
)
|
||||
|
||||
/*
|
||||
1. 双向链表
|
||||
2. 支持头尾操作
|
||||
3. 支持索引
|
||||
4. 支持切片
|
||||
*/
|
||||
|
||||
type ListxNode struct {
|
||||
next *ListxNode
|
||||
pre *ListxNode
|
||||
val *structure.Value
|
||||
}
|
||||
|
||||
type Listx struct {
|
||||
head *ListxNode
|
||||
tail *ListxNode
|
||||
length int
|
||||
}
|
||||
|
||||
func NewListXSingle() structure.ListXInterface {
|
||||
return &Listx{
|
||||
head: nil,
|
||||
tail: nil,
|
||||
length: 0,
|
||||
}
|
||||
}
|
||||
|
||||
func (l *Listx) initByValue(val string) int {
|
||||
if l.head == nil && l.length == 0 {
|
||||
node := &ListxNode{
|
||||
val: structure.NewValue(val),
|
||||
}
|
||||
l.head = node
|
||||
l.tail = node
|
||||
l.length = 1
|
||||
|
||||
return node.val.GetSize()
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
// 定位到 list 的元素, 支持反向索引
|
||||
func (l *Listx) location(index int) (*ListxNode, error) {
|
||||
// 正定位
|
||||
if index >= 0 {
|
||||
node := l.head
|
||||
for ; index != 0 && node != nil; index -= 1 {
|
||||
node = node.next
|
||||
}
|
||||
|
||||
if node == nil {
|
||||
return nil, errorx.New("index crosses the line")
|
||||
}
|
||||
return node, nil
|
||||
}
|
||||
|
||||
node := l.tail
|
||||
for index = (-index) - 1; index != 0 && node != nil; {
|
||||
node = node.pre
|
||||
index -= 1
|
||||
}
|
||||
|
||||
if node == nil {
|
||||
return nil, errorx.New("index crosses the line")
|
||||
}
|
||||
return node, nil
|
||||
|
||||
}
|
||||
|
||||
// 转换为左索引,负数索引
|
||||
func (l *Listx) leftIndex(index int) (int, error) {
|
||||
if index < 0 && l.length+index > 0 {
|
||||
return index, nil
|
||||
}
|
||||
|
||||
if index >= 0 && index < l.length {
|
||||
return index - l.length, nil
|
||||
}
|
||||
|
||||
return 0, errorx.New("the index is not valid, index:%d", index)
|
||||
}
|
||||
|
||||
// 转换为右索引,正数索引
|
||||
func (l *Listx) rightIndex(index int) (int, error) {
|
||||
if index >= 0 && index < l.length {
|
||||
return index, nil
|
||||
}
|
||||
|
||||
if index < 0 && l.length+index >= 0 {
|
||||
return l.length + index, nil
|
||||
}
|
||||
|
||||
return 0, errorx.New("the index is not valid, index:%d", index)
|
||||
}
|
||||
|
||||
func (l *Listx) remove(node *ListxNode) {
|
||||
|
||||
if node == nil {
|
||||
return
|
||||
}
|
||||
|
||||
l.length -= 1
|
||||
|
||||
if node == l.head {
|
||||
l.head = node.next
|
||||
node.next.pre = nil
|
||||
return
|
||||
}
|
||||
|
||||
if node == l.tail {
|
||||
l.tail = node.pre
|
||||
node.pre.next = nil
|
||||
return
|
||||
}
|
||||
|
||||
node.pre.next = node.next
|
||||
node.next.pre = node.pre
|
||||
|
||||
}
|
||||
|
||||
func (l *Listx) SizeByte() int64 {
|
||||
bytes := 0
|
||||
r := l.head
|
||||
for r != nil {
|
||||
bytes += 16 + r.val.GetSize()
|
||||
r = r.next
|
||||
}
|
||||
return int64(bytes)
|
||||
}
|
||||
|
||||
// RollBack TODO 事务相关, V2 实现
|
||||
func (l *Listx) RollBack() error {
|
||||
panic("not implemented") // TODO: Implement
|
||||
}
|
||||
|
||||
// Begin 事务相关, V2 实现
|
||||
func (l *Listx) Begin() error {
|
||||
panic("not implemented") // TODO: Implement
|
||||
}
|
||||
|
||||
// Comment 事务相关, V2 实现
|
||||
func (l *Listx) Comment() error {
|
||||
panic("not implemented") // TODO: Implement
|
||||
}
|
||||
|
||||
func (l *Listx) Encode() ([]byte, error) {
|
||||
panic("not implemented") // TODO: Implement
|
||||
}
|
||||
|
||||
func (l *Listx) LPush(valueStr ...string) structure.UpdateLength {
|
||||
if len(valueStr) == 0 {
|
||||
return 0
|
||||
}
|
||||
|
||||
// 使用第一个元素尝试初始化列表
|
||||
updateLength := l.initByValue(valueStr[0])
|
||||
for i := 1; i < len(valueStr); i++ {
|
||||
head := l.head
|
||||
val := structure.NewValue(valueStr[i])
|
||||
node := &ListxNode{val: val}
|
||||
node.next = head
|
||||
head.pre = node
|
||||
l.head = node
|
||||
l.length += 1
|
||||
updateLength += val.GetSize()
|
||||
}
|
||||
return structure.UpdateLength(updateLength)
|
||||
}
|
||||
|
||||
func (l *Listx) RPush(valueStr ...string) structure.UpdateLength {
|
||||
if len(valueStr) == 0 {
|
||||
return 0
|
||||
}
|
||||
|
||||
updateLength := l.initByValue(valueStr[0])
|
||||
for i := 1; i < len(valueStr); i++ {
|
||||
tail := l.tail
|
||||
val := structure.NewValue(valueStr[i])
|
||||
node := &ListxNode{val: val}
|
||||
tail.next = node
|
||||
node.pre = tail
|
||||
l.tail = node
|
||||
l.length += 1
|
||||
updateLength += val.GetSize()
|
||||
}
|
||||
|
||||
return structure.UpdateLength(updateLength)
|
||||
}
|
||||
|
||||
func (l *Listx) LPop(count int) ([]string, structure.UpdateLength) {
|
||||
values := make([]string, 0, count)
|
||||
|
||||
head := l.head
|
||||
|
||||
// 动态变化长度
|
||||
updateLength := 0
|
||||
|
||||
for nodePoint := 0; head != nil && nodePoint < count; nodePoint++ {
|
||||
values = append(values, head.val.ToString())
|
||||
updateLength += head.val.GetSize()
|
||||
head = head.next
|
||||
l.length -= 1
|
||||
}
|
||||
|
||||
if head != nil {
|
||||
head.pre = nil
|
||||
} else {
|
||||
l.tail = nil
|
||||
}
|
||||
|
||||
l.head = head
|
||||
|
||||
return values, structure.UpdateLength(updateLength)
|
||||
}
|
||||
|
||||
func (l *Listx) RPop(count int) ([]string, structure.UpdateLength) {
|
||||
values := make([]string, 0, count)
|
||||
tail := l.tail
|
||||
|
||||
updateLength := 0
|
||||
|
||||
for nodePoint := 0; tail != nil && nodePoint < count; nodePoint++ {
|
||||
values = append(values, tail.val.ToString())
|
||||
updateLength += tail.val.GetSize()
|
||||
tail = tail.pre
|
||||
l.length -= 1
|
||||
}
|
||||
|
||||
if tail != nil {
|
||||
tail.next = nil
|
||||
} else {
|
||||
l.head = nil
|
||||
}
|
||||
|
||||
l.tail = tail
|
||||
|
||||
return values, structure.UpdateLength(updateLength)
|
||||
}
|
||||
|
||||
func (l *Listx) Index(index int) (string, error) {
|
||||
node, err := l.location(index)
|
||||
if err != nil {
|
||||
return "", nil
|
||||
}
|
||||
|
||||
return node.val.ToString(), nil
|
||||
}
|
||||
|
||||
// Insert, right 为 true 右添加,否则左添加
|
||||
func (l *Listx) Insert(index int, right bool, valueStr ...string) (structure.UpdateLength, error) {
|
||||
targetNode, err := l.location(index)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
updateLength := 0
|
||||
for _, valStr := range valueStr {
|
||||
val := structure.NewValue(valStr)
|
||||
node := &ListxNode{val: val}
|
||||
|
||||
// 右插
|
||||
if right {
|
||||
node.pre = targetNode
|
||||
node.next = targetNode.next
|
||||
|
||||
targetNode.next = node
|
||||
targetNode.next.pre = node
|
||||
|
||||
// 更新尾部
|
||||
if targetNode == l.tail {
|
||||
l.tail = node
|
||||
}
|
||||
|
||||
targetNode = node
|
||||
} else {
|
||||
// 左插
|
||||
node.pre = targetNode.pre
|
||||
targetNode.pre.next = node
|
||||
|
||||
node.next = targetNode
|
||||
targetNode.pre = node
|
||||
|
||||
// 更新头部
|
||||
if targetNode == l.head {
|
||||
l.head = node
|
||||
}
|
||||
targetNode = node
|
||||
}
|
||||
|
||||
updateLength += val.GetSize()
|
||||
l.length += 1
|
||||
}
|
||||
|
||||
return structure.UpdateLength(updateLength), nil
|
||||
}
|
||||
|
||||
func (l *Listx) Length() int {
|
||||
return l.length
|
||||
}
|
||||
|
||||
// Slice 切片
|
||||
func (l *Listx) Slice(start int, end int) (structure.UpdateLength, error) {
|
||||
|
||||
startOffset, err := l.rightIndex(start)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
endRightOffset, err := l.rightIndex(end)
|
||||
if err != nil && end != l.length {
|
||||
return 0, errorx.New("index overstep the boundary, index: %d", end)
|
||||
}
|
||||
|
||||
if startOffset >= endRightOffset && endRightOffset != 0 {
|
||||
return 0, errorx.New("the start index must be larger than the end index")
|
||||
}
|
||||
|
||||
// 计算左偏移
|
||||
var endOffset int
|
||||
if end == l.length {
|
||||
endOffset = 0
|
||||
} else {
|
||||
endOffset, err = l.leftIndex(end)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
}
|
||||
|
||||
updateLength := 0
|
||||
|
||||
// 右切片
|
||||
head := l.head
|
||||
for nodePoint := 0; head != nil && nodePoint < startOffset; nodePoint++ {
|
||||
updateLength += head.val.GetSize()
|
||||
head = head.next
|
||||
l.length -= 1
|
||||
}
|
||||
l.head = head
|
||||
head.pre = nil
|
||||
|
||||
tail := l.tail
|
||||
for nodePoint := 0; tail != nil && nodePoint < -endOffset; nodePoint++ {
|
||||
updateLength += tail.val.GetSize()
|
||||
tail = tail.pre
|
||||
l.length -= 1
|
||||
}
|
||||
|
||||
l.tail = tail
|
||||
tail.next = nil
|
||||
|
||||
return structure.UpdateLength(updateLength), nil
|
||||
}
|
||||
|
||||
// Range 遍历
|
||||
func (l *Listx) Range(start, end int) ([]string, error) {
|
||||
startOffset, err := l.rightIndex(start)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
endRightOffset, err := l.rightIndex(end)
|
||||
if err != nil && end != l.length {
|
||||
return nil, errorx.New("index overstep the boundary, index: %d", end)
|
||||
}
|
||||
|
||||
if startOffset >= endRightOffset && endRightOffset != 0 {
|
||||
return nil, errorx.New("the start index must be larger than the end index")
|
||||
}
|
||||
|
||||
head := l.head
|
||||
for nodePoint := 0; head != nil && nodePoint < startOffset; nodePoint++ {
|
||||
head = head.next
|
||||
}
|
||||
|
||||
values := make([]string, 0)
|
||||
for i := 0; i < endRightOffset-startOffset && head != nil; i++ {
|
||||
values = append(values, head.val.ToString())
|
||||
head = head.next
|
||||
}
|
||||
return values, nil
|
||||
}
|
||||
|
||||
func (l *Listx) Remove(value string, count int) (int, structure.UpdateLength) {
|
||||
|
||||
if count == 0 {
|
||||
return 0, 0
|
||||
}
|
||||
|
||||
updateLength := 0
|
||||
remCount := count
|
||||
|
||||
// 头删除
|
||||
if count > 0 {
|
||||
node := l.head
|
||||
for node != nil && remCount > 0 {
|
||||
if node.val.ToString() == value {
|
||||
l.remove(node)
|
||||
remCount--
|
||||
updateLength += node.val.GetSize()
|
||||
}
|
||||
node = node.next
|
||||
}
|
||||
|
||||
return count - remCount, structure.UpdateLength(updateLength)
|
||||
}
|
||||
|
||||
// 尾删除
|
||||
node := l.tail
|
||||
for node != nil && remCount < 0 {
|
||||
if node.val.ToString() == value {
|
||||
l.remove(node)
|
||||
remCount++
|
||||
updateLength += node.val.GetSize()
|
||||
}
|
||||
node = node.pre
|
||||
}
|
||||
|
||||
return remCount - count, structure.UpdateLength(updateLength)
|
||||
|
||||
}
|
|
@ -0,0 +1,228 @@
|
|||
package listx
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestListx_LPush_And_Pop(t *testing.T) {
|
||||
list := NewListXSingle()
|
||||
up := list.LPush("1", "2", "3")
|
||||
require.Equal(t, list.Length(), 3)
|
||||
|
||||
values, updateLength := list.LPop(3)
|
||||
|
||||
require.Equal(t, values, []string{"3", "2", "1"})
|
||||
require.Equal(t, up, updateLength)
|
||||
|
||||
list.LPush("1", "2", "3")
|
||||
values, updateLength = list.LPop(1)
|
||||
require.Equal(t, values, []string{"3"})
|
||||
require.Equal(t, int(updateLength), 24)
|
||||
|
||||
}
|
||||
|
||||
func TestListx_RPush_Pop(t *testing.T) {
|
||||
list := NewListXSingle()
|
||||
up := list.RPush("1", "2", "3")
|
||||
require.Equal(t, list.Length(), 3)
|
||||
|
||||
values, updateLength := list.LPop(3)
|
||||
require.Equal(t, values, []string{"1", "2", "3"})
|
||||
require.Equal(t, up, updateLength)
|
||||
|
||||
list.RPush("1", "2", "3")
|
||||
values, updateLength = list.RPop(2)
|
||||
require.Equal(t, values, []string{"3", "2"})
|
||||
require.Equal(t, int(updateLength), 48)
|
||||
}
|
||||
|
||||
func TestListx_location(t *testing.T) {
|
||||
list := &Listx{
|
||||
head: nil,
|
||||
tail: nil,
|
||||
length: 0,
|
||||
}
|
||||
|
||||
list.RPush("1", "2", "3")
|
||||
node, err := list.location(1)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, node.val.ToString(), "2")
|
||||
|
||||
node, err = list.location(0)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, node.val.ToString(), "1")
|
||||
|
||||
node, err = list.location(2)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, node.val.ToString(), "3")
|
||||
|
||||
_, err = list.location(3)
|
||||
require.Error(t, err)
|
||||
|
||||
node, err = list.location(-1)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, node.val.ToString(), "3")
|
||||
|
||||
node, err = list.location(-2)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, node.val.ToString(), "2")
|
||||
|
||||
node, err = list.location(-3)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, node.val.ToString(), "1")
|
||||
|
||||
_, err = list.location(-4)
|
||||
require.Error(t, err)
|
||||
}
|
||||
|
||||
func TestListx_Insert(t *testing.T) {
|
||||
list := NewListXSingle()
|
||||
list.LPush("a", "b", "c", "d", "e")
|
||||
val, _ := list.LPop(1)
|
||||
require.Equal(t, val, []string{"e"})
|
||||
|
||||
res, err := list.Index(1)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, res, "c")
|
||||
|
||||
_, err = list.Insert(1, false, "1", "2", "3")
|
||||
require.NoError(t, err)
|
||||
|
||||
// 全部取出
|
||||
val, _ = list.LPop(list.Length())
|
||||
require.Equal(t, val, []string{"d", "3", "2", "1", "c", "b", "a"})
|
||||
|
||||
list.RPush("1", "2", "3", "4", "5")
|
||||
res, err = list.Index(-2)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, res, "4")
|
||||
|
||||
_, err = list.Insert(-1, true, "6", "7")
|
||||
require.NoError(t, err)
|
||||
|
||||
val, _ = list.LPop(list.Length())
|
||||
require.Equal(t, val, []string{"1", "2", "3", "4", "5", "6", "7"})
|
||||
}
|
||||
|
||||
func TestListx_Index(t *testing.T) {
|
||||
list := &Listx{
|
||||
head: nil,
|
||||
tail: nil,
|
||||
length: 0,
|
||||
}
|
||||
|
||||
list.RPush("a", "b", "c", "d", "e")
|
||||
|
||||
index := 2
|
||||
leftIndex, err := list.leftIndex(index)
|
||||
require.NoError(t, err)
|
||||
rightIndex, err := list.rightIndex(index)
|
||||
require.NoError(t, err)
|
||||
v1, err := list.Index(leftIndex)
|
||||
require.NoError(t, err)
|
||||
v2, err := list.Index(rightIndex)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, v1, v2)
|
||||
}
|
||||
|
||||
func TestListx_Slice(t *testing.T) {
|
||||
list := NewListXSingle()
|
||||
list.RPush("a", "b", "c", "d", "e")
|
||||
|
||||
// 主流程测试
|
||||
list.Slice(1, 2)
|
||||
values, _ := list.LPop(list.Length())
|
||||
require.Equal(t, values, []string{"b"})
|
||||
|
||||
list2 := NewListXSingle()
|
||||
list2.RPush("1", "2", "3", "4", "5")
|
||||
|
||||
list2.Slice(0, 4)
|
||||
values, _ = list2.LPop(list2.Length())
|
||||
require.Equal(t, values, []string{"1", "2", "3", "4"})
|
||||
|
||||
list3 := NewListXSingle()
|
||||
list3.RPush("1", "2", "3", "4", "5")
|
||||
|
||||
list3.Slice(2, list3.Length())
|
||||
values, _ = list3.LPop(list3.Length())
|
||||
require.Equal(t, values, []string{"3", "4", "5"})
|
||||
|
||||
// 测试负数索引
|
||||
list3 = NewListXSingle()
|
||||
list3.RPush("1", "2", "3", "4", "5")
|
||||
|
||||
_, err := list3.Slice(0, -2)
|
||||
require.NoError(t, err)
|
||||
values, _ = list3.LPop(list3.Length())
|
||||
require.Equal(t, values, []string{"1", "2", "3"})
|
||||
|
||||
// 测试负数双边际
|
||||
list3 = NewListXSingle()
|
||||
list3.RPush("1", "2", "3", "4", "5")
|
||||
|
||||
_, err = list3.Slice(-3, -2)
|
||||
require.NoError(t, err)
|
||||
values, _ = list3.LPop(list3.Length())
|
||||
require.Equal(t, values, []string{"3"})
|
||||
|
||||
// 测试负数边际
|
||||
list3 = NewListXSingle()
|
||||
list3.RPush("1", "2", "3", "4", "5")
|
||||
|
||||
_, err = list3.Slice(-5, 4)
|
||||
require.NoError(t, err)
|
||||
values, _ = list3.LPop(list3.Length())
|
||||
require.Equal(t, values, []string{"1", "2", "3", "4"})
|
||||
}
|
||||
|
||||
func TestListx_Range(t *testing.T) {
|
||||
list := NewListXSingle()
|
||||
list.RPush("a", "b", "c", "d", "e")
|
||||
val, err := list.Range(0, 2)
|
||||
require.NoError(t, err)
|
||||
|
||||
require.Equal(t, val, []string{"a", "b"})
|
||||
|
||||
val, err = list.Range(0, -1)
|
||||
require.NoError(t, err)
|
||||
|
||||
require.Equal(t, val, []string{"a", "b", "c", "d"})
|
||||
|
||||
val, err = list.Range(-3, 3)
|
||||
require.NoError(t, err)
|
||||
|
||||
require.Equal(t, val, []string{"c"})
|
||||
|
||||
val, err = list.Range(-1, list.Length())
|
||||
require.NoError(t, err)
|
||||
|
||||
require.Equal(t, val, []string{})
|
||||
|
||||
_, err = list.Range(6, -1)
|
||||
require.Error(t, err)
|
||||
}
|
||||
|
||||
func TestListx_Remove(t *testing.T) {
|
||||
list := NewListXSingle()
|
||||
list.RPush("a", "b", "c", "c", "e")
|
||||
|
||||
count, up := list.Remove("c", -2)
|
||||
require.Equal(t, count, 2)
|
||||
require.Equal(t, int(up), 34)
|
||||
|
||||
res, _ := list.LPop(list.Length())
|
||||
require.Equal(t, res, []string{"a", "b", "e"})
|
||||
|
||||
list = NewListXSingle()
|
||||
list.RPush("a", "b", "c", "c", "e")
|
||||
|
||||
count, up = list.Remove("b", 1)
|
||||
require.Equal(t, count, 1)
|
||||
require.Equal(t, int(up), 17)
|
||||
|
||||
res, _ = list.LPop(list.Length())
|
||||
require.Equal(t, res, []string{"a", "c", "c", "e"})
|
||||
}
|
|
@ -1,7 +1,9 @@
|
|||
package stringx
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
"unsafe"
|
||||
|
||||
"gitee.com/timedb/wheatCache/pkg/structure"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
@ -89,3 +91,8 @@ func TestStringSingle_Getrange(t *testing.T) {
|
|||
require.NoError(t, err)
|
||||
require.Equal(t, "abc", k)
|
||||
}
|
||||
|
||||
func TestPointSize(t *testing.T) {
|
||||
var a *int32
|
||||
fmt.Println(unsafe.Sizeof(a))
|
||||
}
|
||||
|
|
|
@ -17,20 +17,26 @@ type Value struct {
|
|||
onType DynamicType
|
||||
}
|
||||
|
||||
func NewValue() *Value {
|
||||
return &Value{
|
||||
func NewValue(val ...string) *Value {
|
||||
|
||||
stcValue := &Value{
|
||||
val: make([]byte, defaultLen),
|
||||
length: 0,
|
||||
onType: DynamicNull,
|
||||
}
|
||||
|
||||
if len(val) > 0 {
|
||||
stcValue.InferValue(val[0])
|
||||
}
|
||||
return stcValue
|
||||
}
|
||||
|
||||
func (v *Value) GetLength() int {
|
||||
return len(v.val)
|
||||
return v.length
|
||||
}
|
||||
|
||||
func (v *Value) GetSize() int {
|
||||
return v.length
|
||||
return len(v.val) + 16
|
||||
}
|
||||
|
||||
func (v *Value) GetDynamicType() DynamicType {
|
||||
|
|
|
@ -0,0 +1,109 @@
|
|||
syntax = "proto3";
|
||||
import "base.proto";
|
||||
option go_package = "pkg/proto";
|
||||
|
||||
message LindexRequest {
|
||||
BaseKey key = 1;
|
||||
int32 index = 2;
|
||||
}
|
||||
|
||||
message LindexResponse {
|
||||
string result = 1;
|
||||
}
|
||||
|
||||
message LlenRequest {
|
||||
BaseKey key = 1;
|
||||
}
|
||||
|
||||
message LlenResponse {
|
||||
int32 length = 1;
|
||||
}
|
||||
|
||||
message LpopRequest {
|
||||
BaseKey key = 1;
|
||||
int32 count = 2;
|
||||
}
|
||||
|
||||
message LpopResponse {
|
||||
repeated string results = 1;
|
||||
}
|
||||
|
||||
message LpushRequest {
|
||||
BaseKey key = 1;
|
||||
repeated string values = 2;
|
||||
}
|
||||
|
||||
message LpushResponse {
|
||||
}
|
||||
|
||||
message LpushxRequest {
|
||||
BaseKey key = 1;
|
||||
repeated string values = 2;
|
||||
}
|
||||
|
||||
message LpushxResponse {
|
||||
}
|
||||
|
||||
message LrangeRequest {
|
||||
BaseKey key = 1;
|
||||
int32 start = 2;
|
||||
int32 end = 3;
|
||||
}
|
||||
|
||||
message LrangeResponse {
|
||||
repeated string values = 2;
|
||||
}
|
||||
|
||||
message LremRequest {
|
||||
BaseKey key = 1;
|
||||
// count > 0 头搜索,count < 0 尾搜索
|
||||
int32 count = 2;
|
||||
string value = 3;
|
||||
}
|
||||
|
||||
message LremResponse {
|
||||
int32 count = 1;
|
||||
}
|
||||
|
||||
message LsetRequest {
|
||||
BaseKey key = 1;
|
||||
int32 index = 2;
|
||||
string value = 3;
|
||||
}
|
||||
|
||||
message LsetResponse {
|
||||
}
|
||||
|
||||
message RpopRequest {
|
||||
BaseKey key = 1;
|
||||
int32 count = 2;
|
||||
}
|
||||
|
||||
message RpopResponse {
|
||||
repeated string result = 1;
|
||||
}
|
||||
|
||||
message LtrimRequest {
|
||||
BaseKey key = 1;
|
||||
int32 start = 2;
|
||||
int32 end = 3;
|
||||
}
|
||||
|
||||
message LtrimResponse {
|
||||
}
|
||||
|
||||
message RpushRequest {
|
||||
BaseKey key = 1;
|
||||
repeated string values = 2;
|
||||
}
|
||||
|
||||
message RpushResponse {
|
||||
}
|
||||
|
||||
message RpushxRequest {
|
||||
BaseKey key = 1;
|
||||
repeated string values = 2;
|
||||
}
|
||||
|
||||
message RpushxResponse {
|
||||
}
|
|
@ -6,6 +6,7 @@ syntax = "proto3";
|
|||
option go_package = "pkg/proto";
|
||||
|
||||
import "stringx.proto";
|
||||
import "listx.proto";
|
||||
|
||||
|
||||
service CommServer {
|
||||
|
@ -19,4 +20,16 @@ service CommServer {
|
|||
rpc Getset (GetsetRequest) returns (GetsetResponse);
|
||||
rpc Strlen (StrlenRequest) returns (StrlenResponse);
|
||||
rpc Setnx (SetnxRequest) returns (SetnxResponse);
|
||||
rpc Lindex (LindexRequest) returns (LindexResponse);
|
||||
rpc Llen (LlenRequest) returns (LlenResponse);
|
||||
rpc Lpop (LpopRequest) returns (LpopResponse);
|
||||
rpc Lpush (LpushRequest) returns (LpushResponse);
|
||||
rpc Lpushx (LpushxRequest) returns (LpushxResponse);
|
||||
rpc Lrange (LrangeRequest) returns (LrangeResponse);
|
||||
rpc Lrem (LremRequest) returns (LremResponse);
|
||||
rpc Lset (LsetRequest) returns (LsetResponse);
|
||||
rpc Rpop (RpopRequest) returns (RpopResponse);
|
||||
rpc Ltrim (LtrimRequest) returns (LtrimResponse);
|
||||
rpc Rpush (RpushRequest) returns (RpushResponse);
|
||||
rpc Rpushx (RpushxRequest) returns (RpushxResponse);
|
||||
}
|
|
@ -5,6 +5,7 @@ import (
|
|||
"gitee.com/timedb/wheatCache/pkg/lru"
|
||||
"gitee.com/timedb/wheatCache/pkg/proto"
|
||||
"gitee.com/timedb/wheatCache/pkg/structure"
|
||||
"gitee.com/timedb/wheatCache/pkg/structure/listx"
|
||||
"gitee.com/timedb/wheatCache/pkg/structure/stringx"
|
||||
)
|
||||
|
||||
|
@ -194,3 +195,206 @@ func (d *Dao) Setnx(key *proto.BaseKey, val string) error {
|
|||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// listx
|
||||
|
||||
func (d *Dao) LINdex(key *proto.BaseKey, index int32) (string, error) {
|
||||
val, ok := d.lru.Get(key)
|
||||
if !ok {
|
||||
return "", errorx.KeyBaseIsNilErr()
|
||||
}
|
||||
|
||||
listVal, ok := val.(structure.ListXInterface)
|
||||
if !ok {
|
||||
return "", errorx.DaoTypeErr("listx")
|
||||
}
|
||||
return listVal.Index(int(index))
|
||||
}
|
||||
|
||||
func (d *Dao) LLen(key *proto.BaseKey) (int32, error) {
|
||||
val, ok := d.lru.Get(key)
|
||||
if !ok {
|
||||
return 0, errorx.KeyBaseIsNilErr()
|
||||
}
|
||||
|
||||
listVal, ok := val.(structure.ListXInterface)
|
||||
if !ok {
|
||||
return 0, errorx.DaoTypeErr("listx")
|
||||
}
|
||||
|
||||
return int32(listVal.Length()), nil
|
||||
}
|
||||
|
||||
func (d *Dao) LPop(key *proto.BaseKey, count int32) ([]string, error) {
|
||||
val, ok := d.lru.Get(key)
|
||||
if !ok {
|
||||
return nil, errorx.KeyBaseIsNilErr()
|
||||
}
|
||||
|
||||
listVal, ok := val.(structure.ListXInterface)
|
||||
if !ok {
|
||||
return nil, errorx.DaoTypeErr("listx")
|
||||
}
|
||||
|
||||
result, upLen := listVal.LPop(int(count))
|
||||
|
||||
d.lru.UpdateLruSize(upLen)
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (d *Dao) LPush(key *proto.BaseKey, values ...string) error {
|
||||
val, ok := d.lru.Get(key)
|
||||
if !ok {
|
||||
list := listx.NewListXSingle()
|
||||
list.LPush(values...)
|
||||
return d.lru.Add(key, list)
|
||||
}
|
||||
|
||||
listVal, ok := val.(structure.ListXInterface)
|
||||
if !ok {
|
||||
return errorx.DaoTypeErr("listx")
|
||||
}
|
||||
|
||||
upLen := listVal.LPush(values...)
|
||||
d.lru.UpdateLruSize(upLen)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *Dao) LPushX(key *proto.BaseKey, values ...string) error {
|
||||
val, ok := d.lru.Get(key)
|
||||
if !ok {
|
||||
return errorx.KeyBaseIsNilErr()
|
||||
}
|
||||
|
||||
listVal, ok := val.(structure.ListXInterface)
|
||||
if !ok {
|
||||
return errorx.DaoTypeErr("listx")
|
||||
}
|
||||
|
||||
upLen := listVal.LPush(values...)
|
||||
d.lru.UpdateLruSize(upLen)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *Dao) LRange(key *proto.BaseKey, start, end int32) ([]string, error) {
|
||||
val, ok := d.lru.Get(key)
|
||||
if !ok {
|
||||
return nil, errorx.KeyBaseIsNilErr()
|
||||
}
|
||||
|
||||
listVal, ok := val.(structure.ListXInterface)
|
||||
if !ok {
|
||||
return nil, errorx.DaoTypeErr("listx")
|
||||
}
|
||||
|
||||
return listVal.Range(int(start), int(end))
|
||||
}
|
||||
|
||||
func (d *Dao) LRemove(key *proto.BaseKey, count int32, value string) (int, error) {
|
||||
val, ok := d.lru.Get(key)
|
||||
if !ok {
|
||||
return 0, errorx.KeyBaseIsNilErr()
|
||||
}
|
||||
|
||||
listVal, ok := val.(structure.ListXInterface)
|
||||
if !ok {
|
||||
return 0, errorx.DaoTypeErr("listx")
|
||||
}
|
||||
|
||||
remCount, upLen := listVal.Remove(value, int(count))
|
||||
d.lru.UpdateLruSize(upLen)
|
||||
|
||||
return remCount, nil
|
||||
}
|
||||
|
||||
func (d *Dao) LSet(key *proto.BaseKey, index int32, value string) error {
|
||||
val, ok := d.lru.Get(key)
|
||||
if !ok {
|
||||
return errorx.KeyBaseIsNilErr()
|
||||
}
|
||||
|
||||
listVal, ok := val.(structure.ListXInterface)
|
||||
if !ok {
|
||||
return errorx.DaoTypeErr("listx")
|
||||
}
|
||||
|
||||
upLen, err := listVal.Insert(int(index), false, value)
|
||||
d.lru.UpdateLruSize(upLen)
|
||||
return err
|
||||
}
|
||||
|
||||
func (d *Dao) RPop(key *proto.BaseKey, count int32) ([]string, error) {
|
||||
val, ok := d.lru.Get(key)
|
||||
if !ok {
|
||||
return nil, errorx.KeyBaseIsNilErr()
|
||||
}
|
||||
|
||||
listVal, ok := val.(structure.ListXInterface)
|
||||
if !ok {
|
||||
return nil, errorx.DaoTypeErr("listx")
|
||||
}
|
||||
|
||||
result, upLen := listVal.RPop(int(count))
|
||||
|
||||
d.lru.UpdateLruSize(upLen)
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (d *Dao) LTrim(key *proto.BaseKey, start, end int32) error {
|
||||
val, ok := d.lru.Get(key)
|
||||
if !ok {
|
||||
return errorx.KeyBaseIsNilErr()
|
||||
}
|
||||
|
||||
listVal, ok := val.(structure.ListXInterface)
|
||||
if !ok {
|
||||
return errorx.DaoTypeErr("listx")
|
||||
}
|
||||
|
||||
upLen, err := listVal.Slice(int(start), int(end))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
d.lru.UpdateLruSize(upLen)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *Dao) RPush(key *proto.BaseKey, values ...string) error {
|
||||
val, ok := d.lru.Get(key)
|
||||
if !ok {
|
||||
list := listx.NewListXSingle()
|
||||
list.RPush(values...)
|
||||
return d.lru.Add(key, list)
|
||||
}
|
||||
|
||||
listVal, ok := val.(structure.ListXInterface)
|
||||
if !ok {
|
||||
return errorx.DaoTypeErr("listx")
|
||||
}
|
||||
|
||||
upLen := listVal.RPush(values...)
|
||||
d.lru.UpdateLruSize(upLen)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *Dao) RPushX(key *proto.BaseKey, values ...string) error {
|
||||
val, ok := d.lru.Get(key)
|
||||
if !ok {
|
||||
return errorx.KeyBaseIsNilErr()
|
||||
}
|
||||
|
||||
listVal, ok := val.(structure.ListXInterface)
|
||||
if !ok {
|
||||
return errorx.DaoTypeErr("listx")
|
||||
}
|
||||
|
||||
upLen := listVal.RPush(values...)
|
||||
d.lru.UpdateLruSize(upLen)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -0,0 +1,261 @@
|
|||
package single
|
||||
|
||||
import (
|
||||
context "context"
|
||||
|
||||
"gitee.com/timedb/wheatCache/pkg/event"
|
||||
"gitee.com/timedb/wheatCache/pkg/lru"
|
||||
"gitee.com/timedb/wheatCache/pkg/proto"
|
||||
)
|
||||
|
||||
func (s *serverSingle) Lindex(
|
||||
ctx context.Context,
|
||||
req *proto.LindexRequest,
|
||||
) (*proto.LindexResponse, error) {
|
||||
work := event.EventWorkFunc(func() (interface{}, error) {
|
||||
return s.dao.LINdex(req.Key, req.Index)
|
||||
})
|
||||
|
||||
lruEvent := event.NewEvent(lru.OptionEventName)
|
||||
lruEvent.InitWaitEvent()
|
||||
lruEvent.SetValue(lru.WorkFuncEventKey, work)
|
||||
s.lruProduce.Call(ctx, lruEvent)
|
||||
resp, err := lruEvent.StartWaitEvent(s.timeOut)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &proto.LindexResponse{
|
||||
Result: resp.(string),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (s *serverSingle) Llen(
|
||||
ctx context.Context,
|
||||
req *proto.LlenRequest,
|
||||
) (*proto.LlenResponse, error) {
|
||||
work := event.EventWorkFunc(func() (interface{}, error) {
|
||||
return s.dao.LLen(req.Key)
|
||||
})
|
||||
|
||||
lruEvent := event.NewEvent(lru.OptionEventName)
|
||||
lruEvent.InitWaitEvent()
|
||||
lruEvent.SetValue(lru.WorkFuncEventKey, work)
|
||||
s.lruProduce.Call(ctx, lruEvent)
|
||||
resp, err := lruEvent.StartWaitEvent(s.timeOut)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &proto.LlenResponse{
|
||||
Length: resp.(int32),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (s *serverSingle) Lpop(
|
||||
ctx context.Context,
|
||||
request *proto.LpopRequest,
|
||||
) (*proto.LpopResponse, error) {
|
||||
work := event.EventWorkFunc(func() (interface{}, error) {
|
||||
return s.dao.LPop(request.Key, request.Count)
|
||||
})
|
||||
|
||||
lruEvent := event.NewEvent(lru.OptionEventName)
|
||||
lruEvent.InitWaitEvent()
|
||||
lruEvent.SetValue(lru.WorkFuncEventKey, work)
|
||||
s.lruProduce.Call(ctx, lruEvent)
|
||||
resp, err := lruEvent.StartWaitEvent(s.timeOut)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &proto.LpopResponse{
|
||||
Results: resp.([]string),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (s *serverSingle) Lpush(
|
||||
ctx context.Context,
|
||||
req *proto.LpushRequest,
|
||||
) (*proto.LpushResponse, error) {
|
||||
work := event.EventWorkFunc(func() (interface{}, error) {
|
||||
return nil, s.dao.LPush(req.Key, req.Values...)
|
||||
})
|
||||
|
||||
lruEvent := event.NewEvent(lru.OptionEventName)
|
||||
lruEvent.InitWaitEvent()
|
||||
lruEvent.SetValue(lru.WorkFuncEventKey, work)
|
||||
s.lruProduce.Call(ctx, lruEvent)
|
||||
_, err := lruEvent.StartWaitEvent(s.timeOut)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &proto.LpushResponse{}, nil
|
||||
}
|
||||
|
||||
func (s *serverSingle) Lpushx(
|
||||
ctx context.Context,
|
||||
req *proto.LpushxRequest,
|
||||
) (*proto.LpushxResponse, error) {
|
||||
work := event.EventWorkFunc(func() (interface{}, error) {
|
||||
return nil, s.dao.LPush(req.Key, req.Values...)
|
||||
})
|
||||
|
||||
lruEvent := event.NewEvent(lru.OptionEventName)
|
||||
lruEvent.InitWaitEvent()
|
||||
lruEvent.SetValue(lru.WorkFuncEventKey, work)
|
||||
s.lruProduce.Call(ctx, lruEvent)
|
||||
_, err := lruEvent.StartWaitEvent(s.timeOut)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &proto.LpushxResponse{}, nil
|
||||
}
|
||||
|
||||
func (s *serverSingle) Lrange(
|
||||
ctx context.Context,
|
||||
req *proto.LrangeRequest,
|
||||
) (*proto.LrangeResponse, error) {
|
||||
work := event.EventWorkFunc(func() (interface{}, error) {
|
||||
return s.dao.LRange(req.Key, req.Start, req.End)
|
||||
})
|
||||
|
||||
lruEvent := event.NewEvent(lru.OptionEventName)
|
||||
lruEvent.InitWaitEvent()
|
||||
lruEvent.SetValue(lru.WorkFuncEventKey, work)
|
||||
s.lruProduce.Call(ctx, lruEvent)
|
||||
resp, err := lruEvent.StartWaitEvent(s.timeOut)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &proto.LrangeResponse{
|
||||
Values: resp.([]string),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (s *serverSingle) Lrem(
|
||||
ctx context.Context,
|
||||
req *proto.LremRequest,
|
||||
) (*proto.LremResponse, error) {
|
||||
work := event.EventWorkFunc(func() (interface{}, error) {
|
||||
return s.dao.LRemove(req.Key, req.Count, req.Value)
|
||||
})
|
||||
|
||||
lruEvent := event.NewEvent(lru.OptionEventName)
|
||||
lruEvent.InitWaitEvent()
|
||||
lruEvent.SetValue(lru.WorkFuncEventKey, work)
|
||||
s.lruProduce.Call(ctx, lruEvent)
|
||||
resp, err := lruEvent.StartWaitEvent(s.timeOut)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &proto.LremResponse{
|
||||
Count: resp.(int32),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (s *serverSingle) Lset(
|
||||
ctx context.Context,
|
||||
req *proto.LsetRequest,
|
||||
) (*proto.LsetResponse, error) {
|
||||
work := event.EventWorkFunc(func() (interface{}, error) {
|
||||
return nil, s.dao.LSet(req.Key, req.Index, req.Value)
|
||||
})
|
||||
|
||||
lruEvent := event.NewEvent(lru.OptionEventName)
|
||||
lruEvent.InitWaitEvent()
|
||||
lruEvent.SetValue(lru.WorkFuncEventKey, work)
|
||||
s.lruProduce.Call(ctx, lruEvent)
|
||||
_, err := lruEvent.StartWaitEvent(s.timeOut)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &proto.LsetResponse{}, nil
|
||||
}
|
||||
|
||||
func (s *serverSingle) Rpop(
|
||||
ctx context.Context,
|
||||
req *proto.RpopRequest,
|
||||
) (*proto.RpopResponse, error) {
|
||||
work := event.EventWorkFunc(func() (interface{}, error) {
|
||||
return s.dao.RPop(req.Key, req.Count)
|
||||
})
|
||||
|
||||
lruEvent := event.NewEvent(lru.OptionEventName)
|
||||
lruEvent.InitWaitEvent()
|
||||
lruEvent.SetValue(lru.WorkFuncEventKey, work)
|
||||
s.lruProduce.Call(ctx, lruEvent)
|
||||
resp, err := lruEvent.StartWaitEvent(s.timeOut)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &proto.RpopResponse{
|
||||
Result: resp.([]string),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (s *serverSingle) Ltrim(
|
||||
ctx context.Context,
|
||||
req *proto.LtrimRequest,
|
||||
) (*proto.LtrimResponse, error) {
|
||||
work := event.EventWorkFunc(func() (interface{}, error) {
|
||||
return nil, s.dao.LTrim(req.Key, req.Start, req.End)
|
||||
})
|
||||
|
||||
lruEvent := event.NewEvent(lru.OptionEventName)
|
||||
lruEvent.InitWaitEvent()
|
||||
lruEvent.SetValue(lru.WorkFuncEventKey, work)
|
||||
s.lruProduce.Call(ctx, lruEvent)
|
||||
_, err := lruEvent.StartWaitEvent(s.timeOut)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &proto.LtrimResponse{}, nil
|
||||
}
|
||||
|
||||
func (s *serverSingle) Rpush(
|
||||
ctx context.Context,
|
||||
req *proto.RpushRequest,
|
||||
) (*proto.RpushResponse, error) {
|
||||
work := event.EventWorkFunc(func() (interface{}, error) {
|
||||
return nil, s.dao.RPush(req.Key, req.Values...)
|
||||
})
|
||||
|
||||
lruEvent := event.NewEvent(lru.OptionEventName)
|
||||
lruEvent.InitWaitEvent()
|
||||
lruEvent.SetValue(lru.WorkFuncEventKey, work)
|
||||
s.lruProduce.Call(ctx, lruEvent)
|
||||
_, err := lruEvent.StartWaitEvent(s.timeOut)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &proto.RpushResponse{}, nil
|
||||
}
|
||||
|
||||
func (s *serverSingle) Rpushx(
|
||||
ctx context.Context,
|
||||
req *proto.RpushxRequest,
|
||||
) (*proto.RpushxResponse, error) {
|
||||
work := event.EventWorkFunc(func() (interface{}, error) {
|
||||
return nil, s.dao.RPushX(req.Key, req.Values...)
|
||||
})
|
||||
|
||||
lruEvent := event.NewEvent(lru.OptionEventName)
|
||||
lruEvent.InitWaitEvent()
|
||||
lruEvent.SetValue(lru.WorkFuncEventKey, work)
|
||||
s.lruProduce.Call(ctx, lruEvent)
|
||||
_, err := lruEvent.StartWaitEvent(s.timeOut)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &proto.RpushxResponse{}, nil
|
||||
}
|
|
@ -9,7 +9,7 @@ import (
|
|||
)
|
||||
|
||||
func (s *serverSingle) Set(
|
||||
cxt context.Context,
|
||||
ctx context.Context,
|
||||
req *proto.SetRequest,
|
||||
) (*proto.SetResponse, error) {
|
||||
|
||||
|
@ -20,7 +20,7 @@ func (s *serverSingle) Set(
|
|||
lruEvent := event.NewEvent(lru.OptionEventName)
|
||||
lruEvent.InitWaitEvent()
|
||||
lruEvent.SetValue(lru.WorkFuncEventKey, work)
|
||||
s.lruProduce.Call(cxt, lruEvent)
|
||||
s.lruProduce.Call(ctx, lruEvent)
|
||||
resp, err := lruEvent.StartWaitEvent(s.timeOut)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
|
Loading…
Reference in New Issue