# lightkv 轻量化key-value缓存服务
- 支持字符串key-value、 key-map、key-list、key-set存储
- 可持久化到本地
- 提供api访问和grpc访问接口
- 简单易用
## 启动server
```bash
go run main/server.go
```
- 会启动一个api服务(http://localhost:9981) 和一个rpc服务(9980端口)
- api 提供的方法有 put、del、get、hput、hget、hgetm、hdelm、hdel、lget、lgetr、lput、ldel、ldelr、sget、sput、sdel、sdelm
### api普通字符串(put、del、get)
- http://localhost:9981/put?key=add1&value=addvalue1 api新增一条kv,key为add1,value为addvalue1,kv不过期
- http://localhost:9981/put?key=add2&value=addvalue2&expire=100 api新增一条kv,key为add2,value为addvalue2,100秒后kv过期
- http://localhost:9981/del/add2 api删除key为add2的kv
- http://localhost:9981/get/add1 api获取key为add1的kv
### api map(hput、hget、hgetm、hdelm、hdel)
- http://localhost:9981/hput?hmkey=hm1&key=k1&value=v1&key=k2&value=v2 往hm1的map添加两个元素{"k1":"v1","k2":"v2"}
- http://localhost:9981/hget/hm1 获取hm1的map
- http://localhost:9981/hgetm/hm1/k1 获取hm1的map中k1的元素
- http://localhost:9981/hdelm/hm1/k1 删除hm1的map中k1的元素
- http://localhost:9981/hdel/hm1 删除hm1的map
### api list(lget、lgetr、lput、ldel、ldelr)
- http://localhost:9981/lput?key=test&value=a&value=b&value=c&value=d 往test的list添加两个元素{"a":"c","c":"d"}
- http://localhost:9981/lget/test 获取test的list
- http://localhost:9981/lgetr/test?begIndex=1&endIndex=3 获取test的list下表1-3的元素
- http://localhost:9981/ldelr/test?begIndex=1&endIndex=3 删除test的list下表1-3的元素
- http://localhost:9981/ldel/test 删除test的list
### api set(sget、sput、sdel、sdelm)
- http://localhost:9981/sput?key=test&value=a&value=b&value=c&value=d 往test的set添加两个元素{"a":"c","c":"d"}
- http://localhost:9981/sget/test 获取test的set
- http://localhost:9981/sdelm/test?value=a 删除test的set中的a元素
- http://localhost:9981/sdel/test 删除test的set
## 启动测试rpc客户端
```bash
go run main/client.go
```
## rpc 客户端用法
### 普通字符串 用法
```go
c := server.NewClient("127.0.0.1:9980")
c.Start()
defer c.Close()
c.ClearValue()
//添加kv
c.Put("test","test_value",0)
c.Put("test1/tttt","test1_value",0)
c.Put("test2","test2_value",5)
c.Put("test3","test3_value",5)
v := c.Get("test2")
log.Printf("获取 test2 的值:%s", v)
//删除kv
c.Del("test2")
log.Printf("删除 test2 之后的值:%s", c.Get("test2"))
//监听key值,发生变化回调通知
c.WatchKey("watch1", func(k string, beforeV string, afterV string, t kv.OpType) {
if t == kv.Add {
log.Printf("监听的 key:%s 新增了, 变化前:%s\n变化后:%s\n", k, beforeV, afterV)
}else if t == kv.Del {
log.Printf("监听的 key:%s 删除了, 变化前:%s\n变化后:%s\n", k, beforeV, afterV)
}
})
//key值发生变化回调通知
c.WatchKey("unwatch", func(k string, beforeV string, afterV string, t kv.OpType) {
if t == kv.Add {
log.Printf("监听的 key:%s 新增了, 变化前:%s\n变化后:%s\n", k, beforeV, afterV)
}else if t == kv.Del {
log.Printf("监听的 key:%s 删除了, 变化前:%s\n变化后:%s\n", k, beforeV, afterV)
}
})
c.WatchKey("watchdel", func(k string, beforeV string, afterV string, t kv.OpType) {
if t == kv.Add {
log.Printf("监听的 key:%s 新增了, 变化前:%s\n变化后:%s\n", k, beforeV, afterV)
}else if t == kv.Del {
log.Printf("监听的 key:%s 删除了, 变化前:%s\n变化后:%s\n", k, beforeV, afterV)
}
})
c.Put("unwatch", "this is before unwatch", 0)
time.Sleep(1*time.Second)
//取消监听key值的变化
c.UnWatchKey("unwatch")
c.Put("watch1", "this is watch1", 0)
c.Put("unwatch", "this is after unwatch", 0)
c.Put("watchdel", "this is watchdel", 0)
log.Printf("获取 watchdel:%s", c.Get("watchdel"))
c.Del("watchdel")
log.Printf("获取 unwatch:%s", c.Get("unwatch"))
```
### map 用法
```go
c := server.NewClient("127.0.0.1:9980")
c.Start()
defer c.Close()
c.ClearMap()
keys := []string{"k1", "k2", "k3"}
vals := []string{"v1", "v2", "v3"}
//新增map
c.HMPut("hmtest1", keys, vals, 0)
str := c.HMGet("hmtest1")
log.Printf("获取hmtest1 map:\n%s", str)
//删除hmtest1 map 中的k1
c.HMDelMember("hmtest1", "k1")
str = c.HMGet("hmtest1")
log.Printf("hmtest1 map 删除了k1后:\n%s", str)
c.HMDel("hmtest1")
log.Printf("删除hmtest1 map后,hmtest1的值:\n%s", c.HMGet("hmtest1"))
c.HMWatch("hmtest2", "", func(hk string, k string, beforeV string, afterV string, t kv.OpType) {
if k == ""{
if t == kv.Add {
log.Printf("监听的 map key:%s, 新增了, 变化前:%s\n变化后:%s\n", hk, beforeV, afterV)
}else if t == kv.Del {
log.Printf("监听的 map key:%s, 删除了, 变化前:%s\n变化后:%s\n", hk, beforeV, afterV)
}
}else{
if t == kv.Add {
log.Printf("监听的 map key:%s, 元素:%s, 新增了, 变化前:%s\n变化后:%s\n", hk, k, beforeV, afterV)
}else if t == kv.Del {
log.Printf("监听的 map key:%s, 元素:%s, 删除了,变化前:%s\n变化后:%s\n", hk, k, beforeV, afterV)
}
}
})
c.HMWatch("hmtest2", "k1", func(hk string, k string, beforeV string, afterV string, t kv.OpType) {
if k == ""{
if t == kv.Add {
log.Printf("监听的 map key:%s, 新增了, 变化前:%s\n变化后:%s\n", hk, beforeV, afterV)
}else if t == kv.Del {
log.Printf("监听的 map key:%s, 删除了, 变化前:%s\n变化后:%s\n", hk, beforeV, afterV)
}
}else{
if t == kv.Add {
log.Printf("监听的 map key:%s, 元素:%s, 新增了, 变化前:%s\n变化后值为:\n%s", hk, k, beforeV, afterV)
}else if t == kv.Del {
log.Printf("监听的 map key:%s, 元素:%s, 删除了, 变化前:%s\n变化后值为:\n%s", hk, k, beforeV, afterV)
}
}
})
c.HMWatch("hmtest2", "", func(hk string, k string, beforeV string, afterV string, t kv.OpType) {
if k == ""{
if t == kv.Add {
log.Printf("监听的 map key:%s, 新增了, 变化前:%s\n变化后:%s\n", hk, beforeV, afterV)
}else if t == kv.Del {
log.Printf("监听的 map key:%s, 删除了, 变化前:%s\n变化后:%s\n", hk, beforeV, afterV)
}
}else{
if t == kv.Add {
log.Printf("监听的 map key:%s, 元素:%s, 新增了, 变化前:%s\n变化后:%s\n", hk, k, beforeV, afterV)
}else if t == kv.Del {
log.Printf("监听的 map key:%s, 元素:%s, 删除了, 变化前:%s\n变化后:%s\n", hk, k, beforeV, afterV)
}
}
})
log.Printf("新增hmtest2 map")
//新增hmtest2 map
c.HMPut("hmtest2", keys, vals, 3)
log.Printf("获取 hmtest2 map的值:\n%s", c.HMGet("hmtest2"))
log.Printf("获取hmtest2 map 中k2元素:%s", c.HMGetMember("hmtest2", "k2"))
//删除hmtest2 中的k2
log.Printf("删除hmtest2 map 中k1元素")
c.HMDelMember("hmtest2", "k1")
c.HMPut("hmtest3", keys, vals, 0)
log.Printf("获取hmtest2 map 中k1元素:%s", c.HMGetMember("hmtest2", "k1"))
```
### list 用法
```go
c := server.NewClient("127.0.0.1:9980")
c.Start()
defer c.Close()
c.ClearList()
c.LPut("testlist", []string{"1","2", "3"}, 10)
c.LPut("list1", []string{"a1","a2", "a3"}, 0)
arr, _ := c.LGet("list1")
log.Printf("获取list1:%v", arr)
c.LPut("list2", []string{"b1","b2", "b3", "b4", "b5"}, 0)
arr, _ = c.LGet("list2")
log.Printf("获取list2:%v", arr)
arr, _ = c.LGetRange("list2", 0,2)
log.Printf("获取list2 0-2:元素%v", arr)
log.Printf("删除list2 1-3位元素")
c.LDelRange("list2", 1,3)
arr, _ = c.LGet("list2")
log.Printf("获取list2:%v", arr)
c.LWatchKey("watchList", func(k string, beforeV []string, afterV []string, opType kv.OpType) {
if opType == kv.Add {
log.Printf("监听 %s 新增了, 变化前:%v\n变化后:%v\n", k, beforeV, afterV)
}else{
log.Printf("监听 %s 删除了, 变化前:%v\n变化后:%v\n", k, beforeV, afterV)
}
})
log.Printf("添加watchList")
没有合适的资源?快使用搜索试试~ 我知道了~
基于go的轻量化key-value服务.zip
共27个文件
go:18个
sum:1个
proto:1个
需积分: 5 0 下载量 93 浏览量
2024-05-23
17:09:51
上传
评论
收藏 39KB ZIP 举报
温馨提示
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
资源推荐
资源详情
资源评论
收起资源包目录
基于go的轻量化key-value服务.zip (27个子文件)
content
go.mod 535B
go.sum 8KB
.gitattributes 66B
LICENSE 1KB
cache
kv
listValue.go 646B
value.go 688B
setValue.go 1KB
stringValue.go 539B
mapValue.go 1KB
path.go 371B
lru.go 3KB
conf.go 2KB
cache.go 16KB
coder.go 4KB
pb
bridge.pb.go 143KB
bridge.proto 5KB
test
cache_test.go 801B
.gitignore 280B
protoc-3.12.2-win64
bridge.bat 74B
main
server.go 202B
client.go 8KB
server
apiserver.go 14KB
rpcserver.go 13KB
rpcproxy.go 543B
rpcclient.go 11KB
conf
kv.ini 437B
README.md 9KB
共 27 条
- 1
资源评论
生瓜蛋子
- 粉丝: 3829
- 资源: 5969
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- docker配置文件daemon.json
- 贪吃蛇(个体自动追踪).zip
- c语言文件读写操作代码.rar
- MySQL的安装和配置的基本步骤.rar
- 一个简单的学生信息管理系统实现代码.rar
- AutoHotKey 2.0中文帮助文件
- 基于Docker-compose的Elasticsearch集群每个节点均是独立docker-compose配置而成源码.zip
- 目标检测-零售食品LOGO检测数据集-40000张图-+对应VOC-COCO-YOLO三种格式标签+数据集划分脚本
- 目标检测-零售食品LOGO检测数据集-30000张图-+对应VOC-COCO-YOLO三种格式标签+数据集划分脚本
- 目标检测-零售食品LOGO检测数据集-20000张图-+对应VOC-COCO-YOLO三种格式标签+数据集划分脚本
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功