用Redis作為Mysql資料庫的快取 二)

2021-07-03 20:32:49 字數 1573 閱讀 6188

把mysql結果集快取到redis的字串或雜湊結構中以後,我們面臨乙個新的問題,即如何為這些字串或雜湊命名,也就是如何確定它們的鍵。因為這些資料結構所對應的行都屬於某個結果集,假如可以找到一種唯一標識結果集的方法,那麼只需為這些資料結構分配乙個唯一的序號,然後把結果集識別符號與該序號結合起來,就能唯一標識乙個資料結構了。於是,為字串和雜湊命名的問題就轉化為確定結果集識別符號的問題。

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

確定結果集識別符號之後,從redis讀資料或向redis寫資料的思路就很清晰了。對於乙個sql語句格式的資料請求,首先計算該語句的md5並據此得到結果集識別符號,然後利用該識別符號在redis中查詢該結果集。注意,結果集中的每一行都有乙個相應的鍵,這些鍵都儲存在乙個redis集合結構中。這個集合恰好對應了所需的結果集,所以,該集合的鍵必須包含結果集識別符號。如果redis中不存在這樣乙個集合,說明要找的結果集不在redis中,所以需要執行相應的sql語句,在mysql中查詢到相應的結果集,然後按照上面所說的辦法把結果集中的每一行以字串或雜湊的形式存入redis。在redis中查詢相應結果集的**如下:

[cpp]view plain

copy

// 該函式根據sql語句在redis中查詢相應的結果集,並返回結果集中每一行所對應的資料結構的鍵

vectorgetcache(sql::connection *mysql_connection,  

rediscontext *redis_connection,  

const

string &sql, 

intttl, 

inttype)  else

// 再次嘗試從reply中獲取set中儲存的所有鍵

reply = static_cast

(rediscommand(redis_connection,   

"smembers %s"

,  redis_row_set_key.c_str()));  

delete

resultset;  

delete

stmt;  

}  // 把set中的每個string或hash鍵存入redis_row_key_vector中

string redis_row_key;  

for(

inti = 0; i < reply->elements; ++i)   

freereplyobject(reply);  

} else

return

redis_row_key_vector;  

}  

用Redis作Mysql資料庫快取

使用redis作mysql資料庫快取時,需要考慮兩個問題 1 確定用何種資料結構儲存來自mysql的資料 2 在確定資料結構之後,用什麼標識作為該資料結構的鍵。直觀上看,mysql中的資料都是按表儲存的 更微觀地看,這些表都是按行儲存的。每執行一次select查詢,mysql都會返回乙個結果集,這個...

配置Redis作為快取

將 redis 用作快取時,如果記憶體空間用滿,就會自動驅逐老的資料。預設情況下 memcached 就是這種方式,大部分開發者都比較熟悉。lru是redis唯一支援的 演算法.本文詳細介紹用於限制最大記憶體使用量的maxmemory指令,並深入講解 redis 所使用的近似lru演算法。maxme...

MySQL資料匯入Redis

從mysql中將資料匯入到 redis的 mysql 多個字段拼接 1.保證mysql有表 events all time 這個就是mysql要傳遞的資料表 create table events all time id int 11 unsigned not null auto increment...