存储 | 青训营笔记

76 阅读4分钟

存储

这是我参加「第五届青训营」伴学笔记创作活动的第 12 天

后端开发中,数据存储是一个非常重要的环节。存储数据时,有许多不同的选择,如关系型数据库,NoSQL数据库,缓存等。每种存储方法都有其特定的优点和缺点,并且根据应用程序的需求选择合适的存储方法是非常重要的。

关系型数据库

关系型数据库是最常见的数据存储方法,它们通常使用SQL作为查询语言。最常见的关系型数据库有MySQL,PostgreSQL,SQL Server等。关系型数据库的优点是支持事务,可以执行复杂的查询,并且数据是结构化的。

例如,如果您要在Go中使用MySQL存储数据,可以使用Go MySQL驱动。

package main

import (
    "database/sql"
    "fmt"

    _ "github.com/go-sql-driver/mysql"
)

func main() {
    db, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/dbname")
    if err != nil {
        panic(err.Error())
    }
    defer db.Close()

    // 插入数据
    stmt, err := db.Prepare("INSERT INTO users(name) VALUES(?)")
    if err != nil {
        panic(err.Error())
    }
    defer stmt.Close()

    res, err := stmt.Exec("John Doe")
    if err != nil {
        panic(err.Error())
    }

    // 获取自增ID
    id, err := res.LastInsertId()
    if err != nil {
        panic(err.Error())
    }
    fmt.Println("Inserted ID:", id)

    // 查询数据
    rows, err : =db.Query("SELECT id, name FROM users")
	if err != nil {
	panic(err.Error())
	}
	defer rows.Close()
}

var users []struct {
    id   int
    name string
}

for rows.Next() {
    var u struct {
        id   int
        name string
    }
    err = rows.Scan(&u.id, &u.name)
    if err != nil {
        panic(err.Error())
    }
    users = append(users, u)
}

for _, u := range users {
    fmt.Println(u.id, u.name)
}

NoSQL数据库

NoSQL数据库是一种非关系型数据库,不需要遵循固定的数据模型,并且具有更高的可扩展性和更低的延迟。最常见的NoSQL数据库有MongoDB,CouchDB,Redis等。 例如,如果您要在Go中使用MongoDB存储数据,可以使用Go Mongo驱动。

package main

import (
    "context"
    "fmt"

    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
)

func main() {
    client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI("mongodb://localhost:27017"))
    if err != nil {
        panic(err)
    }
    defer client.Disconnect(context.TODO())

    db := client.Database("test")
    users := db.Collection("users")

    // 插入数据
    user := map[string]interface{}{
        "name": "John Doe",
    }
    res, err := users.InsertOne(context.TODO(), user)
    if err != nil {
        panic(err)
    }
    fmt.Println("Inserted ID:", res.InsertedID)

    // 查询数据
    cur, err := users.Find(context.TODO(), map[string]interface{}{})
    if err != nil {
        panic(err)
    }
    defer cur.Close(context.TODO())

    for cur.Next(context.TODO()) {
        var u map[string]interface{}
        err := cur.Decode(&u)
        if err != nil {
            panic(err)
        }
        fmt.Println(u)
    }
}

缓存

缓存是一种提高应用程序性能的技术,它通过在内存中存储数据来减少对慢速存储(如数据库)的访问。当您需要访问数据时,首先会检查缓存中是否有该数据,如果有,则直接从缓存中读取。否则,会从慢速存储中读取该数据,并将其存储到缓存中以备以后使用。

在Go中,您可以使用内存缓存工具如Go Redis或Go Memcached来实现缓存。

例如,如果您要在Go中使用Redis缓存数据,可以使用Go Redis驱动。

package main

import (
    "fmt"

    "github.com/go-redis/redis"
)

func main() {
    client := redis.NewClient(&redis.Options{
        Addr:     "localhost:6379",
        Password: "",
        DB:       0,
    })

    // 设置缓存数据
    err := client.Set("name", "John Doe", 0).Err()
    if err != nil {
        panic(err)
    }

    // 获取缓存数据
    name, err := client.Get("name").Result()
    if err != nil {
        panic(err)
    }
    fmt.Println(name)
}

此外,如果您正在考虑使用NoSQL数据库,则可以考虑使用MongoDB或CouchDB等数据库。NoSQL数据库非常适合存储非结构化数据,例如文档或图像。

在Go中,您可以使用mgo驱动来连接MongoDB,或使用Go CouchDB驱动来连接CouchDB。

与关系型数据库不同,NoSQL数据库允许您在不需要预先定义表和字段的情况下存储数据。这使得您可以快速开发和迭代应用程序,并随着业务的变化而灵活地更改数据结构。

同时,使用NoSQL数据库还具有更高的水平冗余和可伸缩性。例如,您可以使用数据分片技术将数据分布在多个服务器上,从而提高系统的吞吐量和可靠性。

总的来说,当选择存储技术时,需要考虑您的业务需求和数据类型。如果您需要存储结构化数据,则应该使用关系型数据库;如果您需要存储非结构化数据,则应该使用NoSQL数据库。同时,您也可以根据您的业务需求和性能要求选择不同的存储技术,例如使用关系型数据库存储主要数据,而使用NoSQL数据库存储其他辅助数据。最重要的是,您应该根据您的业务需求来选择最适合您的存储技术。

另外,还有一些云存储服务,例如Amazon S3和Google Cloud Storage,可以帮助您轻松地存储和管理数据。这些云存储服务具有强大的容量和可伸缩性,并且可以使您的应用程序更具可靠性和可用性。

如果您使用Go语言开发云应用程序,则可以使用对应的Go库来与云存储服务通信。例如,您可以使用aws-sdk-go库与Amazon S3进行通信,或使用google-cloud-go库与Google Cloud Storage进行通信。

最后,在后端开发中,数据存储是一个非常重要的部分。选择合适的存储技术是后端开发的重要因素,它可以直接影响到您的应用程序的性能和可靠性。因此,请认真考虑您的业务需求和数据类型,以选择最适合您的存储技术。