主頁 > 資料庫 > sqlite3資料庫Linux 系統移植和使用

sqlite3資料庫Linux 系統移植和使用

2023-03-01 08:49:43 資料庫

sqlite3資料庫是一個小型的資料庫,當資料量不大,要求不是特別高的時候,是個不錯的選擇,

在Linux上移植和使用也非常的方便,

本示例是在硬體全志r528 .linux5.4 上驗證的,

移植操作:

   1、原始碼下載

      去官網進行下載原始碼SQLite Download Page,根據自己的選取選擇不同的版本,我發現我系統的menuconfig 上就帶sqlite3的資料庫,所以沒有在

官網上下載,直接勾選上,編譯出來的,

     

 

 

       

    2、交叉編譯

  進入sqlite-autoconf-3230100后執行以下指令生成Makefile檔案:

 

./configure CC=arm-hisiv400-linux-gcc--host=arm-hisiv400-linux--prefix=/home/rong//share/lishuangliang/sqlite/install

 

其中CC指定嵌入式平臺為arm-hisiv400-linux-gcc即海思的Hi3536;host項指定主機;prefix項指定安裝目錄;

需要注意的是每一項配置的等號兩邊不能有空格,接著運行make進行編譯,待編譯完成后運行make install進行安裝,

至此原始碼編譯安裝完成,(未驗證)
      編譯出來有用的檔案有libsqlite3.so libsqlite3.so.0動態庫,sqlite3 可執行檔案,

    3、配置部署編譯出來的庫和執行檔案

    將libsqlite3.so libsqlite3.so.0動態庫拷貝到Linux系統的  /usr/lib/ 目錄下,

        將sqlite3 拷貝到Linux系統的  /usr/bin/ 目錄下面,

應用編譯

    將 libsqlite3.so libsqlite3.so.0 放在要編譯的應用程式一個目錄或其他目錄下都可以主要是編譯器要能找到,

    sqlite3.h放在放在要編譯的應用程式一個目錄

  配置交叉編譯 必須 加上 -lsqlite3  -L加上庫目錄 -I 加上頭檔案目錄

  如下是一個簡單的Makefile 

  

# 方便起見一般都會先定義編譯器聯結器
CC = arm-openwrt-linux-gcc 
LD = arm-openwrt-linux-gcc
FLAGS = -lsqlite3 -L /home/kerson/app/test_app/sqlit3  -I /home/kerson/app/test_app/sqlit3

# 正則運算式表示目錄下所有.c檔案,相當于:SRCS = main.c a.c b.c
SRCS = $(wildcard *.c)

# OBJS表示SRCS中把串列中的.c全部替換為.o,相當于:OBJS = main.o a.o b.o
OBJS = $(patsubst %c, %o, $(SRCS))

# 可執行檔案的名字
TARGET = test_sqlite

# .PHONE偽目標,具體含義百度一下一大堆介紹
.PHONY:all clean

# 要生成的目標檔案
all: $(TARGET)

# 第一行依賴關系:冒號后面為依賴的檔案,相當于Hello: main.o a.o b.o
# 第二行規則:$@表示目標檔案,$^表示所有依賴檔案,$<表示第一個依賴檔案
$(TARGET): $(OBJS)
    $(LD) $(FLAGS) -o $@ $^

# 上一句目標檔案依賴一大堆.o檔案,這句表示所有.o都由相應名字的.c檔案自動生成
%.o:%.c
    $(CC) $(FLAGS) -c $^

# make clean洗掉所有.o和目標檔案
clean:
    rm -f $(OBJS) $(TARGET)

 

 

 

 

下面分享實驗代碼

主要是拼接SQL陳述句,之后用exec函式執行SQL陳述句,

主要的是查詢表格內容時,注意回呼函式是每查找到一條記錄就執行一次回呼函式,

 

my_sqlite3.c


#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include "sqlite3.h"
#include "my_sqlite3.h"




/*
* @brief 打開/創建資料庫
* @param 無
* @return 失敗回傳NULL/成功回傳資料庫db
*/

sqlite3 * sqlite3_open_database(char * db_name)
{
    int ret = 0;
    sqlite3* db;

    if(db_name == NULL || strlen(db_name) == 0){
        return NULL;
    }
    
    ret = sqlite3_open(db_name ,&db);
    if(ret != SQLITE_OK){
        printf("Open db error =:%s",sqlite3_errmsg(db));
        return NULL;
    }
    
    return db;
}


/*
* @brief 創建一個表
* @param db,
    table_name:表名字
    data_buf:列專案
* @return 失敗回傳-1/成功回傳0
*/

int sqlite3_create_table(sqlite3 *db, char * table_name,char *data_buf)
{
    char sql_str[128] ={0};
    char *err_msg = NULL;
    int ret =-1;
    if(table_name == NULL ||strlen(table_name) ==0){
        printf("input argc error\n");
        return -1;
    }

    sprintf(sql_str,"CREATE TABLE IF NOT EXISTS %s %s",table_name,data_buf);
    ret = sqlite3_exec(db,sql_str,0,0,&err_msg);
    if(ret != SQLITE_OK)
    {
        printf("Creat table %s error : %s", table_name,err_msg);
        sqlite3_free(err_msg);
    }else{
        ret = 0;
    }

    return ret;
}




/*
* @brief 洗掉一個表
* @param db,
    table_name:表名字
* @return 失敗回傳-1/成功回傳0
*/
int sqlite3_delete_table(sqlite3 *db, char * table_name)
{
    char sql_str[128] ={0};
    char *err_msg = NULL;
    int ret =-1;
    if(table_name == NULL ||strlen(table_name) ==0){
        printf("input argc error\n");
        return -1;
    }

    sprintf(sql_str,"DROP TABLE %s",table_name);
    sqlite3_busy_timeout(db, 1000);
    ret = sqlite3_exec(db,sql_str,0,0,&err_msg);
    if(ret != SQLITE_OK)
    {
        printf("Delete table %s error : %s", table_name,err_msg);
        sqlite3_free(err_msg);
    }else{
        ret = 0;
    }
    return ret;

    
}


/*
* @brief 插入一條資料
* @param db,
    table_name:表名字
* @return 失敗回傳-1/成功回傳0
*/
int sqlite3_insert_single(sqlite3 *db,char *table_name,  char *data_buf)
{

    char sql_str[128] ={0};
    char *err_msg = NULL;
    int ret =-1;
    if(table_name == NULL ||strlen(table_name) ==0){
        printf("input argc error\n");
        return -1;
    }

    sprintf(sql_str,"INSERT INTO %s values %s",table_name,data_buf);
    sqlite3_busy_timeout(db, 1000);
    ret = sqlite3_exec(db,sql_str,0,0,&err_msg);
    if(ret != SQLITE_OK)
    {
        printf("insert table %s error : %s", table_name,err_msg);
        sqlite3_free(err_msg);
    }else{
        ret = 0;
    }
    return ret;
}



/*
* @brief 插入多條資料(利用顯示事物機制,效率高)
* @param db,
    table_name:表名字
    data_buf 多條插入的內容
* @return 失敗回傳-1/成功回傳0
*/

int sqlite3_insert_multi(sqlite3 *db,char *table_name,  char **data_buf ,int len)
{

    char sql_str[128] ={0};
    char *err_msg = NULL;
    int ret =-1 ,i =0;
    sqlite3_stmt * stmt;
    
    if(table_name == NULL ||strlen(table_name) ==0){
        printf("input argc error\n");
        return -1;
    }
    sprintf(sql_str,"INSERT INO %s values ?");

    sqlite3_exec(db,"BEGIN",0,0,0);
    ret = sqlite3_prepare(db,sql_str,strlen(sql_str),&stmt,0);
    if(ret != SQLITE_OK)
        return -1;
    
    while(data_buf[i] !=NULL && i < len){
        sqlite3_bind_text(stmt,1,data_buf[i],strlen(data_buf[i]),NULL);
        ret = sqlite3_step(stmt);
        if((ret != SQLITE_OK) && (ret != SQLITE_DONE)){
            break;
        }
        sqlite3_reset(stmt);
        i++;
    }
    sqlite3_finalize(stmt);
    if(i < len){
        sqlite3_exec(db,"ROLLBACK",0,0,0);
        return -1;
    }
    if(i == len){
        sqlite3_exec(db,"COMMIT",0,0,0);
        ret =0;
    }    


    return ret;
}



/*
* @brief 查詢回呼函式
* @param 

 data:由sqlite3_exec傳遞的初始化引數
 argc:表頭的列數
 col:表頭的名字陣列指標
 argv:表頭的資料陣列指標

* @return 失回傳0
*/
int exec_handle(void *data, int argc, char **argv,char ** colname)
{
    /*查詢到一條結果將data+1*/    
    int i = *(int *)(data);
    *(int *)(data) = i+1;

    /*列印*/
    for(i =0;i<argc;i++){
        printf("NUM =%d %s\t%s\n",*(int *)(data),colname[i],argv[i]);
    }

    return 0;
}




/*
* @brief 查詢表格內容  sql陳述句:SELECT 列名稱 FROM 表名稱 WHERE 列 運算子 值
列名稱為 * 代表所有的列
* @param db,
    table_name:表名字
* @return 失敗回傳-1/成功回傳0 查詢成功,無查詢結果,回傳1 查詢成功,有查詢結果
*/
int sqlite3_select_exec(sqlite3 *db,char *table_name, char *col_name, char *where_cond)
{
    char sql_str[128] ={0};
    char *err_msg = NULL;
    int ret =-1;
    int data =https://www.cnblogs.com/hylife/p/0;
    if(table_name == NULL ||strlen(table_name) ==0){
        printf("input argc error\n");
        return -1;
    }

    sprintf(sql_str,"select %s from %s ",col_name,table_name);
    
    if(where_cond != NULL){
        strcat(sql_str," where ");
        strcat(sql_str,where_cond);
    }
    sqlite3_busy_timeout(db, 1000);
    ret = sqlite3_exec(db,sql_str,exec_handle,&data,&err_msg);
    if(ret != SQLITE_OK)
    {
        printf("select table %s error : %s", table_name,err_msg);
        sqlite3_free(err_msg);
    }else{

        if(data =https://www.cnblogs.com/hylife/p/= 0){
            return 0; /*查詢成功,無查詢結果*/
        }else{
            return 1; /*查詢成功,有查詢結果*/
        }    
        
    }

}


/*
* @brief 查詢資料庫中的表格  sql陳述句:select name from sqlite_maseter where type ='table' order by name
列名稱為 * 代表所有的列
* @param db,
* @return 
*/
int sqlite3_get_tablename(sqlite3 *db)
{
    char sql_str[128] ={0};
    char *err_msg = NULL;
    int ret =-1;
    char ** dbresult;
    int i,j,nrow,ncolumn,index =0;

    sprintf(sql_str,"select name from sqlite_master where type ='table' order by name ");
    
    sqlite3_busy_timeout(db, 1000);
    ret = sqlite3_get_table(db,sql_str,&dbresult,&nrow,&ncolumn,&err_msg);
    if(ret == SQLITE_OK)
    {
        for(i=0;i <= nrow; i++)
            /*for(j=0;j< ncolumn;j++)*/
        {
            printf("%s \n",dbresult[index]);
            index++;
        }
    }
    else{

        printf(" get table error\n ");
    }

}




/*
* @brief 更新 sql陳述句:UPDATAE 表名 SET 新值 WHERE 列 運算子 值
* @param db,
    table_name:表名字
* @return 失敗回傳-1/成功回傳0 查詢成功,無查詢結果,回傳1 查詢成功,有查詢結果
*/
int sqlite3_update_single(sqlite3 *db,char *table_name, char *new_val, char *where_cond)
{
    char sql_str[128] ={0};
    char *err_msg = NULL;
    int ret =-1;

    if(table_name == NULL ||strlen(table_name) ==0){
        printf("input argc error\n");
        return -1;
    }

    sprintf(sql_str,"UPDATE %s SET %s",table_name,new_val);
    if(where_cond != NULL){
        strcat(sql_str," where ");
        strcat(sql_str,where_cond);
    }    
    sqlite3_busy_timeout(db, 1000);
    ret = sqlite3_exec(db,sql_str,0,0,&err_msg);
    if(ret != SQLITE_OK)
    {
        printf("UPDATE table %s error : %s", table_name,err_msg);
        sqlite3_free(err_msg);
        ret =-1;
    }else{

        ret = 0;    
    }
    return ret;

}


/*
* @brief 洗掉 sql陳述句:DELETE FROM 表名稱 WHERE 列 運算子 值
沒有where 為洗掉所有,
* @param db,
    table_name:表名字
* @return 失敗回傳-1/成功回傳0 查詢成功,無查詢結果,回傳1 查詢成功,有查詢結果
*/
int sqlite3_delete_single(sqlite3 *db,char *table_name,char *where_cond)
{
    char sql_str[128] ={0};
    char *err_msg = NULL;
    int ret =-1;
    int data =https://www.cnblogs.com/hylife/p/0;
    if(table_name == NULL ||strlen(table_name) ==0){
        printf("input argc error\n");
        return -1;
    }

    sprintf(sql_str,"DELETE FROM %s",table_name);
    if(where_cond != NULL){
        strcat(sql_str," where ");
        strcat(sql_str,where_cond);
    }
    sqlite3_busy_timeout(db, 1000);
    ret = sqlite3_exec(db,sql_str,exec_handle,&data,&err_msg);
    if(ret != SQLITE_OK)
    {
        printf("s table %s error : %s", table_name,err_msg);
        sqlite3_free(err_msg);
        ret =-1;
    }else{

        ret = 0;    
    }
    return ret;

}

 

頭檔案

my_sqlite3.h

#ifndef _MY_SQLITE3_H_
#define _MY_SQLITE3_H_ sqlite3 * sqlite3_open_database(char * db_name); int sqlite3_create_table(sqlite3 *db, char * table_name,char *data_buf); int sqlite3_delete_table(sqlite3 *db, char * table_name); int sqlite3_insert_single(sqlite3 *db,char *table_name, char *data_buf); int sqlite3_select_exec(sqlite3 *db,char *table_name, char *col_name, char *where_cond); int exec_handle(void *data, int argc, char **argv,char ** colname); int sqlite3_update_single(sqlite3 *db,char *table_name, char *new_val, char *where_cond); int sqlite3_delete_single(sqlite3 *db,char *table_name,char *where_cond); int sqlite3_get_tablename(sqlite3 *db); #endif

 

 

測驗代碼

 

main.c


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sqlite3.h"
#include "my_sqlite3.h"

#define DB_NAME  "./test.db" 
#define DB_NAME1  "./data.db" 

#define TABLE_NAME "stu_table"
#define TABLE_NAME1 "場景表"

#define MAX_LEN 512


int main(int argc, char **argv)
{
    sqlite3 *db = NULL;
    char buf[MAX_LEN] ={0};
    char buf1[MAX_LEN] ={0};
    char *errmsg;
    int ret;

    db = sqlite3_open_database(DB_NAME);
    if(db == NULL){
        printf("open db error\n");
        return -1;
    }

    /*創建一個表*/
#if 0
    memset(sql,0,sizeof(sql));
    strcpy(sql,"creat table if not exists %s(name text ,score int);",TABLE_NAME);
    ret = sqlite3_exec(db,sql,NULL,NULL,&errmsg);
    if(ret !=0)
    {
        printf("sqlite3_exec:%s\n",errmsg);
    }
#endif
    memset(buf,0,sizeof(buf));
    strcpy(buf,"(Name text ,Score int)");
    ret = sqlite3_create_table(db,TABLE_NAME,buf);
    if(ret !=0)
    {
        return -1;
    }
    
    sqlite3_get_tablename(db); /*獲取有多少表格*/


    /*插入表中*/
    memset(buf,0,sizeof(buf));
    strcpy(buf,"('lili',86)");
    ret = sqlite3_insert_single(db,TABLE_NAME,buf);
    if(ret !=0)
    {
        return -1;
    }


    /*插入表中*/
    memset(buf,0,sizeof(buf));
    strcpy(buf,"('wangwu',99)");
    ret = sqlite3_insert_single(db,TABLE_NAME,buf);
    if(ret !=0)
    {
        return -1;
    }

    /*查找*/
    printf("select all:\n");
    sqlite3_select_exec(db,TABLE_NAME,"*",NULL);
    printf("select Score > 90:\n");
    memset(buf,0,sizeof(buf));
    strcpy(buf,"Score > 90");
    sqlite3_select_exec(db,TABLE_NAME,"*",buf);
    
    /*更改*/
    memset(buf,0,sizeof(buf));
    strcpy(buf,"Score = 91");
    memset(buf1,0,sizeof(buf1));
    strcpy(buf1,"Score < 90");
    sqlite3_update_single(db,TABLE_NAME,buf,buf1);


    /*查找*/
    printf("select all:\n");
    sqlite3_select_exec(db,TABLE_NAME,"*",NULL);
    printf("select Score > 90:\n");
    memset(buf,0,sizeof(buf));
    strcpy(buf,"Score > 90");
    sqlite3_select_exec(db,TABLE_NAME,"*",buf);

    /*洗掉*/
    memset(buf,0,sizeof(buf));
    strcpy(buf,"Score > 90");
    sqlite3_delete_single(db,TABLE_NAME,buf);

    printf("select all:\n");
    sqlite3_select_exec(db,TABLE_NAME,"*",NULL);



    /*關閉資料庫*/
    sqlite3_close(db);


    db = sqlite3_open_database(DB_NAME1);
    if(db == NULL){
        printf("open db error\n");
        return -1;
    }

    sqlite3_get_tablename(db); /*獲取有多少表格*/


    /*查找*/
    printf("select all:\n");
    sqlite3_select_exec(db,TABLE_NAME1,"*",NULL);

    /*更改*/
    memset(buf,0,sizeof(buf));
    strcpy(buf,"播放亮度 = 255");
    memset(buf1,0,sizeof(buf1));
    strcpy(buf1,"場景ID = 6");
    sqlite3_update_single(db,TABLE_NAME1,buf,buf1);


    /*查找*/
    printf("select all:\n");
    sqlite3_select_exec(db,TABLE_NAME1,"*",NULL);


    /*關閉資料庫*/
    sqlite3_close(db);

 
    return 0;
}

 

 

具體其他更細節的SQL陳述句,需要什么功能就百度搜索,拼接執行,

 

參考資料:

(29條訊息) sqlite3資料庫移植詳解_dosthing的博客-CSDN博客_移植sqlite3

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/545376.html

標籤:其它

上一篇:Postgres服務搭建使用

下一篇:Postgres服務搭建使用

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more