当前位置: 首页 > 工具软件 > gocql > 使用案例 >

scylladb 安装及 golang 客户端gocql使用

邓阳炎
2023-12-01

前言

ScyllaDB 是用 C++ 重写的 Cassandra,每节点每秒处理 100 万 TPS。ScyllaDB 完全兼容 Apache Cassandra,拥有比 Cassandra 多 10x 倍的吞吐量,降低了延迟。 ScyllaDB 是性能优异的 NoSQL 列存储数据库。 ScyllaDB 在垃圾收集或者 Compaction 的时候不需要暂停;在常规生产负载的时候可以添加和删除节点。官网地址:https://www.scylladb.com


基于ScyllaDB如此高的性能,用于替换 Cassandra势在必行。ScyllaDB 安装建议直接使用Docker安装替代二进制安装,原因二进制步骤繁琐,且经常安装失败。同时ScyllaDB 对cpu和系统也需要较高版本。

scylladb 安装部署

1.首先下载docker镜像:

docker pull scylladb/scylla

2.暴露端口,持久化数据 部署scylladb

docker run -p 9042:9042 -it --name some-scylla --volume /var/lib/scylla:/var/lib/scylla -d scylladb/scylla 

3.其他集群部署方式可以参考 docker镜像地址:https://hub.docker.com/r/scylladb/scylla/

scylladb 使用cqlsh创建数据库

1.首先进入scylladb

docker exec -it some-scylla cqlsh

2.新建一个数据库:

CREATE KEYSPACE IF NOT EXISTS myCas WITH REPLICATION = {'class': 'SimpleStrategy','replication_factor':1};
describe keyspaces;
use mycas;

golang gocql 使用

因为scylladb 直接是兼容Cassandra,故我们可以直接使用Cassandra的golang客户端github.com/gocql/gocql

package dbtest

import (
    "testing"
    "github.com/gocql/gocql"
    "github.com/labstack/gommon/log"
    "fmt"
)

var session *gocql.Session

//初始化
func init() {
    cluster := gocql.NewCluster("127.0.0.1:9042")
    cluster.Keyspace = "mycas"
    cluster.Consistency = gocql.Consistency(1)
    cluster.NumConns = 3
    var err error
    session, err = cluster.CreateSession()
    if err != nil {
        log.Panic("start", err)
        return
    }
}

//创建表
func TestScylla_Create(t *testing.T) {
    query := fmt.Sprintf(`CREATE TABLE user(id int PRIMARY KEY, user_name varchar);`)
    session.Query(query).Exec()
}

//插入数据
func TestScylla_Insert(t *testing.T) {
    query := fmt.Sprintf(`INSERT INTO user (id,user_name) VALUES (1,'zhangsan')`)
    err := session.Query(query).Exec()
    if err != nil {
        fmt.Println(err)
    }
}

//删除表
func TestScylla_Drop(t *testing.T) {
    query := fmt.Sprintf(`drop table user;`)
    err := session.Query(query).Exec()

    if err != nil {
        fmt.Println(err)
    }
}

//查询数据
func TestScylla_Select(t *testing.T) {
    query := fmt.Sprintf("SELECT * from user;")
    iter := session.Query(query).Iter()
    defer func() {
        if iter != nil {
            iter.Close()
        }
    }()
    var id int
    var name string
    for iter.Scan(&id, &name) {
        fmt.Println(id, name)
    }
}

//批量执行数据
func TestScylla_Batch(t *testing.T) {
    query := fmt.Sprintf(`BEGIN BATCH
            UPDATE user SET user_name = 'asdqw' where id = %d;
            INSERT INTO user (id,user_name) VALUES (2,'zhangsan');
            APPLY BATCH;`, 1)
    err := session.Query(query).Exec()
    if err != nil {
        fmt.Println(err)
    }
}
 类似资料: