mmkv

package module
v1.0.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 4, 2023 License: GPL-3.0 Imports: 12 Imported by: 0

README

mmkv

一种基于内存的键值对数据库,类似于Redis。

a Memory Key-Value database, like Redis.

服务器端

//启动内存KV值数据库
package main
import "micollect/models/mmkv"
func main() {
    go mmkv.Run(map[string]string{user_name: pswd},
     map[string]interface{}{"port": port, "ip": ip, "languige": LANG_TYPE})
}

请求报文格式

功能码 预留字节 数据载荷 CRC16_H CRC16_L 功能说明
0x02 0x00 {"username":"admin","password":"admin123"} 0x22 0x7D 登录示例

上表中数据最终的HEX报文为:02 00 7B 22 75 73 65 72 6E 61 6D 65 22 3A 22 61 64 6D 69 6E 22 2C 22 70 61 73 73 77 6F 72 64 22 3A 22 61 64 6D 69 6E 31 32 33 22 7D

  • 报文以HEX(16进制)编码发送

  • 报文的前两个字节是报文头(header),第一字节为功能码,第二字节为系统保留码

  • 报文的最后两个字节为CRC16校验码,高字节在前,低字节在后,根据报文头和报文载荷自动计算

  • 报文头和校验码之间的为报文载荷(payload), 报文载荷为UTF8格式的JSON数据转换而来

返回报文格式

功能码 预留字节 数据载荷 CRC16_H CRC16_L 功能说明
0x01 0x00 {"ok":true,"msg":"MmKv:v0.0.1","data":1646100208058699} 0xB4 0xC2 连接测试示例

上表中数据最终的HEX报文为:01 00 7B 22 6F 6B 22 3A 74 72 75 65 2C 22 6D 73 67 22 3A 22 4D 6D 4B 76 3A 76 30 2E 30 2E 31 22 2C 22 64 61 74 61 22 3A 31 36 34 36 31 30 30 32 30 38 30 35 38 36 39 39 7D B4 C2

  • 报文以HEX(16进制)编码发送

  • 报文的前两个字节是报文头(header),第一字节为功能码,第二字节为系统保留码。返回报文的报文头与请求报文的报文头要完全一致

  • 报文的最后两个字节为CRC16校验码,高字节在前,低字节在后,根据报文头和报文载荷自动计算

  • 报文头和校验码之间的为报文载荷(payload), 报文载荷为UTF8格式的JSON数据转换而来

返回报文载荷的说明

返回报文的数据载荷的JSON格式是固定的,如下表所示:

键(Key) 数据格式 说明
ok bool 返回数据的状态, 如果正确, 其值为true, 如果不正确, 其值为false
msg string ok==true时,此处为返回数据的附加信息; 当ok==false时,该值为错误信息
data struct 不定结构,根据请求内容不同返回不同的内容; 当ok==false时,该值为错误的详细描述

功能码说明及示例

功能码 功能说明 请求载荷JSON 返回载荷JSON
0x01 连接测试 {"ok":true, "msg":"MmKv:v0.0.1", "data":1646099841652811}
0x02 用户登录 {"username":"admin", "password":"admin123"} {"ok":true, "msg":"v0.0.1", "data":"admin"}
0x03 写单个标签 {"tag_a":12345} {"ok":true, "msg":"tag_a", "data":12345}
0x04 写多个标签 {"tag_a":12345, "tag_b":"abcdefg"} {"ok":true,"msg":"", "data":[{"ok":true, "msg":"tag_a", "data":12345}, {"ok":true, "msg":"tag_b", "data":"abcdefg"}]}
0x05 读取单个标签 "tag_a" {"ok":true, "msg":"tag_a", "data":12345}
0x06 读取多个标签 ["tag_a","tag_b"] {"ok":true,"msg":"", "data":[{"ok":true, "msg":"tag_a", "data":12345}, {"ok":true, "msg":"tag_b", "data":"abcdefg"}]}
0x07 删除单个标签 "tag_a" {"ok":true, "msg":"DeleteSingleKey", "data":0}
0x08 删除多个标签 ["tag_a","tag_b"] {"ok":true,"msg":"DeleteMultiKey","data":0}
0x09 数据自增 "tag_a" {"ok":true,"msg":"tag_a","data":2}
0x0A 数据自减 "tag_a" {"ok":true,"msg":"tag_a","data":2}
0x0B 压入管道 {"tag_pipe":123456.789} {"ok":true,"msg":"tag_pipe","data":4}
0x0C 从管道拉取(FIFO) "tag_pipe" {"ok":true,"msg":"3","data":123456.789}
0x0D 从管道拉取(FILO) "tag_pipe" {"ok":true,"msg":"2","data":123456.789}
0x0E 获取管道当前长度 "tag_pipe" {"ok":true,"msg":"tag_pipe","data":2}
0x0F 一次性读取管道中的所有数据 {"ok":true,"msg":"tag_pipe","data":2}
0x10 获取所有已经存在的键 {"ok":true,"msg":"","data":[...]}
0x11 获取所有已经存在的用户名 {"ok":true,"msg":"","data":[...]}

Documentation

Index

Constants

View Source
const (
	VERSION = "v1.0.0" //版本号

)

Variables

This section is empty.

Functions

func Run

func Run(users map[string]string, cfg map[string]interface{}) error

运行数据库系统 输入:

   users map[string]string:{username:password}
   cfg map[string]string:{
       "port":9646 //端口号
       "ip": "127.0.0.1"//IP地址
       "languige":"zh-CN"//语言类型
       "loglevel":8
		  "logpath":"../log"
		  "logsize":100000
       "logsavedays":180
   }

Types

type ConnHandel

type ConnHandel struct {
	Id        int64     //序号
	Conn      net.Conn  //通讯连接
	Logged    bool      //是否已登录标志
	TxBytes   int64     //发送字节数
	RxBytes   int64     //接收字节数
	TxTimes   int64     //发送次数
	RxTimes   int64     //接收次数
	User      string    //用户信息
	Closed    bool      //连接已关闭
	LogAt     time.Time //登录时间
	CreatedAt time.Time //创建时间
	CloseAt   time.Time //关闭时间
}

通讯句柄结构

func (*ConnHandel) DeleteMulti

func (h *ConnHandel) DeleteMulti(data []byte) RespMsg

删除多个标签的值

func (*ConnHandel) DeleteSingle

func (h *ConnHandel) DeleteSingle(data []byte) RespMsg

删除单个标签的值

func (*ConnHandel) GetKeys

func (h *ConnHandel) GetKeys() RespMsg

获取现存的非系统keys

func (*ConnHandel) GetUsers

func (h *ConnHandel) GetUsers() RespMsg

获取现存的系统users

func (*ConnHandel) Login

func (h *ConnHandel) Login(data []byte) RespMsg

删除多个标签的值

func (*ConnHandel) PipeAll

func (h *ConnHandel) PipeAll(data []byte) RespMsg

从管道拉取数据

func (*ConnHandel) PipeLength

func (h *ConnHandel) PipeLength(data []byte) RespMsg

获取管道长度

func (*ConnHandel) PipePull

func (h *ConnHandel) PipePull(fc byte, data []byte) RespMsg

从管道拉取数据

func (*ConnHandel) PipePush

func (h *ConnHandel) PipePush(data []byte) RespMsg

压入管道

func (*ConnHandel) ReadMulti

func (h *ConnHandel) ReadMulti(data []byte) RespMsg

读取多个标签的值

func (*ConnHandel) ReadSingle

func (h *ConnHandel) ReadSingle(data []byte) RespMsg

读取单个标签的值

func (*ConnHandel) SelfIncrease

func (h *ConnHandel) SelfIncrease(data []byte, value int64) RespMsg

标签自增

func (*ConnHandel) Write

func (h *ConnHandel) Write(fc byte, data []byte) RespMsg

写标签的值

type MemoryKeyValueMap

type MemoryKeyValueMap struct {
	sync.Map
	Langtype string //language type,like:en-US,zh-CN
}

运行数据库结构

var (
	Db       MemoryKeyValueMap //内存数据库
	ConnPool []*ConnHandel     //连接池

)

func (*MemoryKeyValueMap) MmAddUser

func (db *MemoryKeyValueMap) MmAddUser(username, password string) error

添加用户

func (*MemoryKeyValueMap) MmAddUsers

func (db *MemoryKeyValueMap) MmAddUsers(users map[string]string)

添加多个用户

func (*MemoryKeyValueMap) MmCheckUser

func (db *MemoryKeyValueMap) MmCheckUser(username, password string) (bool, error)

校验用户

func (*MemoryKeyValueMap) MmDeleteMulti

func (db *MemoryKeyValueMap) MmDeleteMulti(keys []string) int64

删除多个标签 返回删除成功的标签数

func (*MemoryKeyValueMap) MmDeleteSingle

func (db *MemoryKeyValueMap) MmDeleteSingle(key string) int64

删除单个标签 如果删除成功(标签存在),返回1 如果标签不存在,返回0

func (*MemoryKeyValueMap) MmGetUsersDict

func (db *MemoryKeyValueMap) MmGetUsersDict() []string

读取用户名字典

func (*MemoryKeyValueMap) MmPipeAll

func (db *MemoryKeyValueMap) MmPipeAll(key string) ([]interface{}, error)

获取管道中的所有数据 返回管道剩余长度和错误信息

func (*MemoryKeyValueMap) MmPipeLength

func (db *MemoryKeyValueMap) MmPipeLength(key string) (int, error)

获取管道长度 返回管道剩余长度和错误信息

func (*MemoryKeyValueMap) MmPipePull

func (db *MemoryKeyValueMap) MmPipePull(fc byte, key string) (int, interface{}, error)

从管道拉取数据 返回管道剩余长度、数据、错误信息

func (*MemoryKeyValueMap) MmPipePush

func (db *MemoryKeyValueMap) MmPipePush(key string, value interface{}) (int, error)

压入管道 返回管道长度和错误信息

func (*MemoryKeyValueMap) MmReadMulti

func (db *MemoryKeyValueMap) MmReadMulti(keys []string) (datas []RespMsg)

读取多个标签

func (*MemoryKeyValueMap) MmReadSingle

func (db *MemoryKeyValueMap) MmReadSingle(key string) (val interface{}, ok bool)

读取单个标签

func (*MemoryKeyValueMap) MmSelfIncrease

func (db *MemoryKeyValueMap) MmSelfIncrease(key string, value int64) (interface{}, error)

标签自增

func (*MemoryKeyValueMap) MmWriteMulti

func (db *MemoryKeyValueMap) MmWriteMulti(maps map[string]interface{}) []RespMsg

写多个标签 返回新创建的标签数

func (*MemoryKeyValueMap) MmWriteSingle

func (db *MemoryKeyValueMap) MmWriteSingle(key string, value interface{}) (interface{}, error)

//读取用户键字典

func (db *MemoryKeyValueMap) MmGetKeysDictx() map[string]string {
	if keysmp, ok := db.Load(_KeysDict); ok {
		if dict, ok := keysmp.(map[string]time.Time); ok {
			keys := make(map[string]string)
			for k, v := range dict {
				keys[k] = v.Local().Format("2006-01-02T15:04:05.000")
			}
			return keys
		}
	}
	db.Store(_KeysDict, make(map[string]time.Time))
	return nil
}

//添加键到字典中

func (db *MemoryKeyValueMap) addToKeysDict(keys ...string) {
	if keysmp, ok := db.Load(_KeysDict); ok {
		if dict, ok := keysmp.(map[string]time.Time); ok {
			for _, k := range keys {
				dict[k] = time.Now()
			}
			db.Store(_KeysDict, dict)
		}
	} else {
		db.Store(_KeysDict, make(map[string]time.Time))
	}
}

//从字典中删除键

func (db *MemoryKeyValueMap) deleteFromKeysDict(keys ...string) {
	if keysmp, ok := db.Load(_KeysDict); ok {
		if dict, ok := keysmp.(map[string]time.Time); ok {
			for _, k := range keys {
				delete(dict, k)
			}
			db.Store(_KeysDict, dict)
		}
	} else {
		db.Store(_KeysDict, make(map[string]time.Time))
	}
}

写单个标签

type RespMsg

type RespMsg struct {
	Ok   bool        `json:"ok"`
	Msg  string      `json:"msg"`
	Data interface{} `json:"data"`
}

响应数据的结构

func MakeRespMsg

func MakeRespMsg(ok bool, msg string, data interface{}) RespMsg

连接反馈信息格式化

type UserDict

type UserDict struct {
	Password string //Md5后的密码
}

用户字典

type UserMsg

type UserMsg struct {
	Username string `json:"username"`
	Password string `json:"password"`
}

用户数据的结构

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL