天天看點

Redis實戰(1)入門和适用場合

Redis 是一個 Key-Value 存儲系統。和 Memcached 類似,它支援存儲的 value 類型相對更多,

包括 string(字元串)、list(連結清單)、set(集合)和 zset(有序集合)。這些資料類型都支援 push/pop、

add/remove 及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎

上,Redis 支援各種不同方式的排序。與 memcached 一樣,為了保證效率,資料都是緩存在

記憶體中。差別的是 Redis 會周期性的把更新的資料寫入磁盤或者把修改操作寫入追加的記錄

檔案,并且在此基礎上實作了 master-slave(主從)同步。

一、初識 Redis

Redis 是一個開源的使用 ANSI C 語言編寫、支援網絡、可基于記憶體亦可持久化的日志型、

Key-Value 資料庫,并提供多種語言的 API。 

1、資料類型:

作為 Key-value 型資料庫,Redis 也提供了鍵(Key)和鍵值(Value)的映射關系。但是,除

了正常的數值或字元串,Redis 的鍵值還可以是以下形式之一:

Lists (清單)

Sets (集合)

Sorted sets (有序集合)

Hashes (哈希表)

鍵值的資料類型決定了該鍵值支援的操作。Redis 支援諸如清單、集合或有序集合的交集、

并集、查集等進階原子操作;同時,如果鍵值的類型是普通數字,Redis 則提供自增等原子操作。

2、持久化:

通常,Redis 将資料存儲于記憶體中,或被配置為使用虛拟記憶體。通過兩種方式可以實作資料持久化:

使用截圖的方式,将記憶體中的資料不斷寫入磁盤;

或使用類似 MySQL 的日志方式,記錄每次更新的日志。

前者性能較高,但是可能會引起一定程度的資料丢失;後者相反。

3、主從同步

Redis 支援将資料同步到多台從庫上,這種特性對提高讀取性能非常有益。

4、性能

相比需要依賴磁盤記錄每個更新的資料庫,基于記憶體的特性無疑給 Redis 帶來了非常優秀的性能。讀寫操作之間有顯著的性能差異。

二、适用場合

利用 Redis 靈活多變的資料結構和資料操作,Redis 适用的一些場景:

1、取最新 N 個資料的操作

比如典型的取你網站的最新文章,通過下面方式,我們可以将最新的 5000 條評論的 ID 放在

Redis 的 List 集合中,并将超出集合部分從資料庫擷取。

使用 LPUSH latest.comments<ID>指令,向 list 集合中插入資料

插入完成後再用 LTRIM latest.comments 0 5000 指令使其永遠隻儲存最近 5000 個 ID。

如果你還有不同的篩選次元,比如某個分類的最新 N 條,那麼你可以再建一個按此分類的

List,隻存 ID 的話,Redis 是非常高效的。

2、排行榜應用,取 TOP N 操作

這個需求與上面需求的不同之處在于,前面操作以時間為權重,這個是以某個條件為權重,

比如按頂的次數排序,

這時候就需要我們的 sorted set 出馬了,

将你要排序的值設定成 sorted

set 的 score,将具體的資料設定成相應的 value,每次隻需要執行一條 ZADD 指令即可。

3、需要精準設定過期時間的應用

比如你可以把上面說到的 sorted set 的 score 值設定成過期時間的時間戳,那麼就可以簡單

地通過過期時間排序,定時清除過期資料了,不僅是清除 Redis 中的過期資料,你完全可以

把 Redis 裡這個過期時間當成是對資料庫中資料的索引,用 Redis 來找出哪些資料需要過期

删除,然後再精準地從資料庫中删除相應的記錄。

4、計數器應用

Redis 的指令都是原子性的,你可以輕松地利用 INCR,DECR 指令來建構計數器系統。

5、Uniq 操作,擷取某段時間所有資料排重值

這個使用 Redis 的 set 資料結構最合适了,隻需要不斷地将資料往 set 中扔就行了,set 意為

集合,是以會自動排重。

6、實時系統,反垃圾系統

通過上面說到的 set 功能,你可以知道一個終端使用者是否進行了某個操作,可以找到其操作

的集合并進行分析統計對比等。沒有做不到,隻有想不到。

7、Pub/Sub 建構實時消息系統

Redis 的 Pub/Sub 系統可以建構實時的消息系統,比如很多用 Pub/Sub 建構的實時聊天系統

的例子。

8、建構隊列系統

使用 list 可以建構隊列系統,使用 sorted set 甚至可以建構有優先級的隊列系統。

9、緩存

這個不必說了,性能優于 Memcached,資料結構更多樣化。

本文轉自shayang8851CTO部落格,原文連結:http://blog.51cto.com/janephp/1335633,如需轉載請自行聯系原作者