認(rèn)識redis
redis里面相關(guān)的小命令 fulshall:清空redis數(shù)據(jù)庫,類似于mysql里面的drop database;
-
一. 內(nèi)存中存儲數(shù)據(jù)(內(nèi)存級數(shù)據(jù)庫)
-
redis相比MySQL的優(yōu)勢:MySQL數(shù)據(jù)庫最大的問題在于訪問速度是比較慢的(很多互聯(lián)網(wǎng)產(chǎn)品中,對于性能要求是很高的)。redis作為數(shù)據(jù)庫使用,定性的角度來看是很快的,但是很難定量去衡量。
-
redis相比MySql的劣勢:存儲空間是有限的(內(nèi)存的空間畢竟是少的)。
- 雖然有不少互聯(lián)網(wǎng)產(chǎn)品,對于性能的要求是比較高的。更多的互聯(lián)網(wǎng)產(chǎn)品對于性能的要求沒那么高。
- 所以要設(shè)計(jì)又大又快的數(shù)據(jù)庫:典型的方案是,可以把redis和mysql結(jié)合起來使用(“二八原則”,20%的熱點(diǎn)數(shù)據(jù),能滿足80%的訪問需要)。雖然結(jié)合起來使用使得系統(tǒng)的復(fù)雜度程度大大提升了。而且,如果數(shù)據(jù)發(fā)生修改,還涉及到redis和mysql之間的數(shù)據(jù)同步的問題。
-
二. cache
- 速度快??赡軙腥藛枺憾x變量,不就是在內(nèi)存中存儲數(shù)據(jù)嗎? => redis是在分布式系統(tǒng)中,才能發(fā)揮威力的~~如果只是單機(jī)程序,直接通過變量存儲數(shù)據(jù)的方式,確實(shí)是比使用redis更優(yōu)的選擇。
- 為什么在分布式系統(tǒng)中會更有優(yōu)勢的呢?
不同的主機(jī)之間的通信,其實(shí)還是不同的進(jìn)程之間的通信。又因?yàn)檫M(jìn)程之間具有隔離性(利用網(wǎng)絡(luò)),redis就是基于網(wǎng)絡(luò)的,可以把自己內(nèi)存中的變量給別的進(jìn)程,甚至別的主機(jī)的進(jìn)程進(jìn)行使用。
-
三. redis的初心
- 最初就是用來作為一個“消息中間件”的(消息隊(duì)列)。分布式系統(tǒng)下的生產(chǎn)者消費(fèi)者模型。當(dāng)前很少會直接使用redis作為消息中間件(業(yè)界有更多更專業(yè)的消息中間件使用)。
Redis(Remote Dictionary Server)是一個基于客戶端-服務(wù)器架構(gòu)的存儲數(shù)據(jù)的中間件。它是一種內(nèi)存數(shù)據(jù)庫,屬于NoSQL(非關(guān)系型數(shù)據(jù)庫)的一種,可用于作為數(shù)據(jù)庫,緩存/會話存儲,消息隊(duì)列。它通常被用作中間緩存層,將頻繁訪問的數(shù)據(jù)存儲在內(nèi)存中,從而大幅提升讀取性能。上文所說的主從分離/冷熱分離架構(gòu)中的緩存服務(wù)器就可以用Redis來實(shí)現(xiàn),以提高熱點(diǎn)數(shù)據(jù)的讀取性能
redis的主要特點(diǎn)
1.鍵值存儲:Redis使用簡單的鍵值對**(K-V)數(shù)據(jù)模型**。每個鍵都與一個唯一的值相關(guān)聯(lián),通過鍵可以快速訪問和操作對應(yīng)的值。
2.內(nèi)存存儲:Redis將數(shù)據(jù)保存在內(nèi)存中,以實(shí)現(xiàn)高速的讀寫操作(還引入了IO多路復(fù)用,一個線程管理多個socket)。這使得Redis能夠?qū)崿F(xiàn)非常低延遲和高吞吐量的數(shù)據(jù)訪問
3.可編程的:可直接通過簡單的交互式命令進(jìn)行操作,也可通過腳本的方式,批量執(zhí)行操作
4.可擴(kuò)展:Redis提供了一組API,在原有的功能上進(jìn)行擴(kuò)展(以支持更多的數(shù)據(jù)結(jié)構(gòu),命令),通過幾個語言編寫Redis擴(kuò)展,本質(zhì)上是一個動態(tài)鏈接庫(windows:dll Linux:.so)
5.持久化與備份:提供持久化功能,將數(shù)據(jù)寫入磁盤或其他持久存儲介質(zhì)。此外,一些RDS還支持?jǐn)?shù)據(jù)備份和恢復(fù)功能,以防止數(shù)據(jù)丟失
- Redis提供了兩種持久化?式:RDB和AOF,即可以?兩種策略將內(nèi)存的數(shù)據(jù)保存到硬盤中

6.支持集群:支持水平擴(kuò)展(類似于分庫分表),將數(shù)據(jù)分片到多個節(jié)點(diǎn)上,以提高存儲和處理能力
7.高可用性:Redis支持主從復(fù)制(Master-Slave Replication)和哨兵(Sentinel)機(jī)制,以提供數(shù)據(jù)的高可用性和容錯能力。通過配置主從復(fù)制和哨兵節(jié)點(diǎn),Redis可以實(shí)現(xiàn)自動故障恢復(fù)和故障轉(zhuǎn)移
redis的特性(優(yōu)點(diǎn))
1.通過數(shù)據(jù)結(jié)構(gòu)在內(nèi)存當(dāng)中存儲數(shù)據(jù)
- MySQL主要是通過
表
的方式來存儲組織數(shù)據(jù)的,它是關(guān)系型數(shù)據(jù)庫 - Redis主要是通過
鍵值對
的方式來存儲組織數(shù)據(jù)的,它是非關(guān)系型數(shù)據(jù)庫
2.可編程的
- 針對redis的操作,可以直接通過簡單的交互式命令來操作,也可以通過一些腳本的方式執(zhí)行一些操作
3.可拓展性
- Redis提供了一組api,可以在redis原有的功能基礎(chǔ)上再進(jìn)行拓展,比如:redis本身已經(jīng)提供了很多數(shù)據(jù)結(jié)構(gòu)和命令,但是通過拓展,可以讓redis支持更多的數(shù)據(jù)結(jié)構(gòu)和命令
4.持久化
- 因?yàn)閞edis為了快速訪問是把數(shù)據(jù)存儲到內(nèi)存上的,然而內(nèi)存的數(shù)據(jù)是比較容易丟失的,進(jìn)程退出/系統(tǒng)重啟,都可能會導(dǎo)致內(nèi)存數(shù)據(jù)丟失,但是Redis還會把數(shù)據(jù)存儲到硬盤上,硬盤相當(dāng)于對內(nèi)存當(dāng)中的數(shù)據(jù)備份了一下,如果redis重啟了,就會在重啟的時候加載硬盤當(dāng)中的備份數(shù)據(jù),使redis的內(nèi)存數(shù)據(jù)恢復(fù)到重啟前的狀態(tài)
- 但是主要的CRUD操作還是在內(nèi)存當(dāng)中進(jìn)行的,為的是保證訪問速度
5.集群
- redis作為一個分布式系統(tǒng)的中間件,一個redis能存儲的數(shù)據(jù)使有限的,因?yàn)閮?nèi)存的空間是有限的,引入多個主機(jī),部署多個redis節(jié)點(diǎn),每個redis存儲數(shù)據(jù)的一部分
6.高可用 => 冗余 / 備份
- redis自身也是支持 主從結(jié)構(gòu)的,從節(jié)點(diǎn)相當(dāng)于是主節(jié)點(diǎn)的備份
redis是單線程模型,為什么效率這么高,訪問速度這么快
1.因?yàn)閞edis數(shù)據(jù)存儲到內(nèi)存當(dāng)中,就比訪問硬盤的數(shù)據(jù)庫要快很多
2.redis的核心功能都是比較簡單的邏輯,都是比較簡單的操作內(nèi)存的數(shù)據(jù)結(jié)構(gòu),并且redis是單線程模型,避免了不必要的線程競爭開銷
3.從網(wǎng)絡(luò)角度上,處理網(wǎng)絡(luò)IO的時候,redis使用了IO多路復(fù)用的方式(epoll),使用一個線程管理很多個socket
4.使?了單線程,預(yù)防了多線程可能產(chǎn)?的競爭問題,減少了不必要的線程之間的競爭開銷
- Redis在6.0版本引?了多線程機(jī)制,但主要也是在處理?絡(luò)和IO,不涉及到數(shù)據(jù)命令,即命令的執(zhí)?仍然采?了單線程模式
- 多線程提高效率的前提是CPU密集型的任務(wù),此時使用多個線程可以充分的利用CPU多核資源
5.redis是使用C語言實(shí)現(xiàn)的,距離”操作系統(tǒng)更近,執(zhí)?速度相對會更快 【但是MySQL也是用C語言實(shí)現(xiàn)的,但是MySQL比redis慢,在同樣都是C語言實(shí)現(xiàn)的前提下,很難說是因?yàn)閞edis基于C語言實(shí)現(xiàn)的所以redis執(zhí)行速度更快】
redis應(yīng)用場景
1.實(shí)時的數(shù)據(jù)存儲(Real-time data store),可以將 Redis 當(dāng)作數(shù)據(jù)庫。適用于對性能要求高的業(yè)務(wù)場景
- 大多數(shù)情況,考慮到數(shù)據(jù)存儲,有限考慮的是存儲空間足夠大,但是有一些場景考慮的是
快
,如果把redis作為數(shù)據(jù)庫,那么此時redis存儲的是全量數(shù)據(jù),數(shù)據(jù)不能隨便丟失
2.作為緩存/會話存儲(Caching & session storage),MySql存儲數(shù)據(jù)空間大,但是讀取速度慢,滿足不了緩存的要求,所以可以將熱點(diǎn)數(shù)據(jù)放到redis當(dāng)中
- 此時redis存儲的是部分?jǐn)?shù)據(jù),全量數(shù)據(jù)以MySQL為主,哪怕redis當(dāng)中數(shù)據(jù)沒了,仍然可以從MySQL再加載回來
例子:會話存儲
會話存儲時,使用cookie用來存儲用戶信息的身份標(biāo)識(sessionId) => 存儲在瀏覽器這邊的身份標(biāo)識,但是還需要session配合 => 存儲在應(yīng)用服務(wù)器當(dāng)中的
如果在應(yīng)用服務(wù)器當(dāng)中保存會話信息
此時導(dǎo)致的問題:當(dāng)客戶端通過負(fù)載均衡器訪問到服務(wù)器,進(jìn)行登錄操作,登錄成功之后,在服務(wù)器當(dāng)中生成一個session會話信息,但是當(dāng)客戶端再次訪問服務(wù)器的時候,通過負(fù)載均衡器可能會將該請求派發(fā)到其它服務(wù)器當(dāng)中,而該服務(wù)器可能并沒有該用戶的會話信息
解決辦法:
1.更改負(fù)載均衡算法,將同一個用戶的請求始終打到同一個機(jī)器上
2.將會話數(shù)據(jù)單獨(dú)放到一臺機(jī)器上進(jìn)行存儲,好處是:如果應(yīng)用程序重啟了,會話并不會丟失
Redis真正存儲了用戶信息。無論負(fù)載均衡器將登錄請求分擔(dān)給哪個應(yīng)用服務(wù)器,都能從Redis中獲取到會話
3.消息隊(duì)列(服務(wù)器)(Streaming & messaging),可以實(shí)現(xiàn)網(wǎng)絡(luò)版的生產(chǎn)者-消費(fèi)者模型(優(yōu)勢:解耦合;削峰填谷)
注意:由于是使用內(nèi)存來存儲數(shù)據(jù),不能使用Redis存儲大規(guī)模數(shù)據(jù),考慮使用其它數(shù)據(jù)庫
場景1:排行榜系統(tǒng)
排?榜系統(tǒng)?乎存在于所有的?站,例如按照熱度排名的排?榜,按照發(fā)布時間的排?榜,按照各種復(fù)雜維度計(jì)算出的排?榜,Redis提供了列表和有序集合的結(jié)構(gòu),合理地使?這些數(shù)據(jù)結(jié)構(gòu)可以很?便地構(gòu)建各種排?榜系統(tǒng)
場景2:計(jì)數(shù)器應(yīng)用
計(jì)數(shù)器在?站中的作??關(guān)重要,例如視頻?站有播放數(shù)、電商?站有瀏覽數(shù),為了保證數(shù)據(jù)的實(shí)時性,每?次播放和瀏覽都要做加1的操作,如果并發(fā)量很?對于傳統(tǒng)關(guān)系型數(shù)據(jù)的性能是?種挑戰(zhàn)。Redis天然?持計(jì)數(shù)功能?且計(jì)數(shù)的性能也?常好,可以說是計(jì)數(shù)器系統(tǒng)的重要選擇
場景3:社交網(wǎng)絡(luò)
贊?踩、粉絲、共同好友/喜好、推送、下拉刷新等是社交?站的必備功能,由于社交?站訪問量通常?較?,?且傳統(tǒng)的關(guān)系型數(shù)據(jù)不太合適保存這種類型的數(shù)據(jù),Redis提供的數(shù)據(jù)結(jié)構(gòu)可以相對?較容易地實(shí)現(xiàn)這些功能
redis不可以做什么
站在數(shù)據(jù)規(guī)模的?度看,數(shù)據(jù)可以分為?規(guī)模數(shù)據(jù)和?規(guī)模數(shù)據(jù)。Redis的數(shù)據(jù)是存放在內(nèi)存中的,雖然現(xiàn)在內(nèi)存已經(jīng)?夠便宜,但是如果數(shù)據(jù)量?常?,例如每天有?億的???為數(shù)據(jù),使?Redis來存儲的話,基本上是個?底洞,經(jīng)濟(jì)成本相當(dāng)?
- 因?yàn)閞edis是使用內(nèi)存來存儲數(shù)據(jù)的,所以redis不能存儲大規(guī)模數(shù)據(jù)
站在數(shù)據(jù)冷熱的?度,數(shù)據(jù)分為熱數(shù)據(jù)和冷數(shù)據(jù),熱數(shù)據(jù)通常是指需要頻繁操作/訪問的數(shù)據(jù),反之為冷數(shù)據(jù)。如果將這些冷數(shù)據(jù)放在Redis上,基本上是對于內(nèi)存的?種浪費(fèi),但是對于?些熱數(shù)據(jù)可以放在Redis中加速讀寫,也可以減輕后端存儲的負(fù)載
MySQL和Redis對比
Redis屬于一種NoSQL數(shù)據(jù)庫
1.數(shù)據(jù)模型
- MySQL是關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS),使用表格來組織數(shù)據(jù),并使用結(jié)構(gòu)化查詢語言(SQL)進(jìn)行數(shù)據(jù)操作。數(shù)據(jù)以行和列的形式存儲,且需預(yù)定義數(shù)據(jù)模式和數(shù)據(jù)類型。
- NoSQL是非關(guān)系型數(shù)據(jù)庫,其數(shù)據(jù)模型可以是鍵值對(Key-Value)、文檔(Document)、列族(Wide-Column)或圖形(Graph)等。NoSQL數(shù)據(jù)庫更加靈活,不需要預(yù)定義固定的數(shù)據(jù)模式
2.拓展性
- MySQL在水平擴(kuò)展時存在一些限制,常規(guī)部署通常是單機(jī)或主從復(fù)制架構(gòu)。雖然可以通過分區(qū)和分片等技術(shù)來提高性能和可伸縮性,但相對較復(fù)雜。
- NoSQL數(shù)據(jù)庫通常天生具備可伸縮性,易于構(gòu)建分布式集群,可以通過添加更多節(jié)點(diǎn)來水平擴(kuò)展,以應(yīng)對大規(guī)模數(shù)據(jù)和高并發(fā)訪問的需求。
3.強(qiáng)一致性和靈活性
- MySQL支持強(qiáng)一致性,即保證所有讀取操作都能看到最新的寫入操作。通過事務(wù)和鎖機(jī)制,確保數(shù)據(jù)一致性和完整性。
- NoSQL數(shù)據(jù)庫中的一些類型,如鍵值對存儲,可能會放寬一致性要求以換取更高的性能和可用性。這種弱一致性模型在某些場景下更加適用。
4.查詢復(fù)雜性
- MySQL作為關(guān)系型數(shù)據(jù)庫,支持SQL語言進(jìn)行復(fù)雜查詢,可以執(zhí)行連接操作、聚合函數(shù)和多表關(guān)聯(lián)等。
- NoSQL數(shù)據(jù)庫的查詢方式相對簡單,通常使用鍵值對或類似于JSON的查詢語法。它們更適合于數(shù)據(jù)訪問模式簡單、數(shù)據(jù)結(jié)構(gòu)扁平化的場景。
如果需要強(qiáng)大的事務(wù)支持、復(fù)雜查詢和一致性保證,以及已經(jīng)有現(xiàn)有的SQL架構(gòu)和工具鏈,那么MySQL是一個不錯的選擇。對于大規(guī)模數(shù)據(jù)、高并發(fā)和靈活的數(shù)據(jù)模型,以及更容易進(jìn)行水平擴(kuò)展的需求,可以考慮使用NoSQL數(shù)據(jù)庫。也可以在特定場景中將兩者結(jié)合使用,如使用MySQL作為主數(shù)據(jù)庫,然后使用NoSQL數(shù)據(jù)庫作為輔助或緩存數(shù)據(jù)庫來提升性能。
啟動Redis
centos啟動redis命令:sudo redis-server /etc/redis/redis.conf
- ping:與redis服務(wù)做心跳測試,服務(wù)端正常的話會返回pong
如果想要關(guān)閉redis:使用netstat或者ps查詢得到redis的服務(wù)器的進(jìn)程id,再進(jìn)行kill即可
注意:修改了配置文件,需要重啟redis才能生效
Ubuntu:
- 重新啟動redis服務(wù)器:
service redis-server restart
- 查看redis服務(wù)器的狀態(tài):
service redis-server status
Centos:
通過netstat
或者ps
查詢redis服務(wù)器的進(jìn)程id,然后再使用kill殺掉該進(jìn)程
Redis客戶端
Redis也是一個基于客戶端-服務(wù)器(Client-Server)架構(gòu)的內(nèi)存數(shù)據(jù)庫,自帶的命令行客戶端,可通過命令直接啟動
redis-cli -h <host> -p <port>
<host>
是Redis服務(wù)器的主機(jī)名或IP地址,<port>
是Redis服務(wù)器監(jiān)聽的端口號。由于當(dāng)前我們連接的服務(wù)器位于127.0.0.1
,端口默認(rèn)使用的是6379
,所以可以直接使用redis-cli
來啟動Redis客戶端
注意:redis的“快”是相對于mysql這類關(guān)系型數(shù)據(jù)庫的,如果是直接和內(nèi)存中的操作變量相比就沒有優(yōu)勢甚至更慢了
比如針對單機(jī)系統(tǒng),應(yīng)用程序要存儲K-V結(jié)構(gòu)的數(shù)據(jù),那么使用redis還是map更好呢?引入redis,一定是比直接使用map更慢的,因?yàn)閙ap是直接操作內(nèi)存,redis是先通過網(wǎng)絡(luò)再操作內(nèi)存的
Redis重要文件及作用
/usr/bin/redis-benchmark
/usr/bin/redis-check-aof -> /usr/bin/redis-server
/usr/bin/redis-check-rdb -> /usr/bin/redis-server
/usr/bin/redis-cli
/usr/bin/redis-sentinel -> /usr/bin/redis-server
/usr/bin/redis-server
/usr/libexec/redis-shutdown
redis-server
是Redis服務(wù)器程序 , redis-check-aof
是修復(fù)AOF?件?的?具 ,redis-check-rdb
是修復(fù)RDB?件的?具,redis-sentinel
是Redis哨兵程序,redis-benchmark
?于對Redis做性能基準(zhǔn)測試的?具,redis-shutdown
是?于停?Redis的專?腳本
配置文件文章來源:http://www.zghlxwxcb.cn/news/detail-728612.html
/etc/redis-sentinel.conf 是Redis Sentinel的配置?件
/etc/redis.conf 是Redis服務(wù)器的配置?件
持久化?件存儲?錄文章來源地址http://www.zghlxwxcb.cn/news/detail-728612.html
/var/lib/redis/ Redis持久化?產(chǎn)的RDB和AOF?件都默認(rèn)?成于該?錄下
到了這里,關(guān)于【Redis】認(rèn)識Redis-特點(diǎn)&特性&應(yīng)用場景&對比MySQL&重要文件及作用的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!