直觀上看,數據庫中的數據都是按表存儲的;更微觀地看,這些表都是按行存儲的。每執行一
次select查詢,數據庫都會返回一個結果集,這個結果集由若干行組成。所以,一個自然而然
的想法就是在Redis中找到一種對應於數據庫l行的數據結構。Redis中提供了五種基本數據結構
,即字符串(string)、列表(list)、哈希(hash)、集合(set)和有序集合(sorted
set)。經過調研,發現適合存儲行的數據結構有兩種,即string和hash。
要把數據庫的行數據存入string,首先需要對行數據進行格式化。事實上,結果集的
每一行都可以看做若干由字段名和其對應值組成的鍵值對集合。這種鍵值對結構很容易讓我們
想起Json格式。因此,這里選用Json格式作為結果集每一行的格式化模板。根據這一想法,我
們可以實現將結果集格式化為若干Json對象,並將Json對象轉化為字符串存入Redis。
要把數據庫的行數據存入hash,過程要比把數據存入string直觀很多。這是由hash的結構性質
決定的——hash本身就是一個鍵值對集合:一個“父鍵”下面包含了很多“子鍵”,每個“子
鍵”都對應一個值。根據前面的分析可知,結果集中的每一行實際上也是鍵值對集合。用
Redis鍵值對集合表示數據庫鍵值對集合應該再合適不過了:對於結果集中的某一行,字段對應
於hash的“子鍵”,字段對應的值就是hash“子鍵”對應的值,即結果集的一行剛好對應一個
hash
Redis hash是一個string類型的field和value的映射表.一個key可對應多個field,一個field對應一個value。將一個對象存儲為hash類型,較於每個字段都存儲成string類型更能節省內存。
procedure TForm2.Button1Click(Sender: TObject); var lData: TRedisString; lCacheKey: string; lStream: TStringStream; begin lCacheKey := 'goods'; lStream := TStringStream.Create; try lData := FRedis.GET(lCacheKey); if lData.HasValue then begin lStream.WriteString(lData); lStream.Position := 0; FDQuery1.LoadFromStream(lStream, sfJSON); end else begin FDQuery1.Open('SELECT * FROM tgoods'); FDQuery1.SaveToStream(lStream, sfJSON); lStream.Position := 0; FRedis.&SET(lCacheKey, lStream.DataString, 30); end; finally lStream.Free; end; end;