現(xiàn)在大多數(shù)開發(fā)人員都會(huì)聽說(shuō)過(guò) Redis。Redis 是目前市場(chǎng)上最好的開源內(nèi)存 NoSQL 數(shù)據(jù)庫(kù)之一。它為前端以及后端服務(wù)(如鍵值查找,隊(duì)列,哈希等)提供了非常多的幫助。
一、什么是 Redis?
根據(jù) Redis 官方介紹,Redis 是一個(gè)開源(BSD許可),內(nèi)存數(shù)據(jù)結(jié)構(gòu)存儲(chǔ),用作數(shù)據(jù)庫(kù),緩存和消息代理,它支持字符串、哈希表、列表、集合、有序集合、位圖、hyperloglogs 等數(shù)據(jù)類型。
二、Redis 與 Memcached
Redis 是一個(gè)數(shù)據(jù)結(jié)構(gòu)服務(wù)器。作為鍵值數(shù)據(jù)存儲(chǔ),Redis 類似于 Memcached,但它比 Memcached 有兩個(gè)主要優(yōu)點(diǎn):支持更多的數(shù)據(jù)類型以及持久化。
持久化使得你可以將 Redis 當(dāng)做合法數(shù)據(jù)庫(kù)進(jìn)行操作,而不是一個(gè)不穩(wěn)定的臨時(shí)緩存。如果重新啟動(dòng),Memcached 信息將丟失; 但 Redis 數(shù)據(jù)仍然存在。
Redis 支持存儲(chǔ)多種類型數(shù)據(jù)。跟 Memcached 一樣可以使用字符串。而且你還可以處理 hash(哈希),set(所有不同值的未排序),zset(所有不同值的排序)和 list(可能包括重復(fù)的排序)。
三、Redis 如何運(yùn)作?
數(shù)據(jù)庫(kù)將數(shù)據(jù)存儲(chǔ)在磁盤或 SSD 上,而 Redis 的數(shù)據(jù)是駐留在內(nèi)存中。由于無(wú)需訪問(wèn)磁盤,Redis 等內(nèi)存數(shù)據(jù)存儲(chǔ)避免了查找時(shí)間延遲,并且可以在幾微秒內(nèi)訪問(wèn)數(shù)據(jù)。Redis 提供多種數(shù)據(jù)結(jié)構(gòu)、高可用性、地理空間、Lua 腳本、事務(wù)、磁盤持久性和群集支持,讓實(shí)時(shí)互聯(lián)網(wǎng)級(jí)應(yīng)用程序的構(gòu)建變得更加簡(jiǎn)單。
四、Redis 持久化
現(xiàn)在可以通過(guò)兩種不同的方式實(shí)現(xiàn)持久性:一種稱為快照,是一種半持久性模式,指定的時(shí)間間隔內(nèi)生成數(shù)據(jù)集的時(shí)間點(diǎn)快照,以 RDB(Redis DataBase) 轉(zhuǎn)儲(chǔ)格式編寫。從版本1.1開始,有更安全的替代方案 AOF(Append Only File),它的出現(xiàn)是為了彌補(bǔ) RDB 的不足(數(shù)據(jù)的不一致性),采用日志的形式來(lái)記錄每個(gè)寫操作并追加在文件中。
五、RDB 和 AOF ,我應(yīng)該用哪一個(gè)?
一般來(lái)說(shuō),如果想達(dá)到足以媲美 PostgreSQL 的數(shù)據(jù)安全性, 你應(yīng)該同時(shí)使用 RDB 和 AOF 兩種持久化功能。
AOF 默認(rèn)情況下,Redis 每2秒將數(shù)據(jù)寫入文件系統(tǒng),根據(jù)需求設(shè)置時(shí)間。如果在默認(rèn)設(shè)置下系統(tǒng)出現(xiàn)故障,則只會(huì)丟失幾秒鐘的數(shù)據(jù)。如果你可以承受數(shù)分鐘以內(nèi)的數(shù)據(jù)丟失, 那么你可以只使用 RDB 持久化。
有很多人會(huì)單獨(dú)使用 AOF,但是我們并不鼓勵(lì)這樣,因?yàn)闀r(shí)常進(jìn)行 RDB 快照非常方便于數(shù)據(jù)庫(kù)備份,啟動(dòng)速度也較之快,還避免了AOF 引擎的 bug。
六、常見案例
緩存 - 由于其高性能,當(dāng)讀寫操作量超過(guò)傳統(tǒng)數(shù)據(jù)庫(kù)的功能時(shí),可以通過(guò) Redis 進(jìn)行解決。由于 Redis 能夠輕松的將數(shù)據(jù)持久保存到磁盤和豐富數(shù)據(jù)類型,因此它是傳統(tǒng) Memcached 緩存解決方案的絕佳替代方案。
發(fā)布和訂閱 - 從版本 2.0 開始,Redis 提供了使用發(fā)布/訂閱消息傳遞范例分發(fā)數(shù)據(jù)的功能。
隊(duì)列 - 像 Resque 這樣的項(xiàng)目使用 Redis 作為排隊(duì)后臺(tái)作業(yè)的后端。
游戲排行榜- Redis 是尋求構(gòu)建實(shí)時(shí)排行榜的游戲開發(fā)者的熱門選擇??芍苯邮褂?Redis 有序集數(shù)據(jù)結(jié)構(gòu),此結(jié)構(gòu)實(shí)現(xiàn)了元素的唯一性,同時(shí)又可維護(hù)按用戶分?jǐn)?shù)排序的列表。你也可以使用時(shí)間戳作為分?jǐn)?shù),使用有序集處理時(shí)間序列數(shù)據(jù)。
實(shí)時(shí)分析-Redis 可作為內(nèi)存中數(shù)據(jù)存儲(chǔ),與流處理平臺(tái)(例如 Apache Kafka)搭配使用,以亞毫秒級(jí)延遲提取、處理和分析實(shí)時(shí)數(shù)據(jù)。Redis 是實(shí)時(shí)分析使用案例的理想選擇,例如社交媒體分析、廣告投放、個(gè)性化。
七、示例 Redis 基本命令
下面我簡(jiǎn)單講解 Redis-CLI 基本命令操作,默認(rèn)情況下,Redis-CLI在端口 6379 上運(yùn)行。
SET (設(shè)置密鑰)
127.0.0.1:6379> SET foo "Hello World"
OK // 設(shè)置密鑰
GET (獲取密鑰)
127.0.0.1:6379> GET foo
"Hello World" // 獲取密鑰
DEL (刪除密鑰)
127.0.0.1:6379> GET foo
"Hello World"
127.0.0.1:6379> DEL foo
(integer) 1 // 密鑰剛被刪除
127.0.0.1:6379> GET foo
(nil) // 密鑰被刪除,結(jié)果為nil。
SETEX (設(shè)置有效期限的密鑰)
127.0.0.1:6379> SETEX foo 40 "I said, Hello World!"
OK //密鑰已設(shè)置為40秒到期
TTL (密鑰的剩余時(shí)間)
127.0.0.1:6379> TTL foo
(integer) 36 //36秒超時(shí)
PERSIST (密鑰刪除期限)
127.0.0.1:6379> PERSIST foo
(integer) 1 //將密鑰轉(zhuǎn)為持久化(密鑰不會(huì)過(guò)期)
RENAME (重命名當(dāng)前現(xiàn)有密鑰)
127.0.0.1:6379> RENAME foo bar
OK // 將鍵'foo'重命名為 'bar'
FLUSHALL (清空到目前為止保存的所有內(nèi)容)
127.0.0.1:6379> flushall
OK // 刪庫(kù)跑路
八、小結(jié)
Redis 有著極其豐富的數(shù)據(jù)類型和極高性能,性能上讀的速度是110000次/s,寫的速度是81000次/s 。但是 Redis 不是萬(wàn)能的,受到物理內(nèi)存的限制,不能用作海量數(shù)據(jù)的高性能讀寫,因此 Redis 適合的場(chǎng)景主要局限在較小數(shù)據(jù)量的高性能操作和運(yùn)算上。