那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

redis緩存mysql數據

lhl545545 ? 來源:電子發燒友網 ? 2018-02-09 15:42 ? 次閱讀

前言

用Redis作Mysql數據庫緩存,必須解決2個問題。首先,應該確定用何種數據結構存儲來自Mysql的數據;在確定數據結構之后,還要考慮用什么標識作為該數據結構的鍵。

直觀上看,Mysql中的數據都是按表存儲的;更微觀地看,這些表都是按行存儲的。每執行一次select查詢,Mysql都會返回一個結果集,這個結果集由若干行組成。所以,一個自然而然的想法就是在Redis中找到一種對應于Mysql行的數據結構。Redis中提供了五種基本數據結構,即字符串(string)、列表(list)、哈希(hash)、集合(set)和有序集合(sorted set)。經過調研,發現適合存儲行的數據結構有兩種,即string和hash。

要把Mysql的行數據存入string,首先需要對行數據進行格式化。事實上,結果集的每一行都可以看做若干由字段名和其對應值組成的鍵值對集合。這種鍵值對結構很容易讓我們想起Json格式。因此,這里選用Json格式作為結果集每一行的格式化模板。根據這一想法,我們可以實現將結果集格式化為若干Json對象,并將Json對象轉化為字符串存入Redis的代碼:

view sourceprint?

01.

// 該函數把結果集中的每一行轉換為一個Json格式的字符串并存入Redis的STRING結構中,

02.

// STRING鍵應該包含結果集標識符和STRING編號,形式如“cache.string:123456:1”

03.

string Cache2String(sql::Connection *mysql_connection,

04.

redisContext *redis_connection,

05.

sql::ResultSet *resultset,

06.

const string &resultset_id, int ttl) {

07.

if (resultset->rowsCount() == 0) {

08.

throw runtime_error(“FAILURE - no rows”);

09.

}

10.

// STRING鍵的前綴,包含了結果集的標識符

11.

string prefix(“cache.string:” + resultset_id + “:”);

12.

unsigned int num_row = 1; // STRING編號,附加于STRING鍵的末尾,從1開始

13.

sql::ResultSetMetaData *meta = resultset->getMetaData();

14.

unsigned int num_col = meta->getColumnCount();

15.

// 將結果集中所有行對應的所有STRING鍵存入該SET,SET鍵包含了結果集的標識符

16.

string redis_row_set_key(“resultset.string:” + resultset_id);

17.

redisReply *reply;

18.

string ttlstr;

19.

stringstream ttlstream;

20.

ttlstream << ttl;

21.

ttlstr = ttlstream.str();

22.

resultset->beforeFirst();

23.

// 將結果集中的每一行轉為Json格式的字符串,將這些Json字符串存入STRING,

24.

// 每個STRING對應結果集中的一行

25.

while (resultset->next()) {

26.

string redis_row_key; // STRING鍵名,由前綴和STRING編號組成

27.

stringstream keystream;

28.

keystream <

29.

redis_row_key = keystream.str();

30.

Json::Value row;

31.

for (int i = 1; i <= num_col; ++i) {

32.

string col_label = meta->getColumnLabel(i);

33.

string col_value = resultset->getString(col_label);

34.

row[col_label] = col_value;

35.

}

36.

Json::FastWriter writer;

37.

string redis_row_value = writer.write(row);

38.

// 將STRING鍵及Json格式的對應值對存入Redis

39.

reply = static_cast(redisCommand(redis_connection,

40.

“SET %s %s”,

41.

redis_row_key.c_str(),

42.

redis_row_value.c_str()));

43.

freeReplyObject(reply);

44.

// 將STRING鍵加入SET中

45.

reply = static_cast(redisCommand(redis_connection,

46.

“SADD %s %s”,

47.

redis_row_set_key.c_str(),

48.

redis_row_key.c_str()));

49.

freeReplyObject(reply);

50.

// 設置STRING的過期時間

51.

reply = static_cast(redisCommand(redis_connection,

52.

“EXPIRE %s %s”,

53.

redis_row_key.c_str(),

54.

ttlstr.c_str()));

55.

freeReplyObject(reply);

56.

++num_row;

57.

}

58.

// 設置SET的過期時間

59.

reply = static_cast(redisCommand(redis_connection,

60.

“EXPIRE %s %s”,

61.

redis_row_set_key.c_str(),

62.

ttlstr.c_str()));

63.

freeReplyObject(reply);

64.

return redis_row_set_key; // 返回SET鍵,以便于其他函數獲取該SET中的內容

65.

}

要把Mysql的行數據存入hash,過程要比把數據存入string直觀很多。這是由hash的結構性質決定的——hash本身就是一個鍵值對集合:一個“父鍵”下面包含了很多“子鍵”,每個“子鍵”都對應一個值。根據前面的分析可知,結果集中的每一行實際上也是鍵值對集合。用Redis鍵值對集合表示Mysql鍵值對集合應該再合適不過了:對于結果集中的某一行,字段對應于hash的“子鍵”,字段對應的值就是hash“子鍵”對應的值,即結果集的一行剛好對應一個hash。這一想法的實現代碼如下:

view sourceprint?

01.

// 該函數把結果集中的每一行都存入一個HASH結構。HASH鍵應當包括結果集標識符和HASH編號,

02.

// 形如“cache.string:123456:1”

03.

string Cache2Hash(sql::Connection *mysql_connection,

04.

redisContext *redis_connection,

05.

sql::ResultSet *resultset,

06.

const string &resultset_id, int ttl) {

07.

if (resultset->rowsCount() == 0) {

08.

throw runtime_error(“FAILURE - no rows”);

09.

}

10.

// HASH鍵的前綴,包含了結果集的標識符

11.

string prefix(“cache.hash:” + resultset_id + “:”);

12.

unsigned int num_row = 1; // HASH編號,附加于HASH鍵的末尾,從1開始

13.

sql::ResultSetMetaData *meta = resultset->getMetaData();

14.

unsigned int num_col = meta->getColumnCount();

15.

// 將結果集中所有行對應的所有HASH鍵存入該SET,SET鍵包含了結果集的標識符

16.

string redis_row_set_key(“resultset.hash:” + resultset_id);

17.

redisReply *reply;

18.

string ttlstr;

19.

stringstream ttlstream;

20.

ttlstream << ttl;

21.

ttlstr = ttlstream.str();

22.

// 結果集中的每一行對應于一個HASH,將結果集的所有行都存入相應HASH中

23.

resultset->beforeFirst();

24.

while (resultset->next()) {

25.

string redis_row_key; // HASH鍵名,由前綴和HASH編號組成

26.

stringstream keystream;

27.

keystream << prefix << num_row;

28.

redis_row_key = keystream.str();

29.

for (int i = 1; i <= num_col; ++i) {

30.

string col_label = meta->getColumnLabel(i);

31.

string col_value = resultset->getString(col_label);

32.

// 將結果集中一行的字段名和對應值存入HASH

33.

reply = static_cast(redisCommand(redis_connection,

34.

“HSET %s %s %s”,

35.

redis_row_key.c_str(),

36.

col_label.c_str(),

37.

col_value.c_str()));

38.

freeReplyObject(reply);

39.

}

40.

// 將HASH鍵加入SET中

41.

reply = static_cast(redisCommand(redis_connection,

42.

“SADD %s %s”,

43.

redis_row_set_key.c_str(),

44.

redis_row_key.c_str()));

45.

freeReplyObject(reply);

46.

// 設置HASH的過期時間

47.

reply = static_cast(redisCommand(redis_connection,

48.

“EXPIRE %s %s”,

49.

redis_row_key.c_str(),

50.

ttlstr.c_str()));

51.

freeReplyObject(reply);

52.

++num_row;

53.

}

54.

// 設置SET的過期時間

55.

reply = static_cast(redisCommand(redis_connection,

56.

“EXPIRE %s %s”,

57.

redis_row_set_key.c_str(),

58.

ttlstr.c_str()));

59.

freeReplyObject(reply);

60.

return redis_row_set_key; // 返回SET鍵,以便于其他函數獲取該SET中的內容

61.

}

至此,我們已經給出了兩種存儲Mysql結果集的方案,這就是我們在篇首提出的第一個問題,即選擇何種數據結構存儲Mysql結果集的答案。

把Mysql結果集緩存到Redis的字符串或哈希結構中以后,我們面臨一個新的問題,即如何為這些字符串或哈希命名,也就是如何確定它們的鍵。因為這些數據結構所對應的行都屬于某個結果集,假如可以找到一種唯一標識結果集的方法,那么只需為這些數據結構分配一個唯一的序號,然后把結果集標識符與該序號結合起來,就能唯一標識一個數據結構了。于是,為字符串和哈希命名的問題就轉化為確定結果集標識符的問題。

經過調研,發現一種較為通用的確定結果集標識符的方法。正如我們所知道的,緩存在Redis中的結果集數據都是利用select等sql語句從Mysql中獲取的。同樣的查詢語句會生成同樣的結果集(這里暫時不討論結果集中每條記錄的順序問題),這一性質剛好可以用來確定結果集的唯一標識符。當然,簡單地把整個sql語句作為結果集標識符是不可取的,一個顯而易見的理由是,未經處理的sql查詢語句均包含若干空格,而Redis的鍵是不允許存在空格的。這時,我們需要一個可以把sql語句轉換為唯一標識符的函數。通常,這一功能由散列函數完成,包括MD5,SHA系列等加密散列函數在內的很多算法均可達到這一目的。

確定結果集標識符之后,從Redis讀數據或向Redis寫數據的思路就很清晰了。對于一個sql語句格式的數據請求,首先計算該語句的MD5并據此得到結果集標識符,然后利用該標識符在Redis中查找該結果集。注意,結果集中的每一行都有一個相應的鍵,這些鍵都存儲在一個Redis集合結構中。這個集合恰好對應了所需的結果集,所以,該集合的鍵必須包含結果集標識符。如果Redis中不存在這樣一個集合,說明要找的結果集不在Redis中,所以需要執行相應的sql語句,在Mysql中查詢到相應的結果集,然后按照上面所說的辦法把結果集中的每一行以字符串或哈希的形式存入Redis。在Redis中查找相應結果集的代碼如下:

view sourceprint?

01.

// 該函數根據sql語句在Redis中查詢相應的結果集,并返回結果集中每一行所對應的數據結構的鍵

02.

vector GetCache(sql::Connection *mysql_connection,

03.

redisContext *redis_connection,

04.

const string &sql, int ttl, int type) {

05.

vector redis_row_key_vector;

06.

string resultset_id = md5(sql); // 計算sql語句的md5,這是唯一標識結果集的關鍵

07.

// type==1時,該函數將查詢相應的STRING集合或將結果集寫入若干STRING

08.

string cache_type = (type == 1) ? “string” : “hash”;

09.

// 根據type信息和結果集標識符合成SET鍵

10.

string redis_row_set_key = “resultset.” + cache_type + “:” + resultset_id;

11.

redisReply *reply;

12.

// 嘗試從reply中獲取SET中保存的所有鍵

13.

reply = static_cast(redisCommand(redis_connection,

14.

“SMEMBERS %s”,

15.

redis_row_set_key.c_str()));

16.

if (reply->type == REDIS_REPLY_ARRAY) {

17.

// 如果要找的SET不存在,說明Redis中沒有相應的結果集,需要調用Cache2String或

18.

// Cache2Hash函數把數據從Mysql拉取到Redis中

19.

if (reply->elements == 0) {

20.

freeReplyObject(reply);

21.

sql::Statement *stmt = mysql_connection->createStatement();

22.

sql::ResultSet *resultset = stmt->executeQuery(sql);

23.

if (type == 1) {

24.

redis_row_set_key = Cache2String(mysql_connection, redis_connection,

25.

resultset, resultset_id, ttl);

26.

} else {

27.

redis_row_set_key = Cache2Hash(mysql_connection, redis_connection,

28.

resultset, resultset_id, ttl);

29.

}

30.

// 再次嘗試從reply中獲取SET中保存的所有鍵

31.

reply = static_cast(redisCommand(redis_connection,

32.

“SMEMBERS %s”,

33.

redis_row_set_key.c_str()));

34.

delete resultset;

35.

delete stmt;

36.

}

37.

// 把SET中的每個STRING或HASH鍵存入redis_row_key_vector中

38.

string redis_row_key;

39.

for (int i = 0; i < reply->elements; ++i) {

40.

redis_row_key = reply->element[i]->str;

41.

redis_row_key_vector.push_back(redis_row_key);

42.

}

43.

freeReplyObject(reply);

44.

} else {

45.

freeReplyObject(reply);

46.

throw runtime_error(“FAILURE - SMEMBERS error”);

47.

}

48.

return redis_row_key_vector;

49.

}

現在我們已經掌握了確定Redis中的結果集標識符以及各數據結構的鍵的方法。下一篇文章將研究結果集在Redis中的排序和分頁問題。

在實現緩存排序功能之前,必須先明白這一功能的合理性。不妨思考一下,既然可以在數據庫中排序,為什么還要把排序功能放在緩存中實現呢?這里簡單總結了兩個原因:首先,排序會增加數據庫的負載,難以支撐高并發的應用;其次,在緩存中排序不會遇到表鎖定的問題。Redis恰好提供了排序功能,使我們可以方便地實現緩存排序。

Redis中用于實現排序功能的是SORT命令。該命令提供了多種參數,可以對列表,集合和有序集合進行排序。SORT命令格式如下:

view sourceprint?

1.

SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern 。..]] [ASC | DESC] [ALPHA] [STORE destination]

BY參數用于指定排序字段,功能類似于SQL中的order by。對于列表和集合而言,僅按照它們的值進行排序往往沒有實際意義。以函數Cache2Hash返回的集合為例(實際上返回的是集合鍵),該集合中存儲的是一系列完整的哈希鍵,只按照這些鍵進行排序,結果無非是按照數字或字典順序排列,其用處顯然不大。這是因為真正存儲行數據的是哈希結構本身,而非哈希鍵。假設集合鍵為“resultset.hash:123456”,集合中每個哈希鍵對應的哈希結構中都有一個名為“timestamp”的字段,現在要把集合中的所有哈希鍵按照timestamp字段進行排序,這時,只需執行以下命令:

view sourceprint?

1.

SORT resultset.hash:123456 BY *->timestamp

從上例可以看出,BY的真正威力在于它可以讓SORT命令按照一個指定的外部鍵的外部字段進行排序。SORT用集合resultset.hash:123456中的每個值(即每個哈希鍵)替換BY參數后的第一個“*”,并依據“->”后面給出的字段獲取其值,最后根據這些字段值對哈希鍵進行排序。

LIMIT參數用于限制排序以后返回元素的數量,功能類似于SQL中的limit。該參數接受另外兩個參數,即offset和count,LIMIT offset count表示跳過前offset個元素,返回之后的連續count個元素。可見,LIMIT參數可以用于實現分頁功能。

GET參數用于返回指定的字段值。以集合resultset.hash:123456為例,使用BY參數對集合中的所有哈希鍵按照哈希結構中的timestamp字段排序后,SORT命令返回所有排序之后的哈希鍵。如果某個請求需要不是鍵而是某些字段值,這時就要使用GET參數,使SORT命令返回指定字段值。假設除timestamp字段以外,集合中每個哈希鍵對應的哈希結構中還有一個名為“id”的字段,通過以下命令可以使SORT返回按照timestamp排序以后的每個哈希鍵對應的哈希結構中的timestamp和id值:

view sourceprint?

1.

SORT resultset.hash:123456 BY *->timestamp GET *->timestamp GET *->id

SORT用集合resultset.hash:123456中的每個值(即每個哈希鍵)替換GET參數之后的第一個“*”,并將其作為返回值。值得注意的是,利用GET #能夠得到集合中的哈希鍵本身。

ASC和DESC參數用于指定排序順序(默認為ASC,即從低到高),ALPHA參數用于按照字典順序排列非數字元素。

STORE參數用于將SORT命令的返回值,即排序結果存入一個指定的列表。加上STORE參數后,SORT命令的返回值就變為排序結果的個數。

下面的代碼實現了按照哈希的某個字段對集合中的哈希鍵排序,并將結果存入列表的過程:

view sourceprint?

01.

// 該函數對集合中的所有HASH鍵進行排序,排序依據是HASH鍵所對應的HASH中的某個字段,

02.

// 排序結果被存入一個LIST結構,LIST鍵應當包含結果集標識符和排序字段標識符,

03.

// 形如“sorted:123456:1234”

04.

string SortHash(sql::Connection *mysql_connection,

05.

redisContext *redis_connection,

06.

const string &resultset_id,

07.

const string &sort_field,

08.

int offset, int count, int order, int ttl) {

09.

// 只考慮存儲HASH鍵的SET

10.

string redis_row_set_key = “resultset.hash:” + resultset_id;

11.

redisReply *reply;

12.

// 檢測SET是否存在

13.

reply = static_cast(redisCommand(redis_connection,

14.

“EXISTS %s”,

15.

redis_row_set_key.c_str()));

16.

if (reply->integer == 0) {

17.

freeReplyObject(reply);

18.

throw runtime_error(“FAILURE - no resultsets”);

19.

} else {

20.

freeReplyObject(reply);

21.

}

22.

string field_md5 = md5(sort_field); // 利用MD5排除排序字段中空格造成的影響

23.

// 將排序結果存入該LIST

24.

string redis_sorted_list_key = “sorted:” + resultset_id + “:” + field_md5;

25.

string by(“*->” + sort_field); //確定排序字段

26.

string ord = (order == 1) ? “ASC” : “DESC”; //order==1時按照升序排列;否則為降序

27.

stringstream ofsstream, cntstream;

28.

ofsstream << offset;

29.

cntstream << count;

30.

// 執行排序命令,并把排序結果存入LIST

31.

reply = static_cast(redisCommand(

32.

redis_connection,

33.

“SORT %s BY %s LIMIT %s %s GET %s ALPHA STORE %s”,

34.

redis_row_set_key.c_str(),

35.

by.c_str(),

36.

ofsstream.str().c_str(),

37.

cntstream.str().c_str(),

38.

“#”,

39.

redis_sorted_list_key.c_str()));

40.

freeReplyObject(reply);

41.

stringstream ttlstream;

42.

ttlstream << ttl;

43.

// 設置LIST的過期時間

44.

reply = static_cast(redisCommand(redis_connection,

45.

“EXPIRE %s %s”,

46.

redis_sorted_list_key.c_str(),

47.

ttlstream.str().c_str()));

48.

freeReplyObject(reply);

49.

return redis_sorted_list_key; // 返回LIST鍵,以便于其他函數獲取該LIST中的內容

顯然,對結果集中的哈希鍵進行排序要比對字符串鍵排序更加直觀和方便。借助于排序函數,可以方便地實現在Redis中查詢排序后的結果集,代碼如下:

view sourceprint?

01.

// 該函數根據sql語句和排序參數,在Redis中查詢相應的結果集并進行排序,最后返回

02.

// 排序之后的HASH鍵

03.

vector GetSortedCache(sql::Connection *mysql_connection,

04.

redisContext *redis_connection,

05.

const string &sql, const string &sort_field,

06.

int offset, int count, int order, int ttl) {

07.

vector redis_row_key_vector;

08.

redisReply *reply;

09.

string resultset_id = md5(sql); // 結果集標識符

10.

string field_md5 = md5(sort_field); // 排序字段標識符

11.

// 嘗試獲取LIST中的所有HASH鍵

12.

string redis_sorted_list_key = “sorted:” + resultset_id + “:” + field_md5;

13.

// 嘗試獲取LIST中的所有HASH鍵

14.

reply = static_cast(redisCommand(redis_connection,

15.

“LRANGE %s %s %s”,

16.

redis_sorted_list_key.c_str(),

17.

“0”,

18.

“-1”));

19.

if (reply->type == REDIS_REPLY_ARRAY) {

20.

// 如果LIST不存在,調用Cache2Hash函數從Mysql中拉取數據到Redis,然后調用SortHash函數

21.

// 對結果集進行排序并將排序后的HASH鍵存入LIST

22.

if (reply->elements == 0) {

23.

freeReplyObject(reply);

24.

sql::Statement *stmt = mysql_connection->createStatement();

25.

sql::ResultSet *resultset = stmt->executeQuery(sql);

26.

Cache2Hash(mysql_connection, redis_connection, resultset,

27.

resultset_id, ttl);

28.

redis_sorted_list_key = SortHash(mysql_connection, redis_connection,

29.

resultset_id, sort_field, offset,

30.

count, order, ttl);

31.

// 再次嘗試獲取LIST中的所有HASH鍵

32.

reply = static_cast(redisCommand(

33.

redis_connection,

34.

“LRANGE %s %s %s”,

35.

redis_sorted_list_key.c_str(),

36.

“0”,

37.

“-1”));

38.

delete resultset;

39.

delete stmt;

40.

}

41.

// 將LIST中的所有HASH鍵存入redis_row_key_vector中

42.

string redis_row_key;

43.

for (int i = 0; i < reply->elements; ++i) {

44.

redis_row_key = reply->element[i]->str;

45.

redis_row_key_vector.push_back(redis_row_key);

46.

}

47.

freeReplyObject(reply);

48.

} else {

49.

freeReplyObject(reply);

50.

throw runtime_error(“FAILURE - LRANGE error”);

51.

}

52.

return redis_row_key_vector;

53.

}

這樣,在Redis中對結果集進行簡單排序操作的功能就實現了。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • MySQL
    +關注

    關注

    1

    文章

    829

    瀏覽量

    26743
  • Redis
    +關注

    關注

    0

    文章

    378

    瀏覽量

    10942
收藏 人收藏

    評論

    相關推薦

    從Delphi、C++ Builder和Lazarus連接到MySQL數據

    ? 從 Delphi、C++ Builder 和 Lazarus 連接到 MySQL 數據MySQL 數據訪問組件(MyDAC)是一個組件庫,提供從 Delphi 和 C++ Bu
    的頭像 發表于 01-20 13:47 ?121次閱讀
    從Delphi、C++ Builder和Lazarus連接到<b class='flag-5'>MySQL</b><b class='flag-5'>數據</b>庫

    使用插件將Excel連接到MySQL/MariaDB

    ,可以快速地將數據MySQL 或 MariaDB 加載到 Excel,立即從數據庫刷新 Excel 工作簿中的數據,編輯這些數據,并將它
    的頭像 發表于 01-20 12:38 ?120次閱讀
    使用插件將Excel連接到<b class='flag-5'>MySQL</b>/MariaDB

    Redis Cluster之故障轉移

    1. Redis Cluster 簡介 Redis Cluster 是 Redis 官方提供的 Redis 集群功能。 為什么要實現 Redis
    的頭像 發表于 01-20 09:21 ?210次閱讀
    <b class='flag-5'>Redis</b> Cluster之故障轉移

    適用于MySQL和MariaDB的Python連接器:可靠的MySQL數據連接器和數據

    和 Linux 的 wheel 包分發。 直接連接 該解決方案使您能夠通過 TCP/IP 建立與 MySQL 或者 MariaDB 數據庫服務器的直接連接,而無需數據庫客戶端庫。另外直接連接可以提高 Python 應用程
    的頭像 發表于 01-17 12:18 ?122次閱讀
    適用于<b class='flag-5'>MySQL</b>和MariaDB的Python連接器:可靠的<b class='flag-5'>MySQL</b><b class='flag-5'>數據</b>連接器和<b class='flag-5'>數據</b>庫

    基于javaPoet的緩存key優化實踐

    數據庫中的熱數據緩存redis/本地緩存中,代碼如下: ? @Cacheable(value = { "per" }, key="#per
    的頭像 發表于 01-14 15:18 ?521次閱讀
    基于javaPoet的<b class='flag-5'>緩存</b>key優化實踐

    MySQL數據庫的安裝

    MySQL數據庫的安裝 【一】各種數據庫的端口 MySQL :3306 Redis :6379 MongoDB :27017 Django
    的頭像 發表于 01-14 11:25 ?131次閱讀
    <b class='flag-5'>MySQL</b><b class='flag-5'>數據</b>庫的安裝

    云服務器 Flexus X 實例 MySQL 應用加速測試

    文章目錄 目錄 文章目錄 ? 購買配置 ? 基本配置參考如下: ? 連接服務器 ? 查詢MySQL狀態 ? 啟動MySQL ? 添加配置 ? 添加密碼并修改權限 ? 性能測試 ? C#插入數據
    的頭像 發表于 12-24 12:19 ?222次閱讀
    云服務器 Flexus X 實例 <b class='flag-5'>MySQL</b> 應用加速測試

    緩存對大數據處理的影響分析

    緩存對大數據處理的影響顯著且重要,主要體現在以下幾個方面: 一、提高數據訪問速度 在大數據環境中,數據存儲通常采用分布式存儲系統,
    的頭像 發表于 12-18 09:45 ?244次閱讀

    Redis緩存與Memcached的比較

    Redis和Memcached都是廣泛使用的內存數據存儲系統,它們主要用于提高應用程序的性能,通過減少對數據庫的直接訪問來加速數據檢索。以下是對Re
    的頭像 發表于 12-18 09:33 ?241次閱讀

    數據數據恢復—Mysql數據庫表記錄丟失的數據恢復流程

    Mysql數據庫故障: Mysql數據庫表記錄丟失。 Mysql數據庫故障表現: 1、
    的頭像 發表于 12-16 11:05 ?223次閱讀
    <b class='flag-5'>數據</b>庫<b class='flag-5'>數據</b>恢復—<b class='flag-5'>Mysql</b><b class='flag-5'>數據</b>庫表記錄丟失的<b class='flag-5'>數據</b>恢復流程

    聊聊緩存擊穿的解決方法

    緩存擊穿,Redis中的某個熱點key不存在或者過期,但是此時有大量的用戶訪問該key。比如xxx直播間優惠券搶購、xxx商品活動,這時候大量用戶會在某個時間點一同訪問該熱點事件。但是可能
    的頭像 發表于 10-23 13:54 ?233次閱讀

    Redis是怎么從單體架構發展到分布式緩存的?

    Redis 架構是如何一步一步發展到今天的樣子的?
    的頭像 發表于 04-20 15:37 ?854次閱讀
    <b class='flag-5'>Redis</b>是怎么從單體架構發展到分布式<b class='flag-5'>緩存</b>的?

    Redis開源版與Redis企業版,怎么選用?

    點擊“藍字”關注我們數以千計的企業和數以百萬計的開發人員Redis開源版來構建應用程序。但隨著用戶數量、數據量和地區性的增加,成本、可擴展性、運營和可用性等問題也隨之而來。Redis企業版
    的頭像 發表于 04-04 08:04 ?1191次閱讀
    <b class='flag-5'>Redis</b>開源版與<b class='flag-5'>Redis</b>企業版,怎么選用?

    數據安全沒保障?GaussDB(for Redis) 為你保駕護航

    未知的 key,實際上可能面臨數據庫信息丟失和記錄篡改的風險。 作為一個重視技術的團隊,我們始終將用戶信息安全和使用體驗放在第一位。對于這次用戶使用開源 Redis 遇到的問題,我們盤點了 GaussDB(for Redis)精
    的頭像 發表于 03-28 22:09 ?718次閱讀
    <b class='flag-5'>數據</b>安全沒保障?GaussDB(for <b class='flag-5'>Redis</b>) 為你保駕護航

    RedisMySQL協同升級企業緩存

    傳統的MySQL數據庫在處理大規模應用時已經到了瓶頸,RedisEnterprise怎樣助力突破這一瓶頸?RedisEnterprise與MYSQL共同用作企業級緩存或副本
    的頭像 發表于 02-19 13:18 ?412次閱讀
    <b class='flag-5'>Redis</b>與<b class='flag-5'>MySQL</b>協同升級企業<b class='flag-5'>緩存</b>
    永春县| 大发888 yule| 裕昌太阳城户型图| 大发888客户端软件| 国际环球娱乐| 至尊百家乐官网贺一航| 百家乐官网游戏机图片| 新花园百家乐官网的玩法技巧和规则 | 元朗区| 利澳百家乐官网娱乐城| 百家乐3宜3忌| 反赌百家乐的玩法技巧和规则| 大发888娱乐城下栽| 新葡京娱乐城怎么样| 百家乐官网连赢的策略| 网上百家乐官网娱乐场开户注册| 百家乐游戏高手| 网上百家乐内| 赌球心得| 米其林百家乐官网的玩法技巧和规则 | 网络百家乐官网的玩法技巧和规则| 百家乐投注很好| 大发888下载 大发888游戏平台 | 传奇百家乐官网的玩法技巧和规则| 百家乐代理在线游戏可信吗网上哪家平台信誉好安全 | 博狗百家乐的玩法技巧和规则| 鸿博| 澳门百家乐官网看路博客| 百家乐视频游戏网址| 大发888娱乐城大发888达法8| 在线百家乐官网怎么下注| 百家乐是骗人的| 大发888电话多少| 百家乐官网猜大小规则| 闲和庄百家乐娱乐网| 新澳门娱乐城官网| 百家乐官网娱乐代理| 找真人百家乐的玩法技巧和规则| 临泉县| 百家乐线上代理网站| 太阳城正网|