redis學習(一)

來源:互聯網
上載者:User

標籤:

一.redis簡介

Redis是基於記憶體、可持久化的日誌型、key-value高效能儲存系統。關鍵字(Keys)是用來標識資料區塊。值(Values)是關聯於關鍵字的實際值,可以是任何東西。有時候你會儲存字串,有時候是整數,還有時候你會儲存序列化對象(使用JSON、XML等)。在大多數情況下,Redis會把值看做是一個位元組序列,而不會關注它們實質上是什麼。

Redis支援儲存的value類型:string(字串)、hash(散列)、list(鏈表)、set(集合)和zset(有序集合)。這些資料類型都支援push/pop、add/remove及取交集並集和差集等更多操作,而且這些操作都是原子性的。redis支援不同方式的排序。為了保證效率,資料都是緩衝在記憶體中。redis會周期性的把更新的資料寫入磁碟或者把操作寫入追加的記錄檔案,並在此基礎上實現了master-slaver(主從)同步。 

Redis主要用於緩衝、資料持久化、訊息佇列等,資料不是一直儲存在記憶體中,這是不同於memcached的地方。Redis只緩衝所有的Key的資訊,如果記憶體的使用量超過某一閾值,將觸發swap的操作,會將部分key對應的value持久化到磁碟中,同時在記憶體中清除。這種特性使得Redis可以保持超過其機器本身記憶體大小的資料。當 從Redis中讀取資料的時候,如果讀取的key對應的value不在記憶體中,那麼Redis就需要從swap檔案中載入相應資料,然後再返回給請求方,這就存在一個I/O線程池的問題,預設會發生阻塞的情況。所以,Redis使用的最佳方式是全部資料都在記憶體中。

 二.redis支援的資料結構1.字串(Strings)

我們已經看到了一個常見的字串使用案例,即通過關鍵字儲存物件的執行個體。有時候,你會頻繁地用到這類操作:

set users:leto "{name: leto, planet: dune, likes: [spice]}"
Redis還有一些常用的操作。例如, strlen <key>能用來擷取一個關鍵字對應值的長度; getrange <key> <start> <end>將返回指定範圍內的關鍵字對應值; append <key> <value>會將value附加到已存在的關鍵字對應值中(如果該關鍵字並不存在,則會建立一個新的關鍵字-值對)。 2.散列(Hashes)

散列資料結構很像字串資料結構。兩者顯著的區別在於,散列資料結構提供了一個額外的間接層:一個域(Field)。因此,散列資料結構中的setget是:

hset users:goku powerlevel 9000hget users:goku powerlevel

相關的操作還包括在同一時間設定多個域、同一時間擷取多個域、擷取所有的域和值、列出所有的域或者刪除指定的一個域:

hmset users:goku race saiyan age 737hmget users:goku race powerlevelhgetall users:gokuhkeys users:gokuhdel users:goku age
如你所見,散列資料結構比普通的字串資料結構具有更多的可操作性。我們可以使用一個散列資料結構去獲得更精確的描述,是儲存一個使用者,而不是一個序列化對象。從而得到的好處是能夠提取、更新和刪除具體的資料片段,而不必去擷取或寫入整個值。 3.列表(Lists)

對於一個給定的關鍵字,列表資料結構讓你可以儲存和處理一組值。你可以添加一個值到列表裡、擷取列表的第一個值或最後一個值以及用給定的索引來處理值。列表資料結構維護了值的順序,提供了基於索引的高效操作。為了跟蹤在網站裡註冊的最新使用者,我們可以維護一個newusers的列表:

lpush newusers gokultrim newusers 0 50
(譯註:ltrim命令的具體構成是LTRIM Key start stop。要理解ltrim命令,首先要明白Key所儲存的值是一個列表,理論上列表可以存放任意個值。對於指定的列表,根據所提供的兩個範圍參數start和stop,ltrim命令會將指定範圍外的值都刪除掉,只留下範圍內的值。) 4.集合(Sets)

集合資料結構常常被用來儲存只能唯一存在的值,並提供了許多的基於集合的操作,例如並集。集合資料結構沒有對值進行排序,但是其提供了高效的基於值的操作。使用集合資料結構的典型用例是朋友名單的實現:

sadd friends:leto ghanima paul chani jessicasadd friends:duncan paul jessica alia

不管一個使用者有多少個朋友,我們都能高效地(O(1)時間複雜度)識別出使用者X是不是使用者Y的朋友:

sismember friends:leto jessicasismember friends:leto vladimir

而且,我們可以查看兩個或更多的人是不是有共同的朋友:

sinter friends:leto friends:duncan

甚至可以在一個新的關鍵字裡儲存結果:

sinterstore friends:leto_duncan friends:leto friends:duncan
 5.分類集合(Sorted Sets)分類集合資料結構就類似於集合資料結構,主要區分是標記(score)的概念。

標記提供了排序(sorting)和秩劃分(ranking)的功能。如果我們想要一個秩分類的朋友名單,可以這樣做:

zadd friends:duncan 70 ghanima 95 paul 95 chani 75 jessica 1 vladimir

對於duncan的朋友,要怎樣計算出標記(score)為90或更高的人數?

zcount friends:duncan 90 100

如何擷取chani在名單裡的秩(rank)?

zrevrank friends:duncan chani

(譯註:zrank命令的具體構成是ZRANK Key menber,要知道Key儲存的Sorted Set預設是根據Score對各個menber進行升序的排列,該命令就是用來擷取menber在該排列裡的次序,這就是所謂的秩。)

我們使用了 zrevrank命令而不是 zrank命令,這是因為Redis的預設排序是從低到高,但是在這個例子裡我們的秩劃分是從高到低。對於分類集合資料結構,最常見的應用案例是用來實現熱門排行榜系統。 三.redis應用背景1.效能需求, 隨著讀操作的量的上升需要解決,經曆的過程有: 資料庫讀寫分離(M/S)–>資料庫使用多個Slave–>增加Cache (memcache)–>轉到Redis
2.解決寫的問題: 水平分割,對錶的拆分,將有的使用者放在這個表,有的使用者放在另外一個表;
3.可靠性需求 :Cache的"雪崩"問題讓人糾結,Cache面臨著快速恢複的挑戰;
4.開發成本需求 :Cache和DB的一致性維護成本越來越高(先清理DB, 再清理緩衝, 不行啊, 太慢了!) 
5.開發需要跟上不斷湧入的產品需求 :硬體成本最貴的就是資料庫層面的機器,基本上比前端的機器要貴幾倍,主要是IO密集型,很耗硬體;
6.維護性複雜 :一致性維護成本越來越高; 
7.BerkeleyDB使用B樹,會一直寫新的,內部不會有檔案重新組織;這樣會導致檔案越來越大;大的時候需要進行檔案歸檔,歸檔的操作要定期做; 
這樣,就需要有一定的down time;

四.redis效能特點

1.豐富的資料支援;

2.主要用來儲存少量資料,支援超過 100K+ 每秒的讀寫頻率;3.Redis支援資料的備份,即master-slave模式的資料備份(主從複製);4.redis支援原子操作,5.使用分布式redis實現海量資料存放區,保證資料一致性;6.豐富的特性:Redis還支援 publish/subscribe, 通知, key 到期等特性。  

redis學習(一)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.