Garnet開發(fā)實(shí)戰(zhàn):談?wù)凴edis的數(shù)據(jù)序列化方式

之前寫的文章嵌赠,我隆重介紹到Garnet服務(wù)端如何安裝部署畅买。此外同仆,我還寫了一段客戶端運(yùn)行的代碼,來(lái)驗(yàn)證Garnet服務(wù)端可用性枪向。

記得當(dāng)時(shí)我用的是純String的存儲(chǔ)方式進(jìn)行寫入和讀取的勤揩。OK,代碼也找到了秘蛔。Copy過(guò)來(lái)給大家可以回顧一下陨亡。

using StackExchange.Redis;

var connString = "192.168.1.12:3278,password=012345";
var connection = ConnectionMultiplexer.Connect(connString);
var db = connection.GetDatabase();
db.StringSet("StringKey","Hello Garnet!");
var value = db.StringGet("StringKey");
Console.WriteLine(value);

一位有相當(dāng)開發(fā)經(jīng)驗(yàn)的讀者,發(fā)郵件跟我說(shuō):“真實(shí)項(xiàng)目開發(fā)當(dāng)中深员,我們很少這么用呀数苫!我們?cè)诰彺娴臄?shù)據(jù)一般都是結(jié)構(gòu)化的,絕少用Pain Text”辨液。

是的虐急,非常正確!既然如此滔迈,我今天就順著這個(gè)話題止吁,深入探討一下吧×呛罚看看Garnet或Redis的數(shù)據(jù)序列化方式有哪些敬惦,我們應(yīng)該怎么選擇。

常用的序列化方式有三種:JSON谈山、MessagePack俄删、ProtoBuf。下面我用C#類庫(kù)BeetleX.Redishttps://www.nuget.org/packages/BeetleX.Redis/)奏路,分別對(duì)以上三種序列化方式來(lái)做個(gè)演示一下吧畴椰。

對(duì)象實(shí)體類

首先,聲明一個(gè)實(shí)體對(duì)象的類鸽粉,用來(lái)創(chuàng)建對(duì)象實(shí)例供我們做序列化測(cè)試斜脂。

[MessagePackObject]
[ProtoContract]
[BeetleX.Packets.MessageType(1)]
public class Goods
{
    [Key(1)]
    [ProtoMember(1)]
    public int id { get; set; }
    [Key(2)]
    [ProtoMember(2)]
    public string name { get; set; }
    [Key(3)]
    [ProtoMember(3)]
    public decimal price { get; set; }
    [Key(4)]
    [ProtoMember(4)]
    public int qty { get; set; }
    [Key(5)]
    [ProtoMember(5)]
    public DateTime createdAt { get; set; }
}

數(shù)據(jù)序列化寫入和讀取

using BeetleX.Redis;
using MessagePack;
using ProtoBuf;

static async Task TestBeetleXRedis(string format)
{
    RedisDB DB = null;
    switch (format)
    {
        case "Json":
            DB = new RedisDB(0, new JsonFormater());
            break;
        case "ProtoBuff":
            DB = new RedisDB(0, new ProtobufFormater());
            break;
        case "MessagePack":
            DB = new RedisDB(0, new MessagePackFormater());
            break;
        default:
            throw new NotSupportedException(format);
    }
    DB.Host.AddWriteHost("192.168.1.12", 3278).Password = "012345";
    
    var goods = new Goods()
    {
        id = 1,
        name = "IPhone15 Pro",
        price = 999.99m,
        qty = 1000,
        createdAt = DateTime.Now
    };

    var key = $"{format}_GoodsObject";
    await DB.Set(key, goods);
    goods = await DB.Get<Goods>(key);
    Console.WriteLine(goods);
}

await TestBeetleXRedis("Json");
await TestBeetleXRedis("ProtoBuff");
await TestBeetleXRedis("MessagePack");

執(zhí)行完以上代碼,我們打開RedisInsight客戶端触机,可以看到剛才我們寫入的對(duì)應(yīng)以上三種序列化方式的緩存數(shù)據(jù)帚戳。

對(duì)比分析

1、存儲(chǔ)空間

其中儡首,Json占用所的存儲(chǔ)空間最大片任,比另外兩個(gè)明顯大了很多。ProtoBuff比MessagePack略大一點(diǎn)蔬胯,基本上不分伯仲对供。
存儲(chǔ)空間占用大小意味這什么?意味著服務(wù)器成本的開支笔宿!
假設(shè)我們的項(xiàng)目用Json序列化存儲(chǔ)的緩存數(shù)據(jù)有10G犁钟,那么我們至少需要一臺(tái)12G內(nèi)存的服務(wù)器。如果換MessagePack泼橘,那么一臺(tái)8G內(nèi)存的服務(wù)足夠應(yīng)付了涝动。

緩存結(jié)果

2、序列化/反序列化性能

至于序列化的性能炬灭,Json無(wú)疑是墊底的醋粟。這些網(wǎng)上測(cè)試用例很多,大家搜索一下就能找到重归。我懶得去copy了米愿。值得一提的是,我曾經(jīng)看過(guò)某個(gè)號(hào)稱高性能序列化Json的C#代碼鼻吮,發(fā)現(xiàn)JSON的算法真的很復(fù)雜育苟,遠(yuǎn)不如ProtoBuff和MessagePack簡(jiǎn)潔高效。

3椎木、內(nèi)容可讀性

接著我們看看數(shù)據(jù)內(nèi)容违柏,可讀性Json > MessagePack > ProtoBuff。Json本來(lái)就是文本數(shù)據(jù)香椎,可讀性最高完全沒(méi)有意外漱竖。


JSON
ProtoBuff
MessagePack

4、總結(jié)

  • 在實(shí)際的項(xiàng)目中畜伐,我們一般會(huì)對(duì)Redis緩存數(shù)據(jù)進(jìn)行序列化處理馍惹。
  • 我們對(duì)三種序列化方式進(jìn)行對(duì)比,發(fā)現(xiàn)Json性能弱玛界,且暫用存儲(chǔ)空間大万矾。它的唯一優(yōu)點(diǎn)是內(nèi)容具有非常高的可讀性。
  • 如果您要大規(guī)模使用Redis緩存慎框,并且追求高性能低成本的話勤众,強(qiáng)烈建議不要用Json序列化!
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鲤脏,一起剝皮案震驚了整個(gè)濱河市们颜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌猎醇,老刑警劉巖窥突,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異硫嘶,居然都是意外死亡阻问,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門沦疾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)称近,“玉大人第队,你說(shuō)我怎么就攤上這事∨俑眩” “怎么了凳谦?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)衡未。 經(jīng)常有香客問(wèn)我尸执,道長(zhǎng),這世上最難降的妖魔是什么缓醋? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任如失,我火速辦了婚禮,結(jié)果婚禮上送粱,老公的妹妹穿的比我還像新娘褪贵。我一直安慰自己,他們只是感情好抗俄,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布竭鞍。 她就那樣靜靜地躺著,像睡著了一般橄镜。 火紅的嫁衣襯著肌膚如雪偎快。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天洽胶,我揣著相機(jī)與錄音晒夹,去河邊找鬼。 笑死姊氓,一個(gè)胖子當(dāng)著我的面吹牛丐怯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播翔横,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼读跷,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了禾唁?” 一聲冷哼從身側(cè)響起效览,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎荡短,沒(méi)想到半個(gè)月后丐枉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掘托,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年瘦锹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡弯院,死狀恐怖辱士,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情听绳,我是刑警寧澤颂碘,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站辫红,受9級(jí)特大地震影響凭涂,放射性物質(zhì)發(fā)生泄漏祝辣。R本人自食惡果不足惜贴妻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蝙斜。 院中可真熱鬧名惩,春花似錦、人聲如沸孕荠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)稚伍。三九已至弯予,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間个曙,已是汗流浹背锈嫩。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留垦搬,地道東北人呼寸。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像猴贰,于是被迫代替她去往敵國(guó)和親对雪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容