Redis日常運維-基礎認識

chenoracle發表於2020-07-11
引言

期參加了江老師關於Redis的培訓,加深了對Redis資料庫的理解。

●目錄●

一 redis適用場景

二 redis優勢

三 Redis資料型別

四 redis持久化

五 redis架構

●內容●

一 redis適用場景

Redis最適合所有資料in-momory的場景,雖然Redis也提供持久化功能,但實際更多的是一個disk-backed的功能,跟傳統意義上的持久化有比較大的差別,似乎Redis更像一個加強版的Memcached。

1 會話快取(Session Cache) 

最常用的一種使用Redis的情景是會話快取(session cache)。用Redis快取會話比其他儲存(如Memcached) 的優勢在於:Redis提供持久化。當維護一個不是嚴格要求一致性的快取時,如果使用者的購物車資訊全部丟失,大部分人都會不高興的。

2 佇列

Reids在記憶體儲存引擎領域的一大優點是提供 list 和 set 操作,這使得Redis能作為一個很好的訊息佇列平臺來使用。Redis作為佇列使用的操作,就類似於本地程式語言(如Python)對 list 的 push/pop 操作。

3 全頁快取

大型網際網路公司都會使用Redis作為快取儲存資料,提升頁面相應速度。即使重啟了Redis例項,因為有磁碟的持久化,使用者也不會看到頁面載入速度的下降。 

4 排行榜/計數器

Redis在記憶體中對數字進行遞增或遞減的操作實現的非常好。集合(Set)和有序集合(Sorted Set)也使得我們在執行這些操作的時候變的非常簡單。

二 Redis優勢

1 效能極高

Redis能讀的速度是110000次/s,寫的速度是81000次/s 。 

2 豐富的資料型別

Redis支援二進位制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 資料型別操作。

3 原子

Redis的所有操作都是原子性的,意思就是要麼成功執行要麼失敗完全不執行。單個操作是原子性的。多個操作也支援事務,即原子性,透過MULTI和EXEC指令包起來。

4 豐富的特性

Redis還支援 publish/subscribe, 通知, key 過期等等特性

MySQL+Memcached 演變 MySQL+Redis 

MySQL適合進行海量資料儲存的,透過Memcached將熱點資料載入到cache,加速訪問,很多公司都曾經使用過這樣的架構,但隨著業務資料量的不斷增加,和訪問量的持續增長,遇到了很多問題:

• MySQL需要不斷進行拆庫拆表,Memcached也需不斷跟著擴容,擴容和維護工作佔據大量開發時間。

• Memcached與MySQL資料庫資料一致性問題。

• Memcached資料命中率低或down機,大量訪問直接穿透到DB,MySQL無法支撐。

• 跨機房cache同步問題

如果簡單地比較Redis與Memcached的區別,大多數都會得到以下觀點:

• Redis不僅僅支援簡單的k/v型別的資料,同時還提供list,set,zset,hash等資料結構的儲存。

• Redis支援資料的備份,即master-slave模式的資料備份。

• Redis支援資料的持久化,可以將記憶體中的資料保持在磁碟中,重啟的時候可以再次載入進行使用

三 Redis資料型別

Redis支援五種資料型別:

1 string(字串)

2 hash(雜湊)

3 list(列表)

4 set(集合)

5 zset(sorted set:有序集合)

3.1 string

string 是 redis 最基本的型別,可以理解成與 Memcached 一模一樣的型別,一個 key 對應一個value。 

• string 型別是二進位制安全的。redis 的 string 可以包含任何資料。比如jpg圖片或者序列化的物件。

• string 型別是 Redis 最基本的資料型別,string 型別的值最大能儲存 512MB

• redis 127.0.0.1:6379> SET name ”keyman"

• redis 127.0.0.1:6379> GET name

應用場景

• String是最常用的一種資料型別,普通的key/value 儲存都可以歸為此類.即可以完全實現目前 Memcached 的功能,並且效率更高。還可以享受Redis的定時持久化,操作日誌及 Replication等功能。除了提供與 Memcached 一樣的get、set、incr、decr 等操作外 

• Redis還提供了下面一些操作: 

• 獲取字串長度

• 往字串append內容 

• 設定和獲取字串的某一段內容 

• 設定及獲取字串的某一位(bit)

• 批次設定一系列字串的內容 

• 實現方式:String在redis內部儲存預設就是一個字串,被redisObject所引用,當遇到incr,decr等操作時會轉成數值型進行計算,此時redisObject的encoding欄位為int

3.2 hash 

常用命令

• hget,hset,hgetall 等 

應用場景

• 在Memcached中,經常將一些結構化的資訊打包成HashMap,在客戶端序列化後儲存為一個字串的值,使用者的暱稱、年齡、性別、積分等,這時候在需要修改其中某一項時,通常需要將所有值取出反序列化後,修改某一項的值,再序列化儲存回去。這樣不僅增大了開銷,也不適用於一些可能併發操作的場合(比如兩個併發的操作都需要修改積分)。而Redis的Hash結構可以使你像在資料庫中Update一個屬性一樣只修改某一項屬性值。

3.3 list

常用命令

• lpush、rpush、lpop、rpop、lrange

應用場景

• Redis list的應用場景非常多,也是Redis最重要的資料結構之一,比如twitter的關注列表,粉絲列表等都可以用Redis的list結構來實現。

• Lists 就是連結串列,相信略有資料結構知識的人都應該能理解其結構。使用Lists結構,可以輕鬆地實現最新訊息排行等功能。Lists的另一個應用就是訊息佇列,

• 可以利用Lists的PUSH操作,將任務存在Lists中,然後工作執行緒再用POP操作將任務取出進行執行。

Redis還提供了操作Lists中某一段的api,可以直接查詢,刪除Lists中某一段的元素

3.4 set

常用命令

• sadd、spop、smembers、sunion 等 

應用場景:

• Redis set對外提供的功能與list類似是一個列表的功能,特殊之處在於set是可以自動排重的,當你需要儲存一個列表資料,又不希望出現重複資料時,set 是一個很好的選擇,並且set提供了判斷某個成員是否在一個set集合內的重要介面,這個也是list所不能提供的。

• Sets 集合的概念就是一堆不重複值的組合。利用Redis提供的Sets資料結構,可以儲存一些集合性的資料,比如在微博應用中,可以將一個使用者所有的關注人存在一個集合中,將其所有粉絲存在一個集合。Redis還為集合提供了求交集、並集、差集等操作,可以非常方便的實現如共同關注、共同喜好、二度好友等功能,對上面的所有集合操作,你還可以使用不同的命令選擇將結果返回給客戶端還是存集到一個新的集合中

3.5 sort set 

常用命令:

• zadd,zrange,zrem,zcard等 

使用場景

• Redis sorted set的使用場景與set類似,區別是set不是自動有序的,而sorted set可以透過使用者額外提供一個優先順序(score)的引數來為成員排序,並且是插入有序的,即自動排序。當你需要一個有序的並且不重複的集合列表,那麼可以選擇sorted set資料結構,比如twitter 的public timeline可以以發表時間作為score來儲存,這樣獲取時就是自動按時間排好序的。

• 另外還可以用Sorted Sets來做帶權重的佇列,比如普通訊息的score為1,重要訊息的score為2,然後工作執行緒可以選擇按score的倒序來獲取工作任務。讓重要的任務優先執行

四 redis持久化

Redis 是記憶體型資料庫,為了保證資料在斷電後不會丟失,需要將記憶體中的資料持久化到硬碟上。

Redis提供了兩種持久化的方式

• RDB(Redis DataBase) 

• AOF(Append Only File)

4.1 RDB 

在不同的時間點,將redis儲存的資料生成快照並儲存到磁碟等介質上,可以將快照複製到其他伺服器從而建立具有相同資料的伺服器副本。如果系統發生故障,將會丟失最後一次建立快照之後的資料。如果資料量大,儲存快照的時間會很長。

4.2 AOF 

換了一個角度來實現持久化,那就是將redis執行過的所有寫指令記錄下來,在下次redis重新啟動時,只要把這些寫指令從前到後再重複執行一遍,就可以實現資料恢復了。將寫命令新增到 AOF 檔案(append only file)末尾。

五 redis架構

5.1 單機

5.2 主從

5.3 哨兵

5.4 叢集

5.3 哨兵

哨兵的出現主要是解決了主從複製出現故障時需要人為干預的問題。

哨兵主要功能

• 叢集監控:負責監控Redis master和slave程式是否正常工作

• 訊息通知:如果某個Redis例項有故障,那麼哨兵負責傳送訊息作為報警通知給管理員 

• 故障轉移:如果master node掛掉了,會自動轉移到slave node上 

• 配置中心:如果故障轉移發生了,通知client客戶端新的master地址

5.4 叢集 

即使使用哨兵,redis每個例項也是全量儲存,每個redis儲存的內容都是完整的資料,浪費記憶體且有木桶效應。

為了最大化利用記憶體,可以採用叢集,就是分散式儲存。

即每臺redis儲存不同的內容,共有16384個slot。

每個redis分得一些slot,hash_slot = crc16(key) mod 16384 找到對應slot。

叢集至少需要3主3從,且每個例項使用不同的配置檔案,主從不用配置,叢集會自己選。

• 高可用性:在主機掛掉後,自動故障轉移,使前端服務對使用者無影響。 

• 讀寫分離:將主機讀壓力分流到從機上。 

• 可在客戶端元件上實現負載均衡,根據不同伺服器的執行情況,分擔不同比例的讀請求壓力

歡迎關注我的微信公眾號"IT小Chen",共同學習,共同成長!!!

Redis日常運維-基礎認識




來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29785807/viewspace-2703895/,如需轉載,請註明出處,否則將追究法律責任。

相關文章