簡介
多少次你發(fā)現(xiàn)自己在幾個(gè)月的開發(fā)和無數(shù)的努力后陷入了毫無性能而言的web應(yīng)用?多少次你在好奇如果你無法向普通用戶傳達(dá)快與最快的標(biāo)準(zhǔn),你的客戶還應(yīng)該把你當(dāng)作專家?多少你聽到有關(guān)Google和Facebook一些糟糕的對比?讓我告訴你,我的客戶是怎么看待這些的:
我曾開發(fā)一個(gè)有著復(fù)雜處理和過濾的web應(yīng)用,因?yàn)楹芏鄻I(yè)務(wù)規(guī)則和UI要求。再加上一些過時(shí)技術(shù)的第三方提供者,對于他們而言,速度意味著15年的工作丟進(jìn)垃圾桶,然后重新開始。我的應(yīng)用不是那么快,有時(shí)處理一個(gè)請求花費(fèi)6~8s才會(huì)處理完,業(yè)務(wù)規(guī)則的驗(yàn)證、過濾和格式化響應(yīng)。而客戶不接受這樣。并說如果Google做就會(huì)做好。同樣,F(xiàn)acebook也行。我無法向客戶解釋速度后面的硬件是多么的龐大,服務(wù)器的壓力怎樣。我僅僅回復(fù)說可以做更好,我在記住Redis后保證可以做到。
那么,在我們深入Redis之前,我先介紹下NoSql。
大多數(shù)開發(fā)者習(xí)慣用關(guān)系型數(shù)據(jù)庫。數(shù)據(jù)驅(qū)動(dòng)開發(fā)或者領(lǐng)域驅(qū)動(dòng)開發(fā)(作為一個(gè)整體框架編碼或者用Fluent API NHibernate),關(guān)系型數(shù)據(jù)庫的概念一樣。另一方面,NoSql引領(lǐng)了新的數(shù)據(jù)存儲(chǔ)時(shí)尚。在.NET社區(qū)最流行的是MongoDb,RavenDb和Redis。我已經(jīng)寫了一篇怎么使用MongDb的文章,你可以在這里找到。我使用它記錄重要活動(dòng)、錯(cuò)誤和異常等的日志。
在NoSql的世界里,概念和所有流行的數(shù)據(jù)庫基本是一樣的?;旧纤谴嬖谀銠C(jī)器上某處的JSon文檔或者你可以操作的某種.NET客戶機(jī)或驅(qū)動(dòng)。NoSql的偉大之處在于它解決了關(guān)系型數(shù)據(jù)庫與OO語言如C#或Java時(shí)的一個(gè)主要缺點(diǎn):錯(cuò)配阻抗。
Redis其實(shí)和任何的NoSql數(shù)據(jù)庫一樣。但是它是一個(gè)內(nèi)存數(shù)據(jù)庫而表現(xiàn)十分出色。
簡單的說,Redis可以給你難以置信的存取你的對象狀態(tài)的能力從而使你的應(yīng)用更加快速。有時(shí)候,你的應(yīng)用速度可以優(yōu)化8到10倍。這并不是開玩笑的而且你不需要背后有Google或Facebook那樣的基礎(chǔ)設(shè)施。如果你想知道更多的關(guān)于Redis背后的思想和它的歷史的內(nèi)容,可以上網(wǎng)查找更多。有很多文章是關(guān)于這些的。
Redis代表了遠(yuǎn)程字典服務(wù)( Remote Dictionary Service) 。它是一個(gè)鍵值存儲(chǔ)就像C#的字典對象。所以讓我們看看如何使用:
首先,按照下面的步驟安裝并運(yùn)行Redis:
- 打開redis.io,下載win64版本的redis(它并不會(huì)根據(jù)你的系統(tǒng)指定相應(yīng)的版本)
- 將下載的內(nèi)容復(fù)制到Redis文件夾(你也可以命名為其他你喜歡的名字)
- 點(diǎn)擊 redis-server.exe 啟動(dòng)服務(wù)端
- 點(diǎn)擊 redis-client.exe 運(yùn)行客戶端命令行工具
- 現(xiàn)在我們試著運(yùn)行一些基本的命令來檢測安裝是否正確。在客戶端命令行界面:
- 輸入 set azul "hello world" 來添加一條記錄,你會(huì)收到ok的反饋。這意味著你已經(jīng)添加了一個(gè)鍵為azul值為"hello world"的條目(順便說下,azul在卡拜爾語中是問候的意思)
- 輸入 get azul取得相應(yīng)的值,你會(huì)收到反饋 hello world
- 輸入 delete azul會(huì)刪除這個(gè)條目
因?yàn)镽edis是一個(gè)字典,可以以如下方式保存鍵值:
復(fù)制代碼 代碼如下:
Set schedule:1 "{'origin':'Montreal','destination':'Toronto'}"
在這個(gè)示例中的值是一個(gè)json對象。這意味著你可以向Redis中添加復(fù)雜的對象。但沒必要這么做,因?yàn)镽edis支持5種數(shù)據(jù)類型以滿足你的需求。
你也可以以如下方式指定key:
復(fù)制代碼 代碼如下:
Set schedule:id 1
對于執(zhí)行多個(gè)set 和get,可以使用mset 和mget來代替。我將不再對這些命令進(jìn)行討論。你可以查看Redis文檔并盡情嘗試。
幕后
到目前為止我們所做的一切都打破了常規(guī)。但在幕后卻是Redis客戶端通過Redis協(xié)議向服務(wù)器發(fā)送指令。服務(wù)器對內(nèi)存中的數(shù)據(jù)執(zhí)行這些指令,并返回響應(yīng)結(jié)果。
做為服務(wù)的Redis
你可以在物理機(jī),虛擬機(jī)上使用Redis,也可以將Redis做為云服務(wù)。很多像Digital Ocean和Widnows Azure這類的供應(yīng)商都提供該服務(wù)。我們將從Digital Ocean開始(主要考慮到價(jià)錢,并且我認(rèn)為Azure的Redis服務(wù)有點(diǎn)貴)
我們使用PuTTY的ssh(安全連接模式)來連接到Digital Ocean。下載PuTTY并將IP地址配置為你的DO droplet地址(droplet是你在DO上創(chuàng)建的linux主機(jī))。然后啟動(dòng)PuTTY并用DO提供的root賬戶和密碼登錄。運(yùn)行以下命令以保持你的linux主機(jī)的更新:apt-get update (linux用戶現(xiàn)在很激動(dòng)吧).
現(xiàn)在你正在或已經(jīng)保持更新了。然后運(yùn)行apt-get install build-essential為你的linux服務(wù)器安裝所有缺失的工具。哦了。另外對于這些設(shè)置還有很多更詳細(xì)的博文。我不得不承認(rèn),因?yàn)槲覍inux世界不太熟悉,所以在配置的時(shí)候著實(shí)費(fèi)了翻手腳。
在 Visual Studio 中使用
在起始頁,添加一個(gè)MVC項(xiàng)目,并使用Nuget包管理器添加Servicestack.redis。這樣你就可以連接到Redis并做一些有意思的事。
你需要按以下步驟做來連接Redis并被取得緩存的對象列表。
using(IRedisClient client = RedisClient)
{
var scheduleClient= client.GetTypedClientSchedule>();
var schedules = scheduleClient.GetAll();
}
哪怕你緩存了很多對象這也是一個(gè)非??焖俚牟僮?。在Redis中緩存即用的對象是很好的想法,這免去了可能的業(yè)務(wù)處理操作(應(yīng)用規(guī)則或其他過濾和格式化操作).
數(shù)據(jù)庫中重復(fù)提取的對象(很多時(shí)候是相同的)最好放到Redis中。通常我們要在倉庫中緩存的數(shù)據(jù)(更多細(xì)節(jié)請瀏覽緩存?zhèn)}庫模式cached repository pattern)也最好放到Redis中。這樣你就可以快速取得操作結(jié)果,大幅提升Web應(yīng)用的整體性能。
注意scheduleClient將會(huì)暴露很多有關(guān)增加、添加、移除和使用列表、哈希等的函數(shù)。嘗試下探索更多。。。
你也可以設(shè)置你的Redis客戶端來看一下(不是用Glimpse-;))在添加monitor command的這種情況下發(fā)生了什么(在我們開始時(shí)添加azul的同一個(gè)地方)。
在完整的反HelloWorld應(yīng)用風(fēng)格(我承認(rèn)我是其中之一?。┑挠率颗d奮的跳向天空之前,我還應(yīng)該提醒一件事:從你的控制器連到你的數(shù)據(jù)庫(就是Redis?。┎皇莻€(gè)好主意,如果這對你來說很奇怪,我認(rèn)為你需要讀一些關(guān)于設(shè)計(jì)和架構(gòu)方面的東西。我不理解Microsoft的指導(dǎo)書讓用戶添加一個(gè)MVC項(xiàng)目,你就可以開始構(gòu)建一耳光偉大的商業(yè)web應(yīng)用了。因?yàn)椴皇沁@樣。
然而,下面是一個(gè)添加對象的例子,在這個(gè)情況下式一個(gè)調(diào)度器:
//domain object
public class Schedule
{
public int Id {get; set;}
public string Origin {get; set;}
public string Destination {get; set;}
}
using(IRedisClient client = RedisClient)
{
var scheduleClient= client.GetTypedClientSchedule>();
var schedule= new Schedule
{
Id= scheduleClient.GetNextSequence(),
Origin ="Montreal",
Destination = "Quebec"
}
var schedules = scheduleClient.Store(schedule);
}
因?yàn)镽edis是一個(gè)緩存服務(wù),是可以通過設(shè)置一個(gè)超時(shí)時(shí)間讓輸入過期。你也可以通過移除那個(gè)超時(shí)來逆向這個(gè)過程。
這僅是一個(gè)關(guān)于Redis的簡介,給你提供一個(gè)提高web引用性能的方法啟示。在某些情況下,Redis可能會(huì)給你一些你的客戶或者老板沒有給你的,關(guān)于構(gòu)建可靠軟件的激情的認(rèn)可。
希望這能幫到一些人!
您可能感興趣的文章:- Redis性能大幅提升之Batch批量讀寫詳解
- asp.net性能優(yōu)化之使用Redis緩存(入門)
- 關(guān)于redis狀態(tài)監(jiān)控和性能調(diào)優(yōu)詳解