Redis聽到最多的一句話就是Redis的使用難嗎泌绣?不難,Redis用好容易嗎孕荠?不容易,有時(shí)候覺(jué)得這句話說(shuō)的挺好攻谁,但又是讓讀者挺心里咯噔一下的稚伍,還不如不說(shuō)!
概述簡(jiǎn)介
Redis是一個(gè)開源(BSD許可)的內(nèi)存數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)戚宦,用作數(shù)據(jù)庫(kù)个曙,緩存和消息代理。它支持?jǐn)?shù)據(jù)結(jié)構(gòu),如字符串垦搬,哈希呼寸,列表,集合猴贰,具有范圍查詢的排序集对雪,位圖,超級(jí)日志和具有半徑查詢的地理空間索引米绕。Redis具有內(nèi)置復(fù)制瑟捣,Lua腳本,LRU逐出栅干,交易和不同級(jí)別的磁盤持久性迈套,并通過(guò)Redis Sentinel提供高可用性,并通過(guò)Redis Cluster自動(dòng)分區(qū)碱鳞。
往簡(jiǎn)單的說(shuō)就是:Redis是一個(gè)開源的Key-Value存儲(chǔ)桑李,它具有以下特點(diǎn):
- 速度非常快(每個(gè)人都知道)
- 豐富的數(shù)據(jù)結(jié)構(gòu)窿给,包括String,List,Hash,Set,Sorted Set等
- 單線程芙扎,免了線程切換和鎖的性能消耗(搞不懂,整天研究的并發(fā)編程在這里不適用填大?)
- 原子操作(作為數(shù)據(jù)庫(kù)都有)
- 可持久化(RDB與AOF)
- 發(fā)布/訂閱 (個(gè)人認(rèn)為RabbitMQ這方面比較優(yōu)越戒洼,在微服務(wù)RPC調(diào)用這里,作服務(wù)的發(fā)現(xiàn))
- 支持Lua腳本
- 分布式鎖 (集群的關(guān)鍵)
- 事務(wù) (作為數(shù)據(jù)庫(kù)都有)
- 主從復(fù)制與高可用(Redis Sentinel)
- 集群(3.0版本以上)
Redis數(shù)據(jù)結(jié)構(gòu)
建議直接看Redis官網(wǎng)的數(shù)據(jù)結(jié)構(gòu)允华,因?yàn)閺膩?lái)不想看二手Redis數(shù)據(jù)結(jié)構(gòu),這里簡(jiǎn)單介紹:
- String
這是最簡(jiǎn)單的Redis類型圈浇。如果只使用這種類型,Redis就像一個(gè)可持久化的Memcached服務(wù)器靴寂。 - List
Redis的List是基于雙向鏈表實(shí)現(xiàn)的磷蜀,可以支持反向查找和遍歷。
常用案例:聊天系統(tǒng)百炬、社交網(wǎng)絡(luò)中獲取用戶最新發(fā)表的帖子褐隆、簡(jiǎn)單的消息隊(duì)列、新聞的分頁(yè)列表剖踊、博客的評(píng)論系統(tǒng)庶弃。 - Hash
Hash是一個(gè)String類型的field和value之間的映射表,請(qǐng)見下圖德澈,類似于.NET中的Hashtable和Dictionary歇攻。主要用來(lái)存儲(chǔ)對(duì)象,可以避免序列化的開銷和并發(fā)修改控制的問(wèn)題梆造。 - Set
Set也是一個(gè)列表缴守,不過(guò)它的特殊之處在于它是可以自動(dòng)排重的:當(dāng)需要存儲(chǔ)一個(gè)列表數(shù)據(jù),而又不希望出現(xiàn)重復(fù)的時(shí)候,Set是一個(gè)很好的選擇(比如ID的集合)屡穗。并且Set提供了判斷某個(gè)成員是否在一個(gè)Set集合內(nèi)的接口贴捡,這也是List所沒(méi)有的。 - Sorted Set
Sorted Set和Set的使用場(chǎng)景類似村砂,區(qū)別是Sorted Set會(huì)根據(jù)提供的score參數(shù)來(lái)進(jìn)行自動(dòng)排序烂斋。當(dāng)你需要一個(gè)有序的并且不重復(fù)的集合列表,那么就可以選擇Sorted Set數(shù)據(jù)結(jié)構(gòu)箍镜。常用案例:游戲中的排行榜源祈。
Redis重要特性
- 管道
Redis服務(wù)是一種C/S模型,提供請(qǐng)求-響應(yīng)式協(xié)議的TCP服務(wù)色迂,所以當(dāng)客戶端請(qǐng)求發(fā)出香缺,服務(wù)端處理并返回結(jié)果到客戶端,一般是以阻塞形式等待服務(wù)端的響應(yīng)歇僧,但這在批量處理連接時(shí)延遲問(wèn)題比較嚴(yán)重图张,所以Redis為了提升或彌補(bǔ)這個(gè)問(wèn)題,引入了管道技術(shù):可以做到服務(wù)端未及時(shí)響應(yīng)的時(shí)候诈悍,客戶端也可以繼續(xù)發(fā)送命令請(qǐng)求祸轮,做到客戶端和服務(wù)端互不干涉影響,服務(wù)端并最終返回所有服務(wù)端的響應(yīng)侥钳,這在促進(jìn)原有C/S模型交互的響應(yīng)速度上有了質(zhì)的提高适袜。
特點(diǎn):在C/S交互中,客戶端可發(fā)送任意數(shù)請(qǐng)求命令
舷夺,不需要等服務(wù)端響應(yīng)后再行發(fā)送請(qǐng)求苦酱;而服務(wù)端可以一次性完成并返回所有客戶端請(qǐng)求結(jié)果,也可以分批次返回請(qǐng)求結(jié)果给猾,這主要看服務(wù)端處理結(jié)果的速度而定疫萤。 - 事務(wù)
Redis事務(wù)是一組命令的集合。一個(gè)事務(wù)中的命令要么都執(zhí)行敢伸,要么都不執(zhí)行扯饶。如果命令在運(yùn)行期間出現(xiàn)錯(cuò)誤,不會(huì)自動(dòng)回滾池颈。
管道與事務(wù)的區(qū)別:管道主要是網(wǎng)絡(luò)上的優(yōu)化尾序,客戶端緩沖一組命令,一次性發(fā)送到服務(wù)器端執(zhí)行饶辙,但是并不能保證命令是在同一個(gè)事務(wù)里面執(zhí)行蹲诀;而事務(wù)是原子性的,可以確保命令執(zhí)行的時(shí)候不會(huì)有來(lái)自其他客戶端的命令插入到命令序列中弃揽。
常見應(yīng)用問(wèn)題
- 緩存穿透處理
什么是緩存穿透?當(dāng)根據(jù)Redis key在緩存中查詢后,不存在對(duì)應(yīng)Value矿微,就應(yīng)該會(huì)在后端系統(tǒng)如DB中去查找痕慢,該Key的并發(fā)請(qǐng)求量一旦變大,那么就會(huì)對(duì)DB造成很大的壓力涌矢。解決辦法有:a.前端風(fēng)險(xiǎn)控制掖举,將惡意穿透情況排除在外;b.對(duì)查詢結(jié)果為空的情況依然進(jìn)行緩存娜庇,但緩存時(shí)間會(huì)設(shè)置得很短塔次,一般是幾分鐘。 - 緩存雪崩處理
什么是緩存雪崩名秀?當(dāng)緩存服務(wù)器重啟或者大量緩存集中在某一個(gè)時(shí)間段失效励负,這樣在失效的時(shí)候,也會(huì)給后端系統(tǒng)(比如DB)帶來(lái)很大壓力匕得。解決辦法有:后端連接數(shù)限制继榆,錯(cuò)誤閾值限制,超時(shí)處理汁掠,緩存失效時(shí)間均勻分布略吨,前端永不失效及后端主動(dòng)更新。 - 緩存時(shí)長(zhǎng)
策略定位復(fù)雜考阱,需要多維度的計(jì)算翠忠。 - 緩存失效
按時(shí)失效,事件失效乞榨,后端主動(dòng)更新秽之。 - 緩存Key
Hash、規(guī)則姜凄、前綴+Hash政溃,異常情況可人工干預(yù)。 - Lua腳本
服務(wù)端批量處理及事務(wù)能力态秧,有條件邏輯的可擴(kuò)展腳本董虱。使用它的好處有:減少網(wǎng)絡(luò)開銷、原子操作申鱼、可復(fù)用愤诱。 - Limit
可滑動(dòng)時(shí)間窗口,如應(yīng)用于Session捐友,Memcached需每次傳Key和Value淫半。
Redis簡(jiǎn)單介紹安裝(Centos)
下載地址,建議生產(chǎn)環(huán)境使用穩(wěn)定版
1匣砖、 確保已經(jīng)安裝有編譯工具make
沒(méi)有安裝make可以使用:
yum install make -y
2科吭、開始安裝
RedisDesktopManage:頁(yè)面效果:
RedisDesktopManage下載地址:https://redisdesktop.com/
Redis官網(wǎng):https://redis.io/
Redis安裝推薦博客:http://blog.csdn.net/lc1010078424/article/details/78295482
很多其它博客寫的是真的垃圾昏滴!