golang基于栈数据结构的轻量级RESTful数据库引擎插件piladb的使用

Golang基于栈数据结构的轻量级RESTful数据库引擎插件piladb的使用

piladb是一个基于栈数据结构的轻量级RESTful数据库引擎。在西班牙语中,“pila"意为"栈"或"电池”。

Logo

主要特性

  • 栈可自动扩展,仅受主机容量或配置限制
  • 提供POPPUSHPEEKSIZEFLUSH等栈操作
  • 通过REST API管理栈和其他资源
  • 支持JSON兼容的数据类型:字符串、数字、数组、对象等
  • 完全可通过REST API或CLI参数配置
  • 内存存储
  • 使用Go编写,二进制文件自包含且可分发

安装

从源代码安装

需要安装Go 1.6+版本:

go get github.com/fern4lvarez/piladb/...
cd $GOPATH/src/github.com/fern4lvarez/piladb
make pilad

使用示例

下面是一个使用piladb的完整示例demo:

package main

import (
	"fmt"
	"log"
	"net/http"
	"encoding/json"
)

func main() {
	// 创建新栈
	resp, err := http.Post("http://localhost:8080/v1/stacks/mystack", "application/json", nil)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()

	// 向栈中推送数据
	data := map[string]interface{}{"name": "John", "age": 30}
	jsonData, _ := json.Marshal(data)
	
	req, err := http.NewRequest("PUT", "http://localhost:8080/v1/stacks/mystack", bytes.NewBuffer(jsonData))
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Content-Type", "application/json")
	
	resp, err = http.DefaultClient.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()

	// 查看栈顶元素
	resp, err = http.Get("http://localhost:8080/v1/stacks/mystack/peek")
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	
	var result map[string]interface{}
	json.NewDecoder(resp.Body).Decode(&result)
	fmt.Println("栈顶元素:", result)

	// 弹出栈顶元素
	req, err = http.NewRequest("DELETE", "http://localhost:8080/v1/stacks/mystack", nil)
	if err != nil {
		log.Fatal(err)
	}
	
	resp, err = http.DefaultClient.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	
	// 获取栈大小
	resp, err = http.Get("http://localhost:8080/v1/stacks/mystack/size")
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	
	var size int
	json.NewDecoder(resp.Body).Decode(&size)
	fmt.Println("栈大小:", size)
}

REST API操作

piladb提供以下REST API端点:

  • POST /v1/stacks/{stack} - 创建新栈
  • PUT /v1/stacks/{stack} - 向栈中推送数据
  • GET /v1/stacks/{stack}/peek - 查看栈顶元素
  • DELETE /v1/stacks/{stack} - 弹出栈顶元素
  • GET /v1/stacks/{stack}/size - 获取栈大小
  • DELETE /v1/stacks/{stack}/flush - 清空栈

客户端工具

piladb提供了一个shell客户端:

source <(curl -s https://raw.githubusercontent.com/oscillatingworks/piladb-sh/master/piladb.sh)
piladb_help

piladb是一个简单易用的内存栈数据库,适合需要临时数据存储和栈操作的场景。它的轻量级特性和RESTful接口使其易于集成到各种应用中。


更多关于golang基于栈数据结构的轻量级RESTful数据库引擎插件piladb的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang基于栈数据结构的轻量级RESTful数据库引擎插件piladb的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用PilaDB:基于栈的轻量级RESTful数据库引擎

PilaDB是一个用Go语言编写的轻量级数据库引擎,它基于栈数据结构设计,提供RESTful API接口。PilaDB非常适合需要简单数据存储和快速原型开发的场景。

PilaDB核心特性

  1. 基于栈的简单数据结构
  2. RESTful HTTP API接口
  3. 轻量级、无外部依赖
  4. 支持JSON格式数据
  5. 易于集成到Go项目中

安装PilaDB

go get github.com/fern4lvarez/piladb

基本使用示例

1. 创建并启动PilaDB服务器

package main

import (
	"log"
	"net/http"
	
	"github.com/fern4lvarez/piladb/pkg/pila"
)

func main() {
	// 创建数据库实例
	db := pila.NewDatabase("myDatabase")
	
	// 创建栈
	stack := db.CreateStack("myStack")
	
	// 添加一些初始数据
	stack.Push(42)
	stack.Push("hello")
	stack.Push(map[string]interface{}{"key": "value"})
	
	// 启动HTTP服务器
	http.Handle("/", pila.Handler(db))
	log.Fatal(http.ListenAndServe(":8080", nil))
}

2. 通过REST API操作数据

PilaDB提供以下RESTful端点:

  • GET /stacks - 获取所有栈列表
  • POST /stacks/{stack} - 创建新栈
  • GET /stacks/{stack} - 获取栈内容
  • PUT /stacks/{stack} - 向栈压入数据
  • DELETE /stacks/{stack} - 弹出栈顶数据
  • GET /stacks/{stack}/peek - 查看栈顶数据
  • GET /stacks/{stack}/size - 获取栈大小

使用示例

package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
	baseURL := "http://localhost:8080/stacks/myStack"
	
	// 1. 压入数据
	data := map[string]interface{}{"name": "Alice", "age": 30}
	jsonData, _ := json.Marshal(data)
	
	resp, err := http.Post(baseURL, "application/json", bytes.NewBuffer(jsonData))
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()
	
	// 2. 查看栈顶数据
	resp, err = http.Get(baseURL + "/peek")
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()
	
	body, _ := ioutil.ReadAll(resp.Body)
	fmt.Printf("栈顶数据: %s\n", body)
	
	// 3. 获取栈大小
	resp, err = http.Get(baseURL + "/size")
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()
	
	size, _ := ioutil.ReadAll(resp.Body)
	fmt.Printf("栈大小: %s\n", size)
	
	// 4. 弹出数据
	req, _ := http.NewRequest("DELETE", baseURL, nil)
	resp, err = http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()
	
	poppedData, _ := ioutil.ReadAll(resp.Body)
	fmt.Printf("弹出的数据: %s\n", poppedData)
}

高级用法

自定义中间件

package main

import (
	"log"
	"net/http"
	
	"github.com/fern4lvarez/piladb/pkg/pila"
)

func loggingMiddleware(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		log.Printf("请求: %s %s", r.Method, r.URL.Path)
		next.ServeHTTP(w, r)
	})
}

func main() {
	db := pila.NewDatabase("myDB")
	db.CreateStack("logs")
	
	handler := loggingMiddleware(pila.Handler(db))
	
	log.Fatal(http.ListenAndServe(":8080", handler))
}

持久化存储

PilaDB本身是内存数据库,但可以通过以下方式实现简单持久化:

package main

import (
	"encoding/json"
	"io/ioutil"
	"log"
	"os"
	
	"github.com/fern4lvarez/piladb/pkg/pila"
)

func saveDB(db *pila.Database, filename string) error {
	data, err := json.Marshal(db)
	if err != nil {
		return err
	}
	return ioutil.WriteFile(filename, data, 0644)
}

func loadDB(filename string) (*pila.Database, error) {
	data, err := ioutil.ReadFile(filename)
	if err != nil {
		return nil, err
	}
	
	var db pila.Database
	err = json.Unmarshal(data, &db)
	return &db, err
}

func main() {
	const dbFile = "pila.db"
	
	var db *pila.Database
	var err error
	
	// 尝试加载现有数据库
	if _, err := os.Stat(dbFile); err == nil {
		db, err = loadDB(dbFile)
		if err != nil {
			log.Fatal(err)
		}
		log.Println("从文件加载数据库")
	} else {
		// 创建新数据库
		db = pila.NewDatabase("persistentDB")
		db.CreateStack("data")
		log.Println("创建新数据库")
	}
	
	// 定期保存
	go func() {
		for {
			if err := saveDB(db, dbFile); err != nil {
				log.Printf("保存数据库失败: %v", err)
			}
			time.Sleep(5 * time.Minute)
		}
	}()
	
	// 启动服务器
	log.Fatal(http.ListenAndServe(":8080", pila.Handler(db)))
}

适用场景

  1. 快速原型开发
  2. 微服务架构中的简单数据存储
  3. 需要栈数据结构的应用
  4. 临时数据存储和处理
  5. 教学和演示目的

限制

  1. 数据仅存储在内存中(除非自己实现持久化)
  2. 不适合大规模数据存储
  3. 缺乏高级查询功能
  4. 没有内置的用户认证机制

PilaDB作为一个轻量级的栈式数据库,为特定场景提供了简单高效的解决方案。它的RESTful接口使得与其他系统的集成变得非常容易,特别适合需要快速实现简单数据存储功能的项目。

回到顶部