Hbase的JavaAPI和數據存儲

来源:https://www.cnblogs.com/paopaoT/archive/2023/06/12/17475869.html
-Advertisement-
Play Games

# 導入Maven依賴 ```XML org.apache.zookeeper zookeeper 3.4.6 org.apache.hbase hbase-client 2.2.5 org.apache.hadoop hadoop-client 3.2.1 org.apache.hadoop ha ...


導入Maven依賴

<dependencies>
    <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <version>3.4.6</version>
    </dependency>

    <dependency>
        <groupId>org.apache.hbase</groupId>
        <artifactId>hbase-client</artifactId>
        <version>2.2.5</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>3.2.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>3.2.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hbase</groupId>
        <artifactId>hbase-server</artifactId>
        <version>2.2.5</version>
    </dependency>
    <!-- 使用mr程式操作hbase 數據的導入 -->
    <dependency>
        <groupId>org.apache.hbase</groupId>
        <artifactId>hbase-mapreduce</artifactId>
        <version>2.2.5</version>
    </dependency>
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.8.5</version>
    </dependency>
    <!-- phoenix 鳳凰 用來整合Hbase的工具 -->
    <dependency>
        <groupId>org.apache.phoenix</groupId>
        <artifactId>phoenix-core</artifactId>
        <version>5.0.0-HBase-2.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-auth</artifactId>
        <version>3.1.2</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.5.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <!-- bind to the packaging phase -->
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

    </plugins>
</build>

獲取hbase的連接,list出所有的表

package com.doit.day01;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;

import java.io.IOException;

/**
 * Hbase的java客戶端連接hbase的時候,只需要連接zookeeper的集群
 * 就可以找到你Hbase集群的位置
 * 核心的對象:
 * Configuration:HbaseConfiguration.create();
 * Connection:ConnectionFactory.createConnection(conf);
 * table:conn.getTable(TableName.valueOf("tb_b")); 對錶進行操作 DML
 * Admin:conn.getAdmin();操作Hbase系統DDL,對名稱空間等進行操作
 */
public class ConnectionDemo {
    public static void main(String[] args) throws Exception {
        //獲取到hbase的配置文件對象
        Configuration conf = HBaseConfiguration.create();
        //針對配置文件設置zk的集群地址
        conf.set("hbase.zookeeper.quorum","linux01:2181,linux02:2181,linux03:2181");
        //創建hbase的連接對象
        Connection conn = ConnectionFactory.createConnection(conf);

        //獲取到操作hbase的對象
        Admin admin = conn.getAdmin();

        //調用api獲取到所有的表
        TableName[] tableNames = admin.listTableNames();

        //獲取到哪個命名空間下的所有的表
        TableName[] doits = admin.listTableNamesByNamespace("doit");


        for (TableName tableName : doits) {
            byte[] name = tableName.getName();
            System.out.println(new String(name));
        }

        conn.close();
    }
}

獲取到所有的命名空間

package com.doit.day01;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;

/**
 * Hbase的java客戶端連接hbase的時候,只需要連接zookeeper的集群
 * 就可以找到你Hbase集群的位置
 * 核心的對象:
 * Configuration:HbaseConfiguration.create();
 * Connection:ConnectionFactory.createConnection(conf);
 * Admin:conn.getAdmin();操作Hbase系統DDL,對名稱空間等進行操作
 */
public class NameSpaceDemo {
    public static void main(String[] args) throws Exception {
        //獲取到hbase的配置文件對象
        Configuration conf = HBaseConfiguration.create();
        //針對配置文件設置zk的集群地址
        conf.set("hbase.zookeeper.quorum","linux01:2181,linux02:2181,linux03:2181");
        //創建hbase的連接對象
        Connection conn = ConnectionFactory.createConnection(conf);

        //獲取到操作hbase的對象
        Admin admin = conn.getAdmin();

        //獲取到命名空間的描述器
        NamespaceDescriptor[] namespaceDescriptors = admin.listNamespaceDescriptors();

        for (NamespaceDescriptor namespaceDescriptor : namespaceDescriptors) {
            //針對描述器獲取到命名空間的名稱
            String name = namespaceDescriptor.getName();
            System.out.println(name);
        }

        conn.close();
    }
}

創建一個命名空間

package com.doit.day01;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos;

import java.util.Properties;

/**
 * Hbase的java客戶端連接hbase的時候,只需要連接zookeeper的集群
 * 就可以找到你Hbase集群的位置
 * 核心的對象:
 * Configuration:HbaseConfiguration.create();
 * Connection:ConnectionFactory.createConnection(conf);
 * Admin:conn.getAdmin();操作Hbase系統DDL,對名稱空間等進行操作
 */
public class CreateNameSpaceDemo {
    public static void main(String[] args) throws Exception {
        //獲取到hbase的配置文件對象
        Configuration conf = HBaseConfiguration.create();
        //針對配置文件設置zk的集群地址
        conf.set("hbase.zookeeper.quorum","linux01:2181,linux02:2181,linux03:2181");
        //創建hbase的連接對象
        Connection conn = ConnectionFactory.createConnection(conf);

        //獲取到操作hbase的對象
        Admin admin = conn.getAdmin();

        //獲取到命名空間描述器的構建器
        NamespaceDescriptor.Builder spaceFromJava = NamespaceDescriptor.create("spaceFromJava");
        //當然還可以給命名空間設置屬性
        spaceFromJava.addConfiguration("author","robot_jiang");
        spaceFromJava.addConfiguration("desc","this is my first java namespace...");
        //拿著構建器構建命名空間的描述器
        NamespaceDescriptor build = spaceFromJava.build();
        //創建命名空間
        admin.createNamespace(build);

        conn.close();
    }
}

創建帶有多列族的表

package com.doit.day01;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.protobuf.generated.TableProtos;

import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Map;
import java.util.Set;

/**
 * Hbase的java客戶端連接hbase的時候,只需要連接zookeeper的集群
 * 就可以找到你Hbase集群的位置
 * 核心的對象:
 * Configuration:HbaseConfiguration.create();
 * Connection:ConnectionFactory.createConnection(conf);
 * Admin:conn.getAdmin();操作Hbase系統DDL,對名稱空間等進行操作
 */
public class CreateTableDemo {
    public static void main(String[] args) throws Exception {
        //獲取到hbase的配置文件對象
        Configuration conf = HBaseConfiguration.create();
        //針對配置文件設置zk的集群地址
        conf.set("hbase.zookeeper.quorum","linux01:2181,linux02:2181,linux03:2181");
        //創建hbase的連接對象
        Connection conn = ConnectionFactory.createConnection(conf);

        Admin admin = conn.getAdmin();

        //獲取到操作hbase操作表的對象
        TableDescriptorBuilder java = TableDescriptorBuilder.newBuilder(TableName.valueOf("java"));

        //表添加列族需要集合的方式
        ArrayList<ColumnFamilyDescriptor> list = new ArrayList<>();
        //構建一個列族的構造器
        ColumnFamilyDescriptorBuilder col1 = ColumnFamilyDescriptorBuilder.newBuilder("f1".getBytes(StandardCharsets.UTF_8));
        ColumnFamilyDescriptorBuilder col2 = ColumnFamilyDescriptorBuilder.newBuilder("f2".getBytes(StandardCharsets.UTF_8));
        ColumnFamilyDescriptorBuilder col3 = ColumnFamilyDescriptorBuilder.newBuilder("f3".getBytes(StandardCharsets.UTF_8));
        //構建列族
        ColumnFamilyDescriptor build1 = col1.build();
        ColumnFamilyDescriptor build2 = col2.build();
        ColumnFamilyDescriptor build3 = col3.build();
        //將列族添加到集合中去
        list.add(build1);
        list.add(build2);
        list.add(build3);

        //給表設置列族
        java.setColumnFamilies(list);
        //構建表的描述器
        TableDescriptor build = java.build();
        //創建表
        admin.createTable(build);

        conn.close();
    }
}

向表中添加數據

package com.doit.day01;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;

import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;

/**
 * 註意:put數據需要指定往哪個命名空間的哪個表的哪個rowKey的哪個列族的哪個列中put數據,put的值是什麼
 */
public class PutDataDemo {
    public static void main(String[] args) throws Exception {
        //獲取到hbase的配置文件對象
        Configuration conf = HBaseConfiguration.create();
        //針對配置文件設置zk的集群地址
        conf.set("hbase.zookeeper.quorum","linux01:2181,linux02:2181,linux03:2181");
        //創建hbase的連接對象
        Connection conn = ConnectionFactory.createConnection(conf);

        Admin admin = conn.getAdmin();

        //指定往哪一張表中put數據
        Table java = conn.getTable(TableName.valueOf("java"));
        //創建put對象,設置rowKey
        Put put = new Put("rowkey_001".getBytes(StandardCharsets.UTF_8));
        put.addColumn("f1".getBytes(StandardCharsets.UTF_8),"name".getBytes(StandardCharsets.UTF_8),"xiaotao".getBytes(StandardCharsets.UTF_8));
        put.addColumn("f1".getBytes(StandardCharsets.UTF_8),"age".getBytes(StandardCharsets.UTF_8),"42".getBytes(StandardCharsets.UTF_8));

        Put put1 = new Put("rowkey_002".getBytes(StandardCharsets.UTF_8));
        put1.addColumn("f1".getBytes(StandardCharsets.UTF_8),"name".getBytes(StandardCharsets.UTF_8),"xiaotao".getBytes(StandardCharsets.UTF_8));
        put1.addColumn("f1".getBytes(StandardCharsets.UTF_8),"age".getBytes(StandardCharsets.UTF_8),"42".getBytes(StandardCharsets.UTF_8));

        Put put2 = new Put("rowkey_003".getBytes(StandardCharsets.UTF_8));
        put2.addColumn("f1".getBytes(StandardCharsets.UTF_8),"name".getBytes(StandardCharsets.UTF_8),"xiaotao".getBytes(StandardCharsets.UTF_8));
        put2.addColumn("f1".getBytes(StandardCharsets.UTF_8),"age".getBytes(StandardCharsets.UTF_8),"42".getBytes(StandardCharsets.UTF_8));

        java.put(Arrays.asList(put,put1,put2));

        conn.close();
    }
}

get表中的數據

package com.doit.day01;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;

import java.nio.charset.StandardCharsets;

/**
 * 註意:put數據需要指定往哪個命名空間的哪個表的哪個rowKey的哪個列族的哪個列中put數據,put的值是什麼
 */
public class GetDataDemo {
    public static void main(String[] args) throws Exception {
        //獲取到hbase的配置文件對象
        Configuration conf = HBaseConfiguration.create();
        //針對配置文件設置zk的集群地址
        conf.set("hbase.zookeeper.quorum","linux01:2181,linux02:2181,linux03:2181");
        //創建hbase的連接對象
        Connection conn = ConnectionFactory.createConnection(conf);

        //指定往哪一張表中put數據
        Table java = conn.getTable(TableName.valueOf("java"));

        Get get = new Get("rowkey_001".getBytes(StandardCharsets.UTF_8));
//        get.addFamily("f1".getBytes(StandardCharsets.UTF_8));
        get.addColumn("f1".getBytes(StandardCharsets.UTF_8),"name".getBytes(StandardCharsets.UTF_8));
        Result result = java.get(get);
        boolean advance = result.advance();
        if(advance){
            Cell current = result.current();
            String family = new String(CellUtil.cloneFamily(current));
            String qualifier = new String(CellUtil.cloneQualifier(current));
            String row = new String(CellUtil.cloneRow(current));
            String value = new String(CellUtil.cloneValue(current));
            System.out.println(row+","+family+","+qualifier+","+value);
        }

        conn.close();
    }
}

scan表中的數據

package com.doit.day01;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;

import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Iterator;

/**
 * 註意:put數據需要指定往哪個命名空間的哪個表的哪個rowKey的哪個列族的哪個列中put數據,put的值是什麼
 */
public class ScanDataDemo {
    public static void main(String[] args) throws Exception {
        //獲取到hbase的配置文件對象
        Configuration conf = HBaseConfiguration.create();
        //針對配置文件設置zk的集群地址
        conf.set("hbase.zookeeper.quorum","linux01:2181,linux02:2181,linux03:2181");
        //創建hbase的連接對象
        Connection conn = ConnectionFactory.createConnection(conf);

        //指定往哪一張表中put數據
        Table java = conn.getTable(TableName.valueOf("java"));

        Scan scan = new Scan();
        scan.withStartRow("rowkey_001".getBytes(StandardCharsets.UTF_8));
        scan.withStopRow("rowkey_004".getBytes(StandardCharsets.UTF_8));

        ResultScanner scanner = java.getScanner(scan);
        Iterator<Result> iterator = scanner.iterator();
        while (iterator.hasNext()){
            Result next = iterator.next();
            while (next.advance()){
                Cell current = next.current();
                String family = new String(CellUtil.cloneFamily(current));
                String row = new String(CellUtil.cloneRow(current));
                String qualifier = new String(CellUtil.cloneQualifier(current));
                String value = new String(CellUtil.cloneValue(current));
                System.out.println(row+","+family+","+qualifier+","+value);
            }
        }


        conn.close();
    }
}

刪除一行數據

package com.doit.day02;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;

import java.io.IOException;
import java.nio.charset.StandardCharsets;

public class _12_刪除一行數據 {
    public static void main(String[] args) throws IOException {
        Configuration conf = HBaseConfiguration.create();
        conf.set("hbase.zookeeper.quorum","linux01");

        Connection conn = ConnectionFactory.createConnection(conf);

        Table java = conn.getTable(TableName.valueOf("java"));

        Delete delete = new Delete("rowkey_001".getBytes(StandardCharsets.UTF_8));

        java.delete(delete);

    }
}

數據存儲

行式存儲

傳統的行式資料庫將一個個完整的數據行存儲在數據頁中

列式存儲

列式資料庫是將同一個數據列的各個值存放在一起

image

傳統行式資料庫的特性如下:

  • 數據是按行存儲的。
  • 沒有索引的查詢使用大量I/O。比如一般的資料庫表都會建立索引,通過索引加快查詢效率。
  • 建立索引和物化視圖需要花費大量的時間和資源。
  • 面對查詢需求,資料庫必須被大量膨脹才能滿足需求。

列式資料庫的特性如下:

  • 數據按列存儲,即每一列單獨存放。
  • 數據即索引。
  • 只訪問查詢涉及的列,可以大量降低系統I/O。
  • 每一列由一個線程來處理,即查詢的併發處理性能高。
  • 數據類型一致,數據特征相似,可以高效壓縮。比如有增量壓縮、首碼壓縮演算法都是基於列存儲的類型定製的,所以可以大幅度提高壓縮比,有利於存儲和網路輸出數據帶寬的消耗。

列族式存儲

列族式存儲是一種非關係型資料庫存儲方式,按列而非行組織數據。它的數據模型是面向列的,即把數據按照列族的方式組織,將屬於同一列族的數據存儲在一起。每個列族都有一個唯一的標識符,一般通過列族名稱來表示。它具有高效的寫入和查詢性能,能夠支持極大規模的數據

  • 如果一個表有多個列族, 每個列族下只有一列, 那麼就等同於列式存儲。
  • 如果一個表只有一個列族, 該列族下有多個列, 那麼就等同於行式存儲.

image

hbase的存儲路徑:

在conf目錄下的hbase-site.xml文件中配置了數據存儲的路徑在hdfs上

<property>
<name>hbase.rootdir</name>
<value>hdfs://linux01:8020/hbase</value>
</property>

hdfs上的存儲路徑:

image
image


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近需要在計算大文件的 MD5 值時顯示進度,於是我寫瞭如下的代碼: ``` cs public long Length {get; private set; } public long Position { get; private set; } public async Task Compute ...
  • ## 硬碟壞道概念新知 現在一般很少提到硬碟壞道這個概念,硬碟無非壞了或者沒壞兩個狀態。玩NAS一段時間,就會遇到其中的中間狀態——“壞道”。本文僅就**機械硬碟**的“壞道”進行分析。 目前遇到過幾次文件系統損壞掛載不上。因為好玩,嘗試了多種文件系統。 1. ext4的硬碟斷電壞了,掛載提示nee ...
  • 大家好,我是 god23bin。今天我給大家帶來的是 Linux 命令系列,每天只需一分鐘,記住一個 Linux 命令不成問題。今天,需要你花費兩分鐘時間,因為我們要介紹的是兩個常用的查看文件內容的命令:cat 和 tail 命令。 ...
  • 問題 在系統日誌中(/var/log/messages),有時會看到大面積的下麵的報錯: nf_conntrack: table full, dropping packet 這說明系統接到了大量的連接請求,但是系統的連接跟蹤表已經滿了,無法再記錄新的連接了。這時候,系統會丟棄新的連接請求。 在 Ce ...
  • 目錄 一、免交互概念 二、基本免交互例子 三、expect 四、實驗演示 一、免交互概念 概念:對於shell腳本的自動化運維,就要實現免交互來達到自動化運維的效果 二、基本免交互例子 可以免交互統計出行號 1.命令行免交互統計 2.使用腳本免交互統計 3.使用免交互命令列印 4.免交互修改密碼 5 ...
  • # NFS遠程掛載 ## 一、概述 > NFS是一種基於TCP/IP 傳輸的網路文件系統協議。通過使用NFS協議,客戶機可以像訪問本地目錄一樣訪問遠程伺服器中的共用資源 > NAS存儲: NFS服務的實現依賴於RPC (Remote Process Call,遠端過程調用)機制,以完成遠程到本地的映 ...
  • 前言:window的命名規則禁止創建aux、con等命名文件和文件夾。 如果需要創建該文件或目錄,請使用cmd控制台創建,如下指令: 創建文件夾 D:\test>md aux\ 刪除文件夾 D:\test>rd aux\ 創建文件 D:\test>copy nul \\.\D:\aux.txt 已復 ...
  • # 安裝指定版本的mysql(mysql5.7) ## 目標:解決需求,安裝mysql5.7 ## 前言: > 安裝軟體的三種方式: > > 1. rpm 安裝 > 2. 源代碼編譯安裝 > 3. yum倉庫安裝 > - 本地光碟 > - 阿裡雲yum源 > - 自建yum倉庫文件夾 > 4. 去m ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...