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()
|
### 插件的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{
|
var file_storage_proto_rawDesc = []byte{
|
||||||
0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,
|
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,
|
0x0d, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x78, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0b,
|
||||||
0x03, 0x0a, 0x0a, 0x43, 0x6f, 0x6d, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x20, 0x0a,
|
0x6c, 0x69, 0x73, 0x74, 0x78, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0xff, 0x06, 0x0a, 0x0a,
|
||||||
0x03, 0x53, 0x65, 0x74, 0x12, 0x0b, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
|
0x43, 0x6f, 0x6d, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x03, 0x53, 0x65,
|
||||||
0x74, 0x1a, 0x0c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
|
0x74, 0x12, 0x0b, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0c,
|
||||||
0x20, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x0b, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75,
|
0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x03,
|
||||||
0x65, 0x73, 0x74, 0x1a, 0x0c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
|
0x47, 0x65, 0x74, 0x12, 0x0b, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
|
||||||
0x65, 0x12, 0x20, 0x0a, 0x03, 0x41, 0x64, 0x64, 0x12, 0x0b, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65,
|
0x1a, 0x0c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20,
|
||||||
0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f,
|
0x0a, 0x03, 0x41, 0x64, 0x64, 0x12, 0x0b, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65,
|
||||||
0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x52, 0x65, 0x64, 0x75, 0x63, 0x65, 0x12, 0x0e, 0x2e,
|
0x73, 0x74, 0x1a, 0x0c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
|
||||||
0x52, 0x65, 0x64, 0x75, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e,
|
0x12, 0x29, 0x0a, 0x06, 0x52, 0x65, 0x64, 0x75, 0x63, 0x65, 0x12, 0x0e, 0x2e, 0x52, 0x65, 0x64,
|
||||||
0x52, 0x65, 0x64, 0x75, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29,
|
0x75, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x52, 0x65, 0x64,
|
||||||
0x0a, 0x06, 0x53, 0x65, 0x74, 0x62, 0x69, 0x74, 0x12, 0x0e, 0x2e, 0x53, 0x65, 0x74, 0x62, 0x69,
|
0x75, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x53,
|
||||||
0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x53, 0x65, 0x74, 0x62, 0x69,
|
0x65, 0x74, 0x62, 0x69, 0x74, 0x12, 0x0e, 0x2e, 0x53, 0x65, 0x74, 0x62, 0x69, 0x74, 0x52, 0x65,
|
||||||
0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x47, 0x65, 0x74,
|
0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x53, 0x65, 0x74, 0x62, 0x69, 0x74, 0x52, 0x65,
|
||||||
0x62, 0x69, 0x74, 0x12, 0x0e, 0x2e, 0x47, 0x65, 0x74, 0x62, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75,
|
0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x62, 0x69, 0x74,
|
||||||
0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x47, 0x65, 0x74, 0x62, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70,
|
0x12, 0x0e, 0x2e, 0x47, 0x65, 0x74, 0x62, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
|
||||||
0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x72, 0x61, 0x6e, 0x67, 0x65,
|
0x1a, 0x0f, 0x2e, 0x47, 0x65, 0x74, 0x62, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
|
||||||
0x12, 0x10, 0x2e, 0x47, 0x65, 0x74, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
|
0x65, 0x12, 0x2f, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x10, 0x2e,
|
||||||
0x73, 0x74, 0x1a, 0x11, 0x2e, 0x47, 0x65, 0x74, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73,
|
0x47, 0x65, 0x74, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
|
||||||
0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x73, 0x65, 0x74, 0x12,
|
0x11, 0x2e, 0x47, 0x65, 0x74, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
|
||||||
0x0e, 0x2e, 0x47, 0x65, 0x74, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
|
0x73, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x73, 0x65, 0x74, 0x12, 0x0e, 0x2e, 0x47,
|
||||||
0x0f, 0x2e, 0x47, 0x65, 0x74, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
|
0x65, 0x74, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x47,
|
||||||
0x12, 0x29, 0x0a, 0x06, 0x53, 0x74, 0x72, 0x6c, 0x65, 0x6e, 0x12, 0x0e, 0x2e, 0x53, 0x74, 0x72,
|
0x65, 0x74, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a,
|
||||||
0x6c, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x53, 0x74, 0x72,
|
0x06, 0x53, 0x74, 0x72, 0x6c, 0x65, 0x6e, 0x12, 0x0e, 0x2e, 0x53, 0x74, 0x72, 0x6c, 0x65, 0x6e,
|
||||||
0x6c, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x05, 0x53,
|
0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x53, 0x74, 0x72, 0x6c, 0x65, 0x6e,
|
||||||
0x65, 0x74, 0x6e, 0x78, 0x12, 0x0d, 0x2e, 0x53, 0x65, 0x74, 0x6e, 0x78, 0x52, 0x65, 0x71, 0x75,
|
0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x05, 0x53, 0x65, 0x74, 0x6e,
|
||||||
0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x53, 0x65, 0x74, 0x6e, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f,
|
0x78, 0x12, 0x0d, 0x2e, 0x53, 0x65, 0x74, 0x6e, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
|
||||||
0x6e, 0x73, 0x65, 0x42, 0x0b, 0x5a, 0x09, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
|
0x1a, 0x0e, 0x2e, 0x53, 0x65, 0x74, 0x6e, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
|
||||||
0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
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{}{
|
var file_storage_proto_goTypes = []interface{}{
|
||||||
|
@ -72,16 +103,40 @@ var file_storage_proto_goTypes = []interface{}{
|
||||||
(*GetsetRequest)(nil), // 7: GetsetRequest
|
(*GetsetRequest)(nil), // 7: GetsetRequest
|
||||||
(*StrlenRequest)(nil), // 8: StrlenRequest
|
(*StrlenRequest)(nil), // 8: StrlenRequest
|
||||||
(*SetnxRequest)(nil), // 9: SetnxRequest
|
(*SetnxRequest)(nil), // 9: SetnxRequest
|
||||||
(*SetResponse)(nil), // 10: SetResponse
|
(*LindexRequest)(nil), // 10: LindexRequest
|
||||||
(*GetResponse)(nil), // 11: GetResponse
|
(*LlenRequest)(nil), // 11: LlenRequest
|
||||||
(*AddResponse)(nil), // 12: AddResponse
|
(*LpopRequest)(nil), // 12: LpopRequest
|
||||||
(*ReduceResponse)(nil), // 13: ReduceResponse
|
(*LpushRequest)(nil), // 13: LpushRequest
|
||||||
(*SetbitResponse)(nil), // 14: SetbitResponse
|
(*LpushxRequest)(nil), // 14: LpushxRequest
|
||||||
(*GetbitResponse)(nil), // 15: GetbitResponse
|
(*LrangeRequest)(nil), // 15: LrangeRequest
|
||||||
(*GetrangeResponse)(nil), // 16: GetrangeResponse
|
(*LremRequest)(nil), // 16: LremRequest
|
||||||
(*GetsetResponse)(nil), // 17: GetsetResponse
|
(*LsetRequest)(nil), // 17: LsetRequest
|
||||||
(*StrlenResponse)(nil), // 18: StrlenResponse
|
(*RpopRequest)(nil), // 18: RpopRequest
|
||||||
(*SetnxResponse)(nil), // 19: SetnxResponse
|
(*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{
|
var file_storage_proto_depIdxs = []int32{
|
||||||
0, // 0: CommServer.Set:input_type -> SetRequest
|
0, // 0: CommServer.Set:input_type -> SetRequest
|
||||||
|
@ -94,18 +149,42 @@ var file_storage_proto_depIdxs = []int32{
|
||||||
7, // 7: CommServer.Getset:input_type -> GetsetRequest
|
7, // 7: CommServer.Getset:input_type -> GetsetRequest
|
||||||
8, // 8: CommServer.Strlen:input_type -> StrlenRequest
|
8, // 8: CommServer.Strlen:input_type -> StrlenRequest
|
||||||
9, // 9: CommServer.Setnx:input_type -> SetnxRequest
|
9, // 9: CommServer.Setnx:input_type -> SetnxRequest
|
||||||
10, // 10: CommServer.Set:output_type -> SetResponse
|
10, // 10: CommServer.Lindex:input_type -> LindexRequest
|
||||||
11, // 11: CommServer.Get:output_type -> GetResponse
|
11, // 11: CommServer.Llen:input_type -> LlenRequest
|
||||||
12, // 12: CommServer.Add:output_type -> AddResponse
|
12, // 12: CommServer.Lpop:input_type -> LpopRequest
|
||||||
13, // 13: CommServer.Reduce:output_type -> ReduceResponse
|
13, // 13: CommServer.Lpush:input_type -> LpushRequest
|
||||||
14, // 14: CommServer.Setbit:output_type -> SetbitResponse
|
14, // 14: CommServer.Lpushx:input_type -> LpushxRequest
|
||||||
15, // 15: CommServer.Getbit:output_type -> GetbitResponse
|
15, // 15: CommServer.Lrange:input_type -> LrangeRequest
|
||||||
16, // 16: CommServer.Getrange:output_type -> GetrangeResponse
|
16, // 16: CommServer.Lrem:input_type -> LremRequest
|
||||||
17, // 17: CommServer.Getset:output_type -> GetsetResponse
|
17, // 17: CommServer.Lset:input_type -> LsetRequest
|
||||||
18, // 18: CommServer.Strlen:output_type -> StrlenResponse
|
18, // 18: CommServer.Rpop:input_type -> RpopRequest
|
||||||
19, // 19: CommServer.Setnx:output_type -> SetnxResponse
|
19, // 19: CommServer.Ltrim:input_type -> LtrimRequest
|
||||||
10, // [10:20] is the sub-list for method output_type
|
20, // 20: CommServer.Rpush:input_type -> RpushRequest
|
||||||
0, // [0:10] is the sub-list for method input_type
|
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 type_name
|
||||||
0, // [0:0] is the sub-list for extension extendee
|
0, // [0:0] is the sub-list for extension extendee
|
||||||
0, // [0:0] is the sub-list for field type_name
|
0, // [0:0] is the sub-list for field type_name
|
||||||
|
@ -117,6 +196,7 @@ func file_storage_proto_init() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
file_stringx_proto_init()
|
file_stringx_proto_init()
|
||||||
|
file_listx_proto_init()
|
||||||
type x struct{}
|
type x struct{}
|
||||||
out := protoimpl.TypeBuilder{
|
out := protoimpl.TypeBuilder{
|
||||||
File: protoimpl.DescBuilder{
|
File: protoimpl.DescBuilder{
|
||||||
|
@ -158,6 +238,18 @@ type CommServerClient interface {
|
||||||
Getset(ctx context.Context, in *GetsetRequest, opts ...grpc.CallOption) (*GetsetResponse, error)
|
Getset(ctx context.Context, in *GetsetRequest, opts ...grpc.CallOption) (*GetsetResponse, error)
|
||||||
Strlen(ctx context.Context, in *StrlenRequest, opts ...grpc.CallOption) (*StrlenResponse, error)
|
Strlen(ctx context.Context, in *StrlenRequest, opts ...grpc.CallOption) (*StrlenResponse, error)
|
||||||
Setnx(ctx context.Context, in *SetnxRequest, opts ...grpc.CallOption) (*SetnxResponse, 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 {
|
type commServerClient struct {
|
||||||
|
@ -258,6 +350,114 @@ func (c *commServerClient) Setnx(ctx context.Context, in *SetnxRequest, opts ...
|
||||||
return out, nil
|
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.
|
// CommServerServer is the server API for CommServer service.
|
||||||
type CommServerServer interface {
|
type CommServerServer interface {
|
||||||
Set(context.Context, *SetRequest) (*SetResponse, error)
|
Set(context.Context, *SetRequest) (*SetResponse, error)
|
||||||
|
@ -270,6 +470,18 @@ type CommServerServer interface {
|
||||||
Getset(context.Context, *GetsetRequest) (*GetsetResponse, error)
|
Getset(context.Context, *GetsetRequest) (*GetsetResponse, error)
|
||||||
Strlen(context.Context, *StrlenRequest) (*StrlenResponse, error)
|
Strlen(context.Context, *StrlenRequest) (*StrlenResponse, error)
|
||||||
Setnx(context.Context, *SetnxRequest) (*SetnxResponse, 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.
|
// 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) {
|
func (*UnimplementedCommServerServer) Setnx(context.Context, *SetnxRequest) (*SetnxResponse, error) {
|
||||||
return nil, status.Errorf(codes.Unimplemented, "method Setnx not implemented")
|
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) {
|
func RegisterCommServerServer(s *grpc.Server, srv CommServerServer) {
|
||||||
s.RegisterService(&_CommServer_serviceDesc, srv)
|
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)
|
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{
|
var _CommServer_serviceDesc = grpc.ServiceDesc{
|
||||||
ServiceName: "CommServer",
|
ServiceName: "CommServer",
|
||||||
HandlerType: (*CommServerServer)(nil),
|
HandlerType: (*CommServerServer)(nil),
|
||||||
|
@ -535,6 +999,54 @@ var _CommServer_serviceDesc = grpc.ServiceDesc{
|
||||||
MethodName: "Setnx",
|
MethodName: "Setnx",
|
||||||
Handler: _CommServer_Setnx_Handler,
|
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{},
|
Streams: []grpc.StreamDesc{},
|
||||||
Metadata: "storage.proto",
|
Metadata: "storage.proto",
|
||||||
|
|
|
@ -7,6 +7,7 @@ const (
|
||||||
DEFAULT_KEY = iota
|
DEFAULT_KEY = iota
|
||||||
|
|
||||||
STRING_X
|
STRING_X
|
||||||
|
LIST_X
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -21,6 +22,18 @@ const (
|
||||||
GETSET
|
GETSET
|
||||||
STRLEN
|
STRLEN
|
||||||
SETNX
|
SETNX
|
||||||
|
LINDEX
|
||||||
|
LLEN
|
||||||
|
LPOP
|
||||||
|
LPUSH
|
||||||
|
LPUSHX
|
||||||
|
LRANGE
|
||||||
|
LREM
|
||||||
|
LSET
|
||||||
|
RPOP
|
||||||
|
LTRIM
|
||||||
|
RPUSH
|
||||||
|
RPUSHX
|
||||||
)
|
)
|
||||||
|
|
||||||
var CommKeyString = map[string]int{"set": STRING_X,
|
var CommKeyString = map[string]int{"set": STRING_X,
|
||||||
|
@ -33,6 +46,18 @@ var CommKeyString = map[string]int{"set": STRING_X,
|
||||||
"getset": STRING_X,
|
"getset": STRING_X,
|
||||||
"strlen": STRING_X,
|
"strlen": STRING_X,
|
||||||
"setnx": 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,
|
var CommKey = map[int]int{SET: STRING_X,
|
||||||
|
@ -45,4 +70,16 @@ var CommKey = map[int]int{SET: STRING_X,
|
||||||
GETSET: STRING_X,
|
GETSET: STRING_X,
|
||||||
STRLEN: STRING_X,
|
STRLEN: STRING_X,
|
||||||
SETNX: 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
|
DynamicFloat
|
||||||
DynamicString
|
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)
|
||||||
|
}
|
||||||
|
|
|
@ -12,3 +12,17 @@ STRING_X:
|
||||||
- getset
|
- getset
|
||||||
- strlen
|
- 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
|
package stringx
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"testing"
|
"testing"
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
"gitee.com/timedb/wheatCache/pkg/structure"
|
"gitee.com/timedb/wheatCache/pkg/structure"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
@ -89,3 +91,8 @@ func TestStringSingle_Getrange(t *testing.T) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, "abc", k)
|
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
|
onType DynamicType
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewValue() *Value {
|
func NewValue(val ...string) *Value {
|
||||||
return &Value{
|
|
||||||
|
stcValue := &Value{
|
||||||
val: make([]byte, defaultLen),
|
val: make([]byte, defaultLen),
|
||||||
length: 0,
|
length: 0,
|
||||||
onType: DynamicNull,
|
onType: DynamicNull,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if len(val) > 0 {
|
||||||
|
stcValue.InferValue(val[0])
|
||||||
|
}
|
||||||
|
return stcValue
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *Value) GetLength() int {
|
func (v *Value) GetLength() int {
|
||||||
return len(v.val)
|
return v.length
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *Value) GetSize() int {
|
func (v *Value) GetSize() int {
|
||||||
return v.length
|
return len(v.val) + 16
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *Value) GetDynamicType() DynamicType {
|
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";
|
option go_package = "pkg/proto";
|
||||||
|
|
||||||
import "stringx.proto";
|
import "stringx.proto";
|
||||||
|
import "listx.proto";
|
||||||
|
|
||||||
|
|
||||||
service CommServer {
|
service CommServer {
|
||||||
|
@ -19,4 +20,16 @@ service CommServer {
|
||||||
rpc Getset (GetsetRequest) returns (GetsetResponse);
|
rpc Getset (GetsetRequest) returns (GetsetResponse);
|
||||||
rpc Strlen (StrlenRequest) returns (StrlenResponse);
|
rpc Strlen (StrlenRequest) returns (StrlenResponse);
|
||||||
rpc Setnx (SetnxRequest) returns (SetnxResponse);
|
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/lru"
|
||||||
"gitee.com/timedb/wheatCache/pkg/proto"
|
"gitee.com/timedb/wheatCache/pkg/proto"
|
||||||
"gitee.com/timedb/wheatCache/pkg/structure"
|
"gitee.com/timedb/wheatCache/pkg/structure"
|
||||||
|
"gitee.com/timedb/wheatCache/pkg/structure/listx"
|
||||||
"gitee.com/timedb/wheatCache/pkg/structure/stringx"
|
"gitee.com/timedb/wheatCache/pkg/structure/stringx"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -194,3 +195,206 @@ func (d *Dao) Setnx(key *proto.BaseKey, val string) error {
|
||||||
}
|
}
|
||||||
return nil
|
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(
|
func (s *serverSingle) Set(
|
||||||
cxt context.Context,
|
ctx context.Context,
|
||||||
req *proto.SetRequest,
|
req *proto.SetRequest,
|
||||||
) (*proto.SetResponse, error) {
|
) (*proto.SetResponse, error) {
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ func (s *serverSingle) Set(
|
||||||
lruEvent := event.NewEvent(lru.OptionEventName)
|
lruEvent := event.NewEvent(lru.OptionEventName)
|
||||||
lruEvent.InitWaitEvent()
|
lruEvent.InitWaitEvent()
|
||||||
lruEvent.SetValue(lru.WorkFuncEventKey, work)
|
lruEvent.SetValue(lru.WorkFuncEventKey, work)
|
||||||
s.lruProduce.Call(cxt, lruEvent)
|
s.lruProduce.Call(ctx, lruEvent)
|
||||||
resp, err := lruEvent.StartWaitEvent(s.timeOut)
|
resp, err := lruEvent.StartWaitEvent(s.timeOut)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
Loading…
Reference in New Issue