溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Redis日常運(yùn)維-基礎(chǔ)認(rèn)識(shí)

發(fā)布時(shí)間:2020-08-11 17:15:39 來(lái)源:ITPUB博客 閱讀:190 作者:chenoracle 欄目:關(guān)系型數(shù)據(jù)庫(kù)
引言

期參加了江老師關(guān)于Redis的培訓(xùn),加深了對(duì)Redis數(shù)據(jù)庫(kù)的理解。

●目錄●

一 redis適用場(chǎng)景

二 redis優(yōu)勢(shì)

三 Redis數(shù)據(jù)類型

四 redis持久化

五 redis架構(gòu)

●內(nèi)容●

一 redis適用場(chǎng)景

Redis最適合所有數(shù)據(jù)in-momory的場(chǎng)景,雖然Redis也提供持久化功能,但實(shí)際更多的是一個(gè)disk-backed的功能,跟傳統(tǒng)意義上的持久化有比較大的差別,似乎Redis更像一個(gè)加強(qiáng)版的Memcached。

1 會(huì)話緩存(Session Cache) 

最常用的一種使用Redis的情景是會(huì)話緩存(session cache)。用Redis緩存會(huì)話比其他存儲(chǔ)(如Memcached) 的優(yōu)勢(shì)在于:Redis提供持久化。當(dāng)維護(hù)一個(gè)不是嚴(yán)格要求一致性的緩存時(shí),如果用戶的購(gòu)物車信息全部丟失,大部分人都會(huì)不高興的。

2 隊(duì)列

Reids在內(nèi)存存儲(chǔ)引擎領(lǐng)域的一大優(yōu)點(diǎn)是提供 list 和 set 操作,這使得Redis能作為一個(gè)很好的消息隊(duì)列平臺(tái)來(lái)使用。Redis作為隊(duì)列使用的操作,就類似于本地程序語(yǔ)言(如Python)對(duì) list 的 push/pop 操作。

3 全頁(yè)緩存

大型互聯(lián)網(wǎng)公司都會(huì)使用Redis作為緩存存儲(chǔ)數(shù)據(jù),提升頁(yè)面相應(yīng)速度。即使重啟了Redis實(shí)例,因?yàn)橛写疟P的持久化,用戶也不會(huì)看到頁(yè)面加載速度的下降。 

4 排行榜/計(jì)數(shù)器

Redis在內(nèi)存中對(duì)數(shù)字進(jìn)行遞增或遞減的操作實(shí)現(xiàn)的非常好。集合(Set)和有序集合(Sorted Set)也使得我們?cè)趫?zhí)行這些操作的時(shí)候變的非常簡(jiǎn)單。

二 Redis優(yōu)勢(shì)

1 性能極高

Redis能讀的速度是110000次/s,寫(xiě)的速度是81000次/s 。 

2 豐富的數(shù)據(jù)類型

Redis支持二進(jìn)制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數(shù)據(jù)類型操作。

3 原子

Redis的所有操作都是原子性的,意思就是要么成功執(zhí)行要么失敗完全不執(zhí)行。單個(gè)操作是原子性的。多個(gè)操作也支持事務(wù),即原子性,通過(guò)MULTI和EXEC指令包起來(lái)。

4 豐富的特性

Redis還支持 publish/subscribe, 通知, key 過(guò)期等等特性

MySQL+Memcached 演變 MySQL+Redis 

MySQL適合進(jìn)行海量數(shù)據(jù)存儲(chǔ)的,通過(guò)Memcached將熱點(diǎn)數(shù)據(jù)加載到cache,加速訪問(wèn),很多公司都曾經(jīng)使用過(guò)這樣的架構(gòu),但隨著業(yè)務(wù)數(shù)據(jù)量的不斷增加,和訪問(wèn)量的持續(xù)增長(zhǎng),遇到了很多問(wèn)題:

? MySQL需要不斷進(jìn)行拆庫(kù)拆表,Memcached也需不斷跟著擴(kuò)容,擴(kuò)容和維護(hù)工作占據(jù)大量開(kāi)發(fā)時(shí)間。

? Memcached與MySQL數(shù)據(jù)庫(kù)數(shù)據(jù)一致性問(wèn)題。

? Memcached數(shù)據(jù)命中率低或down機(jī),大量訪問(wèn)直接穿透到DB,MySQL無(wú)法支撐。

? 跨機(jī)房cache同步問(wèn)題

如果簡(jiǎn)單地比較Redis與Memcached的區(qū)別,大多數(shù)都會(huì)得到以下觀點(diǎn):

? Redis不僅僅支持簡(jiǎn)單的k/v類型的數(shù)據(jù),同時(shí)還提供list,set,zset,hash等數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)。

? Redis支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。

? Redis支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保持在磁盤中,重啟的時(shí)候可以再次加載進(jìn)行使用

三 Redis數(shù)據(jù)類型

Redis支持五種數(shù)據(jù)類型:

1 string(字符串)

2 hash(哈希)

3 list(列表)

4 set(集合)

5 zset(sorted set:有序集合)

3.1 string

string 是 redis 最基本的類型,可以理解成與 Memcached 一模一樣的類型,一個(gè) key 對(duì)應(yīng)一個(gè)value。 

? string 類型是二進(jìn)制安全的。redis 的 string 可以包含任何數(shù)據(jù)。比如jpg圖片或者序列化的對(duì)象。

? string 類型是 Redis 最基本的數(shù)據(jù)類型,string 類型的值最大能存儲(chǔ) 512MB

? redis 127.0.0.1:6379> SET name ”keyman"

? redis 127.0.0.1:6379> GET name

應(yīng)用場(chǎng)景

? String是最常用的一種數(shù)據(jù)類型,普通的key/value 存儲(chǔ)都可以歸為此類.即可以完全實(shí)現(xiàn)目前 Memcached 的功能,并且效率更高。還可以享受Redis的定時(shí)持久化,操作日志及 Replication等功能。除了提供與 Memcached 一樣的get、set、incr、decr 等操作外 

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

? 獲取字符串長(zhǎng)度

? 往字符串a(chǎn)ppend內(nèi)容 

? 設(shè)置和獲取字符串的某一段內(nèi)容 

? 設(shè)置及獲取字符串的某一位(bit)

? 批量設(shè)置一系列字符串的內(nèi)容 

? 實(shí)現(xiàn)方式:String在redis內(nèi)部存儲(chǔ)默認(rèn)就是一個(gè)字符串,被redisObject所引用,當(dāng)遇到incr,decr等操作時(shí)會(huì)轉(zhuǎn)成數(shù)值型進(jìn)行計(jì)算,此時(shí)redisObject的encoding字段為int

3.2 hash 

常用命令

? hget,hset,hgetall 等 

應(yīng)用場(chǎng)景

? 在Memcached中,經(jīng)常將一些結(jié)構(gòu)化的信息打包成HashMap,在客戶端序列化后存儲(chǔ)為一個(gè)字符串的值,用戶的昵稱、年齡、性別、積分等,這時(shí)候在需要修改其中某一項(xiàng)時(shí),通常需要將所有值取出反序列化后,修改某一項(xiàng)的值,再序列化存儲(chǔ)回去。這樣不僅增大了開(kāi)銷,也不適用于一些可能并發(fā)操作的場(chǎng)合(比如兩個(gè)并發(fā)的操作都需要修改積分)。而Redis的Hash結(jié)構(gòu)可以使你像在數(shù)據(jù)庫(kù)中Update一個(gè)屬性一樣只修改某一項(xiàng)屬性值。

3.3 list

常用命令

? lpush、rpush、lpop、rpop、lrange

應(yīng)用場(chǎng)景

? Redis list的應(yīng)用場(chǎng)景非常多,也是Redis最重要的數(shù)據(jù)結(jié)構(gòu)之一,比如twitter的關(guān)注列表,粉絲列表等都可以用Redis的list結(jié)構(gòu)來(lái)實(shí)現(xiàn)。

? Lists 就是鏈表,相信略有數(shù)據(jù)結(jié)構(gòu)知識(shí)的人都應(yīng)該能理解其結(jié)構(gòu)。使用Lists結(jié)構(gòu),可以輕松地實(shí)現(xiàn)最新消息排行等功能。Lists的另一個(gè)應(yīng)用就是消息隊(duì)列,

? 可以利用Lists的PUSH操作,將任務(wù)存在Lists中,然后工作線程再用POP操作將任務(wù)取出進(jìn)行執(zhí)行。

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

3.4 set

常用命令

? sadd、spop、smembers、sunion 等 

應(yīng)用場(chǎng)景:

? Redis set對(duì)外提供的功能與list類似是一個(gè)列表的功能,特殊之處在于set是可以自動(dòng)排重的,當(dāng)你需要存儲(chǔ)一個(gè)列表數(shù)據(jù),又不希望出現(xiàn)重復(fù)數(shù)據(jù)時(shí),set 是一個(gè)很好的選擇,并且set提供了判斷某個(gè)成員是否在一個(gè)set集合內(nèi)的重要接口,這個(gè)也是list所不能提供的。

? Sets 集合的概念就是一堆不重復(fù)值的組合。利用Redis提供的Sets數(shù)據(jù)結(jié)構(gòu),可以存儲(chǔ)一些集合性的數(shù)據(jù),比如在微博應(yīng)用中,可以將一個(gè)用戶所有的關(guān)注人存在一個(gè)集合中,將其所有粉絲存在一個(gè)集合。Redis還為集合提供了求交集、并集、差集等操作,可以非常方便的實(shí)現(xiàn)如共同關(guān)注、共同喜好、二度好友等功能,對(duì)上面的所有集合操作,你還可以使用不同的命令選擇將結(jié)果返回給客戶端還是存集到一個(gè)新的集合中

3.5 sort set 

常用命令:

? zadd,zrange,zrem,zcard等 

使用場(chǎng)景

? Redis sorted set的使用場(chǎng)景與set類似,區(qū)別是set不是自動(dòng)有序的,而sorted set可以通過(guò)用戶額外提供一個(gè)優(yōu)先級(jí)(score)的參數(shù)來(lái)為成員排序,并且是插入有序的,即自動(dòng)排序。當(dāng)你需要一個(gè)有序的并且不重復(fù)的集合列表,那么可以選擇sorted set數(shù)據(jù)結(jié)構(gòu),比如twitter 的public timeline可以以發(fā)表時(shí)間作為score來(lái)存儲(chǔ),這樣獲取時(shí)就是自動(dòng)按時(shí)間排好序的。

? 另外還可以用Sorted Sets來(lái)做帶權(quán)重的隊(duì)列,比如普通消息的score為1,重要消息的score為2,然后工作線程可以選擇按score的倒序來(lái)獲取工作任務(wù)。讓重要的任務(wù)優(yōu)先執(zhí)行

四 redis持久化

Redis 是內(nèi)存型數(shù)據(jù)庫(kù),為了保證數(shù)據(jù)在斷電后不會(huì)丟失,需要將內(nèi)存中的數(shù)據(jù)持久化到硬盤上。

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

? RDB(Redis DataBase) 

? AOF(Append Only File)

4.1 RDB 

在不同的時(shí)間點(diǎn),將redis存儲(chǔ)的數(shù)據(jù)生成快照并存儲(chǔ)到磁盤等介質(zhì)上,可以將快照復(fù)制到其他服務(wù)器從而創(chuàng)建具有相同數(shù)據(jù)的服務(wù)器副本。如果系統(tǒng)發(fā)生故障,將會(huì)丟失最后一次創(chuàng)建快照之后的數(shù)據(jù)。如果數(shù)據(jù)量大,保存快照的時(shí)間會(huì)很長(zhǎng)。

4.2 AOF 

換了一個(gè)角度來(lái)實(shí)現(xiàn)持久化,那就是將redis執(zhí)行過(guò)的所有寫(xiě)指令記錄下來(lái),在下次redis重新啟動(dòng)時(shí),只要把這些寫(xiě)指令從前到后再重復(fù)執(zhí)行一遍,就可以實(shí)現(xiàn)數(shù)據(jù)恢復(fù)了。將寫(xiě)命令添加到 AOF 文件(append only file)末尾。

五 redis架構(gòu)

5.1 單機(jī)

5.2 主從

5.3 哨兵

5.4 集群

5.3 哨兵

哨兵的出現(xiàn)主要是解決了主從復(fù)制出現(xiàn)故障時(shí)需要人為干預(yù)的問(wèn)題。

哨兵主要功能

? 集群監(jiān)控:負(fù)責(zé)監(jiān)控Redis master和slave進(jìn)程是否正常工作

? 消息通知:如果某個(gè)Redis實(shí)例有故障,那么哨兵負(fù)責(zé)發(fā)送消息作為報(bào)警通知給管理員 

? 故障轉(zhuǎn)移:如果master node掛掉了,會(huì)自動(dòng)轉(zhuǎn)移到slave node上 

? 配置中心:如果故障轉(zhuǎn)移發(fā)生了,通知client客戶端新的master地址

5.4 集群 

即使使用哨兵,redis每個(gè)實(shí)例也是全量存儲(chǔ),每個(gè)redis存儲(chǔ)的內(nèi)容都是完整的數(shù)據(jù),浪費(fèi)內(nèi)存且有木桶效應(yīng)。

為了最大化利用內(nèi)存,可以采用集群,就是分布式存儲(chǔ)。

即每臺(tái)redis存儲(chǔ)不同的內(nèi)容,共有16384個(gè)slot。

每個(gè)redis分得一些slot,hash_slot = crc16(key) mod 16384 找到對(duì)應(yīng)slot。

集群至少需要3主3從,且每個(gè)實(shí)例使用不同的配置文件,主從不用配置,集群會(huì)自己選。

? 高可用性:在主機(jī)掛掉后,自動(dòng)故障轉(zhuǎn)移,使前端服務(wù)對(duì)用戶無(wú)影響。 

? 讀寫(xiě)分離:將主機(jī)讀壓力分流到從機(jī)上。 

? 可在客戶端組件上實(shí)現(xiàn)負(fù)載均衡,根據(jù)不同服務(wù)器的運(yùn)行情況,分擔(dān)不同比例的讀請(qǐng)求壓力

歡迎關(guān)注我的微信公眾號(hào)"IT小Chen",共同學(xué)習(xí),共同成長(zhǎng)?。。?/strong>

Redis日常運(yùn)維-基礎(chǔ)認(rèn)識(shí)

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI