數(shù)據(jù)優(yōu)化技術(shù)redis視頻教程-5月26號(hào)解決文件并發(fā)_第1頁
數(shù)據(jù)優(yōu)化技術(shù)redis視頻教程-5月26號(hào)解決文件并發(fā)_第2頁
數(shù)據(jù)優(yōu)化技術(shù)redis視頻教程-5月26號(hào)解決文件并發(fā)_第3頁
數(shù)據(jù)優(yōu)化技術(shù)redis視頻教程-5月26號(hào)解決文件并發(fā)_第4頁
數(shù)據(jù)優(yōu)化技術(shù)redis視頻教程-5月26號(hào)解決文件并發(fā)_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

Redis簡介Redis是一個(gè)開源的,使用C語言編寫,面向“鍵/值”對(duì)類型數(shù)據(jù)的分布式NoSQL數(shù)據(jù)庫系統(tǒng),特點(diǎn)是高性能,持久 ,適應(yīng)高并發(fā)的應(yīng)用場景。Redis純粹為應(yīng)用而產(chǎn)生,它是一個(gè)高性能的key-value數(shù)據(jù)庫,并且提供了多種語言的API性能 表示SET操作每秒鐘可達(dá)110000次,GET操作每秒81000次(當(dāng)然不同的服務(wù)器配置性能不同)。redis目前提供五種數(shù)據(jù)類型:string(字符串),list(鏈表),Hash(哈希),set(集合)及zset(sortedset)(有序集合)Redis的 分為內(nèi)存 、磁盤

.從這一點(diǎn),也說明了Redis與Memcached是有區(qū)別的。Redis

與Memcached一樣,為了保證效率,數(shù)據(jù)都是緩存在內(nèi)存中。區(qū)別的是redis會(huì)周期性的把更新的數(shù)據(jù)寫入磁盤或者把修改

操作寫入追加的記錄文件,并且在此基礎(chǔ)上實(shí)現(xiàn)了master-slave(主從)同步。Redis安裝Redis:

/dmajkic/redis/downloads將服務(wù)程序拷貝到一個(gè)磁盤上的打開一個(gè)cmd窗口,使用cd命令切換到指定行redis-server.exe

redis.conf(F:\Redis)運(yùn)重新打開一個(gè)cmd窗口,使用cd命令切換到指定

(F:\Redis)運(yùn)行

redis-cli.exe-h

127.0.0.1-p

6379,其中

127.0.0.1是本地ip,6379是redis服務(wù)端的默認(rèn)端口

(這樣可以開啟一個(gè)客戶端程序進(jìn)行特殊指令的測試).可以將此服務(wù)設(shè)置為windows系統(tǒng)服務(wù),

Redis服務(wù)安裝軟件,安裝即可。(

/rgl/redis/downloads

)接下來在使用Redis時(shí),還需要

C#驅(qū)動(dòng)。Redis常用數(shù)據(jù)類型使用Redis,不用在面對(duì)功能單調(diào)的數(shù)據(jù)庫時(shí),把精力放在如何把大象放進(jìn)冰箱這樣的問題上,而是利用Redis靈活多變的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)操作,為不同的大象構(gòu)建不同的冰箱。Redis最為常用的數(shù)據(jù)類型主要有以下五種:StringHashListSetSorted

setString類型String是最常用的一種數(shù)據(jù)類型,普通的key/value

都可以歸為此類

。一個(gè)Key對(duì)應(yīng)一個(gè)Value,string類型是二進(jìn)制安全的。Redis的string可以包含任何數(shù)據(jù),比如jpg

(生成二進(jìn)制)或者序列化的對(duì)象。基本操作如下:var

client

=

new

RedisClient("127.0.0.1",

6379);client.Set<int>("pwd",

1111);int

pwd=client.Get<int>("pwd");Console.Wri

ine(pwd);Hash類型hash是一個(gè)string

類型的field和value的

表。hash特別適合一個(gè)對(duì)象對(duì)象。相對(duì)于將對(duì)象的每個(gè)字段存成單個(gè)string

類型。在hash類型中會(huì)占用更少的內(nèi)存,并且可以更方便的存取整個(gè)對(duì)象。作為一個(gè)keyvalue存在,很多開發(fā)者自然的使用set/get方式來使用Redis,實(shí)際上這并不是最優(yōu)化的使用方法。尤其在未啟用VM情況下,Redis全部數(shù)據(jù)需要放入內(nèi)存,節(jié)約內(nèi)存尤其重要.增加了序列化/反序列化的開銷,并且在需要修改其中一項(xiàng)信息時(shí),需要把整個(gè)對(duì)象取回Key仍然是用戶ID,value是一個(gè)Map,這個(gè)Map的key是成員的屬性名,value是屬性值,這樣對(duì)數(shù)據(jù)的修改和存取都可以直接通過其

Map的Key(Redis里稱過key(用戶ID)+field(屬性Map的key為field),也就是通)就可以操作對(duì)應(yīng)屬性數(shù)據(jù)了,既不需要重復(fù)

數(shù)據(jù),也不會(huì)帶來序列化和一個(gè)key可對(duì)應(yīng)多個(gè)field,一個(gè)field對(duì)應(yīng)一個(gè)value這里同時(shí)需要注意,Redis提供了接口(hgetall)可以直接取到全部的屬性數(shù)據(jù),但是如果

Map的成員很多,那么涉及到遍歷整個(gè)內(nèi)部Map的操作,由于Redis單線程模型的緣故,這個(gè)遍歷操作可能會(huì)比較耗時(shí),而另其它客戶端的請(qǐng)求完全不響應(yīng),這點(diǎn)需要格外注意建議使用對(duì)象類別和ID構(gòu)成鍵名,使用字段表示對(duì)象屬性,字段值

屬性值,例如:car:2price

500List類型

list是一個(gè)鏈表結(jié)構(gòu),主要功能是push,pop,獲取一個(gè)范圍的所有的值等,操作中key理解為鏈表名字。

Redis的list類型其實(shí)就是一個(gè)每個(gè)子元素都是string類型的雙向鏈表。

可以通過

push,pop操作從鏈表的頭部或者尾部添加刪除元素,這樣list既可以作為棧,又可以作為隊(duì)列。Redis

list的實(shí)現(xiàn)為一個(gè)雙向鏈表,即可以支持反向查找和遍歷,更方便操作,不過帶來了部分額外的內(nèi)存開銷,Redis

的很多實(shí)現(xiàn),包括發(fā)送緩沖隊(duì)列等也都是用的這個(gè)數(shù)據(jù)結(jié)構(gòu)隊(duì)列使用client.EnqueueItemOnList("name",

"zhangsan");client.EnqueueItemOnList("name",

"lisi");int

count=

client.GetListCount("name");for

(int

i

=

0;

i

<

count;

i++){Console.Wri

ine(client.DequeueItemFromList("name"));}//棧使用client.PushItemToList("name2",

"wangwu");client.PushItemToList("name2",

"maliu");

int

count

=

client.GetListCount("name2");for

(int

i

=

0;

i

<

count;

i++){Console.Wri

ine(client.PopItemFromList("name2"));}Set類型它是string類型的無序集合。set是通過hash

table實(shí)現(xiàn)的,添加,刪除和查找,對(duì)集合 可以取并集,交集,差集.//對(duì)Set類型進(jìn)行操作client.AddItemToSet("a3",

"ddd");client.AddItemToSet("a3","ccc");client.AddItemToSet("a3","tttt");client.AddItemToSet("a3","sssh");client.AddItemToSet("a3","hhhh");System.Collections.Generic.HashSet<string>hashset=client.GetAllItemsFromSet("a3");foreach

(string

str

inhashset){Console.Wri

ine(str);}求并集client.AddItemToSet("a3",

"ddd");client.AddItemToSet("a3",

"ccc");client.AddItemToSet("a3",

"tttt");client.AddItemToSet("a3",

"sssh");client.AddItemToSet("a3",

"hhhh");client.AddItemToSet("a4",

"hhhh");client.AddItemToSet("a4",

"h777");System.Collections.Generic.HashSet<string>hashset=client.GetUnionFromSets(new

string[]

{

"a3","a4"});foreach

(string

strinhashset){Console.Wri

ine(str);}求交集System.Collections.Generic.HashSet<string>

hashset

=client.GetIntersectFromSets(new

string[]

{

“a3”,

“a4”

});求差集.System.Collections.Generic.HashSet<string>hashset

=client.GetDifferencesFromSet("a3",new

string[]

{

"a4"});返回存在于第一個(gè)集合,但是不存在于其他集合的數(shù)據(jù)。差集Sorted

Set類型sorted

set

是set的一個(gè)升級(jí)版本,它在set的基礎(chǔ)上增加了一個(gè)順序的屬性,這一屬性在添加修改

.元素的時(shí)候可以指定,每次指定后,zset(表示有序集合)會(huì)自動(dòng)重新按新的值調(diào)整順序。可以理解為有列的表,一列存

value,一列存順序。操作中key理解為zset的名字.Redis

sortedset的使用場景與set類似,區(qū)別是set不是自動(dòng)有序的,而sorted

set可以通過用戶額外提供一個(gè)優(yōu)先級(jí)(score)的參數(shù)來為成員排序,并且是

有序的,即自動(dòng)排序。當(dāng)你需要一個(gè)有序的并且不重復(fù)的集合列表,那么可以選擇sortedset數(shù)據(jù)結(jié)構(gòu),client.AddItemToSortedSet("a5",

"ffff");client.AddItemToSortedSet("a5","bbbb");client.AddItemToSortedSet("a5",

"gggg");client.AddItemToSortedSet("a5",

"cccc");client.AddItemToSortedSet("a5",

"waaa");System.Collections.Generic.List<string>

list=client.GetAllItemsFromSortedSet("a5");foreach

(string

str

in

list){Console.Wri

ine(str);}文件并發(fā)(日志處理)多線程操作同一個(gè)文件時(shí)會(huì)出現(xiàn)并發(fā)問題。解決的一個(gè)辦法就是給文件加鎖(lock),但是這樣的話,一個(gè)線程操作文件時(shí),其它的都得等待,這樣的話性能非常差。另外一個(gè)解決方案,就是先將數(shù)據(jù)放在隊(duì)列中,然后開啟一個(gè)線程,負(fù)責(zé)從隊(duì)列中取出數(shù)據(jù),再寫到文件中。下面

講解一個(gè)實(shí)際項(xiàng)目中應(yīng)用的案例,關(guān)于日志的處理.Log4NetLog4Net是用來記錄日志的,可以將程序運(yùn)行過程中的信息輸出到一些地方(文件、數(shù)據(jù)庫、EventLog等),日志就是程序的黑匣子,可以通過日志查看系統(tǒng)的運(yùn)行過程,從而發(fā)現(xiàn)系統(tǒng)的問題。日志的作用:將運(yùn)行過程的步驟、成功失敗記錄下來,將關(guān)鍵性的數(shù)據(jù)記錄下來分析系統(tǒng)問題所在。Log4J。對(duì)于

來講,不能把異常信息顯示給用戶,異常信息只能記錄到日志,出了問題把日志文件發(fā)給開發(fā)

,就能知道問題所在。配置Log4Net環(huán)境(1)新建一個(gè)WebApplication2)添加對(duì)log4net.dll的 (bin\net\2.0\release

不能版本)(把相應(yīng)的dll文件拷貝到項(xiàng)目中的lib文件夾下。)(3)在Web.Config

(或App.Config)添加配置,見備注(4)初始化:在程序最開始加入log4net.Config.XmlConfigurator.Configure()debug在要打印日志的地方LogManager.GetLogger(typeof(Program)).Debug(“信息”);。通過LogManager.GetLogger傳遞要記錄的日志類類名獲得這個(gè)類的ILog(這樣在日志文件中就能看到這條日志是哪個(gè)類輸出的了),然后調(diào)用Debug方法輸出消息。因?yàn)橐粋€(gè)類

不止一個(gè)地方要打印日志,所以一般把ILog

為一個(gè)static字段。Privatestatic

ILog

logger=LogManager.GetLogger(typeof(Test))輸出錯(cuò)誤信息用ILog.Error方法,第二個(gè)參數(shù)可以傳遞Exception對(duì)象。log.Error("***錯(cuò)誤"+ex),log.Error("***錯(cuò)誤",ex)Appender:可以將日志輸出到不同的地方,不同的輸出目標(biāo)對(duì)應(yīng)不同的Appender:RollingFileAppender(滾動(dòng)文件)、AdoNetAppender(數(shù)據(jù)庫)、SmtpAppender

(郵件)等。level(級(jí)別):標(biāo)識(shí)這條日志信息的重要級(jí)別None>Fatal>ERROR>WARN>DEBUG>INFO>ALL,設(shè)定一個(gè)Level,那么低于這個(gè)Level的日志是不會(huì)被寫到Appender中的.Log4Net還可以設(shè)定多個(gè)Appender,可以實(shí)現(xiàn)同時(shí)將日志記錄到文件、數(shù)據(jù)、發(fā)送郵件

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論