HashiCorp Go-MemDB 开源项目指南

HashiCorp Go-MemDB 开源项目指南

go-memdbGolang in-memory database built on immutable radix trees项目地址:https://gitcode.com/gh_mirrors/go/go-memdb


一、项目目录结构及介绍

Go-MemDB 是由 HashiCorp 开发的一个内存数据库系统,专为构建轻量级且高性能的服务而设计。以下是其主要的目录结构以及关键组件简介:

go-memdb/
├── cmd/                - 包含可执行命令的入口,用于示例或测试环境的快速启动。
│   └── memdb-cli       - 可能的命令行工具,用于数据库操作演示(本仓库未明确提供具体命令行工具,示例假设)。
├── doc/                - 文档资料,通常包括设计文档和API参考等。
├── examples/           - 示例代码,展示了如何在实际应用中使用Go-MemDB。
│   ├── basic            - 基础用法展示。
│   ├── advanced         - 高级特性的使用例子。
├── internal/           - 内部实现细节,这部分通常是封装好的库函数和数据结构,不建议直接在外部使用。
│   └── memdb            - 核心库代码,包含数据库表定义、事务处理逻辑等。
├── script/             - 可能包含一些自动化脚本,比如测试前准备或部署辅助脚本。
├── test/               - 测试用例,确保代码质量。
│   ├── fixtures        - 测试数据或场景固定数据。
│   └── unit            - 单元测试。
└── go.mod              - Go Modules的描述文件,记录依赖信息和版本。

二、项目的启动文件介绍

Go-MemDB作为库而非独立服务,没有传统意义上的“启动文件”。不过,若要开发基于Go-MemDB的应用程序,通常会在应用程序的main.go或其他启动逻辑文件中初始化MemDB实例。例如,一个简单的启动示例可能包含以下步骤:

package main

import (
    "fmt"
    "github.com/hashicorp/go-memdb"
)

func main() {
    // 初始化MemDB的Schema
    schema := &memdb.DBSchema{
        Name: "example",
        Tables: map[string]*memdb.TableSpec{
            "users": &memdb.TableSpec{
                Name: "users",
                Indices: []memdb.IndexSpec{
                    {
                        Name:         "name",
                        Unique:       true,
                        Indexer:      memdb.StringFieldIndex,
                        AllowMissing: false,
                    },
                },
                Schema: []memdb.ColumnSpec{
                    {Name: "id", Type: memdb.UUIDField},
                    {Name: "name", Type: memdb.StringField},
                },
            },
        },
    }

    // 创建数据库实例
    db, err := memdb.NewInMemDB(schema)
    if err != nil {
        fmt.Println("Failed to create MemDB:", err)
        return
    }
    
    // 此处进行进一步的数据库操作...
}

这段代码展示了如何引入并初始化Go-MemDB进行简单应用。

三、项目的配置文件介绍

由于Go-MemDB本质上是一个Go库,它本身并不直接依赖于外部配置文件来运行。开发者在其应用中集成Go-MemDB时,可以根据需要自定义配置,如数据库模式设置、事务管理策略等,但这些配置通常嵌入到应用程序的代码里,而不是通过外部配置文件加载。

在更复杂的使用场景下,配置库的使用(如Viper或Envoy)可以用来从环境变量、文件或命令行参数动态读取设置值,但这超出了Go-MemDB库本身的范畴,而属于应用程序的设计决策。


请注意,上述内容是基于给定的开源项目URL结构的一般性描述,实际的目录结构和文件功能可能会有所变动,具体应用时应参照最新的官方文档和代码注释。

go-memdbGolang in-memory database built on immutable radix trees项目地址:https://gitcode.com/gh_mirrors/go/go-memdb

go实战微服务分布式系统(distributed system)是建立在网络之上的软件系统。正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。因此,网络和分布式系统之间的区别更多的在于高层软件(特别是操作系统),而不是硬件。在一个分布式系统中,一组独立的计算机展现给用户的是一个统一的整体,就好像是一个系统似的。系统拥有多种通用的物理和逻辑资源,可以动态的分配任务,分散的物理和逻辑资源通过计算机网络实现信息交换。系统中存在一个以全局的方式管理计算机资源的分布式操作系统。通常,对用户来说,分布式系统只有一个模型或范型。在操作系统之上有一层软件中间件(middleware)负责实现这个模型。一个著名的分布式系统的例子是万维网(World Wide Web),在万维网中,所有的一切看起来就好像是一个文档(Web页面)一样。 [1] 在计算机网络中,这种统一性、模型以及其中的软件都不存在。用户看到的是实际的机器,计算机网络并没有使这些机器看起来是统一的。如果这些机器有不同的硬件或者不同的操作系统,那么,这些差异对于用户来说都是完全可见的。如果一个用户希望在一台远程机器上运行一个程序,那么,他必须登陆到远程机器上,然后在那台机器上运行该程序。 [1] 分布式系统和计算机网络系统的共同点是:多数分布式系统是建立在计算机网络之上的,所以分布式系统与计算机网络在物理结构上是基本相同的。 [1] 他们的区别在于:分布式操作系统的设计思想和网络操作系统是不同的,这决定了他们在结构、工作方式和功能上也不同。网络操作系统要求网络用户在使用网络资源时首先必须了解网络资源,网络用户必须知道网络中各个计算机的功能与配置、软件资源、网络文件结构等情况,在网络中如果用户要读一个共享文件时,用户必须知道这个文件放在哪一台计算机的哪一个目录下;分布式操作系统是以全局方式管理系统资源的,它可以为用户任意调度网络资源,并且调度过程是“透明”的。当用户提交一个作业时,分布式操作系统能够根据需要在系统中选择最合适的处理器,将用户的作业提交到该处理程序,在处理器完成作业后,将结果传给用户。在这个过程中,用户并不会意识到有多个处理器的存在,这个系统就像是一个处理器一样。 [1] 内聚性是指每一个数据库分布节点高度自治,有本地的数据库管理系统。透明性是指每一个数据库分布节点对用户的应用来说都是透明的,看不出是本地还是远程。在分布式数据库系统中,用户感觉不到数据是分布的,即用户不须知道关系是否分割、有无副本、数据存于哪个站点以及事务在哪个站点上执行等。  什么是微服务?维基上对其定义为:一种软件开发技术- 面向服务的体系结构(SOA)架构样式的一种变体,将应用程序构造为一组松散耦合的服务。在微服务体系结构中,服务是细粒度的,协议是轻量级的。微服务(或微服务架构)是一种云原生架构方法,其中单个应用程序由许多松散耦合且可独立部署的较小组件或服务组成。这些服务通常● 有自己的堆栈,包括数据库和数据模型;● 通过REST API,事件流和消息代理的组合相互通信;● 和它们是按业务能力组织的,分隔服务的线通常称为有界上下文。尽管有关微服务的许多讨论都围绕体系结构定义和特征展开,但它们的价值可以通过相当简单的业务和组织收益更普遍地理解:● 可以更轻松地更新代码。● 团队可以为不同的组件使用不同的堆栈。● 组件可以彼此独立地进行缩放,从而减少了因必须缩放整个应用程序而产生的浪费和成本,因为单个功能可能面临过多的负载。 
MemDB 是全球首个支持分布式事务的 MongoDB。高性能和可伸缩快速的内存数据访问,高达 25,000 ops (single doc read/write) /碎片 (each shard take one CPU core).系统可水平伸缩没有单点瓶颈真正的分布式 ACID 事务在分布式环境真正支持 ACID (Stands for Atomicity, Consistency, Isolation, Durability) 事务MemDB 让 MongoDB 支持 ACID 事务兼容 MongoDB 和 Mongoose直接使用 MongoDB 的查询 API内置 Mongoose 支持高可用性每个碎片都有一个或者多个 slaves,不会发生单点故障 MemDB shell:架构:Mdbgoose:var memdb = require('memdb-client'); var P = memdb.Promise; var mdbgoose = memdb.goose; // Define player schema var playerSchema = new mdbgoose.Schema({     _id : String,     name : String,     areaId : Number,     deviceType : Number,     deviceId : String,     items : [mdbgoose.SchemaTypes.Mixed], }, {collection : 'player'}); // Define player model var Player = mdbgoose.model('player', playerSchema); var main = P.coroutine(function*(){     // Connect to memdb     yield mdbgoose.connectAsync({         shards : { // specify all shards here             s1 : {host : '127.0.0.1', port: 31017},             s2 : {host : '127.0.0.1', port: 31018},         }     });     // Make a transaction in s1     yield mdbgoose.transactionAsync(P.coroutine(function*(){         var player = new Player({             _id : 'p1',             name: 'rain',             areaId : 1,             deviceType : 1,             deviceId : 'id1',             items : [],         });         // insert a player         yield player.saveAsync();         // find player by id         var doc = yield Player.findByIdAsync('p1');         console.log('%j', doc);         // find player by areaId, return array of players         var docs = yield Player.findAsync({areaId : 1});         console.log('%j', docs);         // find player by deviceType and deviceId         player = yield Player.findOneAsync({deviceType : 1, deviceId : 'id1'});         // update player         player.areaId = 2;         yield player.saveAsync();         // remove the player         yield player.removeAsync();     }), 's1'); }); if (require.main === module) {     main().finally(process.exit); } 标签:MemDB
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梅沁维

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值