您好,登錄后才能下訂單哦!
近 期參加了江老師關于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",共同學習,共同成長!!!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。