初始Redis概念、特性、安裝使用場景
一、什么是redis?
Redis 是一款基于鍵值對(key-value)的 NoSQL 數(shù)據(jù)庫。與多數(shù)鍵值對數(shù)據(jù)庫不同,其值可由字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(zset)、位圖(Bitmaps)、HyperLogLog、地理信息定位(GEO)等多種數(shù)據(jù)結(jié)構(gòu)和算法構(gòu)成,這使得 Redis 能滿足多樣的應(yīng)用場景。
Redis 的顯著優(yōu)勢在于將所有數(shù)據(jù)存儲于內(nèi)存中,因此讀寫性能極為出色。同時,它支持通過快照(RDB)和日志(AOF)兩種方式將內(nèi)存數(shù)據(jù)持久化到硬盤,確保斷電或機器故障時數(shù)據(jù)不會丟失。此外,Redis 還提供了鍵過期、發(fā)布訂閱、事務(wù)、流水線、Lua 腳本等附加功能,方便應(yīng)對這類場景。
如今,眾多重量級企業(yè)都在使用 Redis。國外如 Twitter、Instagram、Stack Overflow、Github 等;國內(nèi)則有新浪微博(堪稱全球最大的 Redis 使用者)、阿里巴巴、騰訊、搜狐、優(yōu)酷土豆、美團(tuán)、小米、唯品會等。此外,ELK 等諸多開源技術(shù)也將 Redis 作為重要組件,且 Redis 提供的模塊系統(tǒng)支持第三方進(jìn)行功能擴展,進(jìn)一步釋放其潛力。由此可見,熟練使用和運維 Redis 已成為開發(fā)與運維人員的必備技能。
二、 Redis特性的簡單認(rèn)識
Redis得到了眾多公司的青睞,必有其過人之處,下面是關(guān)于Redis的8個重要特性。
1. 速度快
相較于MySQL這類關(guān)系型數(shù)據(jù)庫,Redis的訪問速度要快很多,其原因大致可以分為以下四點:
- 內(nèi)存讀寫天然快:Redis的數(shù)據(jù)存放在內(nèi)存中,內(nèi)存訪問速度要遠(yuǎn)遠(yuǎn)快于硬盤,這也是Redis速度快的主要原因。(下圖是Google列出的各種硬件執(zhí)行速度,供參考)
- 單線程優(yōu)勢:Redis使用單線程模型,避免了線程切換和多線程加鎖競爭導(dǎo)致的性能損失
Redis 6.0 引入了多線程機制,但主要用于網(wǎng)絡(luò)IO場景,Redis的核心執(zhí)行的執(zhí)行依舊保持單線程模型
- 高效的數(shù)據(jù)結(jié)構(gòu):Redis采用了各種高效率的數(shù)據(jù)結(jié)構(gòu),如字符串(String)、哈希表(Hash)、有序集合(ZSet)、這些數(shù)據(jù)結(jié)構(gòu)的操作復(fù)雜度多為 O ( 1 ) 或者 O ( l o g N ) O(1) 或者 O(logN) O(1)或者O(logN) ,確保指令執(zhí)行高效。
- I/O多路復(fù)用技術(shù):采用I/O多路復(fù)用技術(shù),確保單線程也能高效應(yīng)對大量客戶端請求
各層級硬件執(zhí)行速度:
2. 基于鍵值對
Redis是基于鍵值對的非關(guān)系型數(shù)據(jù)庫(NoSQL),所謂鍵值對就像C++的map,Python的dict等,這種結(jié)構(gòu)的優(yōu)勢就是插入數(shù)據(jù)和查詢數(shù)據(jù)更加高效。值得一提的是,Redis的值支持豐富的數(shù)據(jù)結(jié)構(gòu):字符串、哈希表、列表、集合、有序集合、位圖、HyperLogLog甚至在Redis3.2加入了地理位置相關(guān)功能。這些豐富的數(shù)據(jù)庫能幫助開發(fā)者開發(fā)應(yīng)對各類場景的應(yīng)用。
3. 豐富的功能
- 鍵過期功能:到達(dá)一定時間自動刪除鍵值對,用于實現(xiàn)緩存
- 發(fā)布訂閱功能:可用于實現(xiàn)消息系統(tǒng)
- Lua腳本:可用Lua腳本執(zhí)行Redis命令
- 簡單事務(wù)功能:
- 流水線(Pipeine): 使得客戶端能將一批命令一次傳到Redis,減少了網(wǎng)絡(luò)的開銷
4. 簡單穩(wěn)定
- Redis源碼量少:早期甚至只有兩萬行,Redis3.0引入集群特性后增至5萬行左右,相對于其他數(shù)據(jù)庫來說代碼量少很多。
- Redis采用單線程模型
- Redis不依賴操作系統(tǒng)的各種類庫,自己實現(xiàn)事件處理相關(guān)功能。
5. 客戶端支持多種編程語言:
Redis提供了簡單的TCP通信協(xié)議:很多編程語言都可以方便的接入Redis,且由于Redis收到廣泛認(rèn)可,主流語言都已經(jīng)有開發(fā)者實現(xiàn)了良好的Redis支持,如C、C++、Java、PHP、Python、JS
6. 持久化
前面提到,Redis數(shù)據(jù)存放在內(nèi)存中,這保證了訪問速度很快,但是不夠安全。一旦發(fā)生斷電或者機器故障,重要的數(shù)據(jù)就可能會丟失。因此,Redis提供兩種持久化策略:RDB和AOF,可將內(nèi)存中的數(shù)據(jù)保存到硬盤中。后續(xù)我將對Redis持久化策略詳細(xì)說明。
7. 主從復(fù)制(Replication)
主從復(fù)制功能是分布式架構(gòu)的基礎(chǔ)。這一功能也將在后續(xù)博文中進(jìn)行演示。
8. 高可用(High Availability)和分布式(Distributed)
Redis 提供了高可用實現(xiàn)的 Redis 哨兵,能夠保證Redis節(jié)點故障檢測和故障自動轉(zhuǎn)移。也提供了 Reids 集群,這是真正的分布式實現(xiàn)。
三、Redis使用場景
1. Redis可以做什么?
Redis官網(wǎng)給出了三個方向:數(shù)據(jù)庫、緩存和消息隊列
數(shù)據(jù)庫
大多數(shù)情況下,數(shù)據(jù)庫考慮的是容量大,但也有一些高性能的場景考慮的是“速度快“,這是就可以直接采用Redis做數(shù)據(jù)庫
緩存
這是Redis最廣泛使用的場景。對于各類大型網(wǎng)站或者應(yīng)用程序,往往是少量的數(shù)據(jù)能滿足大量的用戶使用場景。因此,這類網(wǎng)站采用的方式都是用 MySQL 等數(shù)據(jù)庫存儲全量完整數(shù)據(jù),用Redis從數(shù)據(jù)庫中加載少量核心數(shù)據(jù)作為緩存,這樣的設(shè)計提升了用戶訪問數(shù)據(jù)的速度,也有效降低了后端的壓力。
消息隊列
Redis的開發(fā)者最早開發(fā)它就是為了將其作為消息隊列進(jìn)行使用的。但如今,在消息隊列方面,我們有很多更優(yōu)的選擇,因此,Redis做消息隊列的場景很少出現(xiàn)了。
2. Redis不宜做什么?
和所有技術(shù)一樣,Redis也有其適用場景與邊界,并非萬能解決方案。它既能高效解決特定問題,也存在不適合的應(yīng)用場景,這一點可從數(shù)據(jù)規(guī)模與數(shù)據(jù)冷熱兩個維度來分析。
從數(shù)據(jù)規(guī)模來看,數(shù)據(jù)可分為大規(guī)模數(shù)據(jù)與小規(guī)模數(shù)據(jù)。由于Redis的數(shù)據(jù)存儲依賴內(nèi)存,盡管如今內(nèi)存成本已大幅下降,但面對超大規(guī)模數(shù)據(jù)——例如每天數(shù)億條的用戶行為數(shù)據(jù)——若用Redis存儲,成本會高得難以承受,堪稱一個“無底洞”。
從數(shù)據(jù)冷熱屬性來看,數(shù)據(jù)有熱數(shù)據(jù)與冷數(shù)據(jù)之分。熱數(shù)據(jù)指需要頻繁操作的數(shù)據(jù),冷數(shù)據(jù)則反之。以視頻網(wǎng)站為例,視頻基本信息在各業(yè)務(wù)線中常被調(diào)用,屬于熱數(shù)據(jù);而用戶的觀看記錄未必會被頻繁訪問,可歸為冷數(shù)據(jù)。暫且不考慮兩者在數(shù)據(jù)規(guī)模上的差異,僅從數(shù)據(jù)冷熱角度而言,將冷數(shù)據(jù)存于Redis無疑是對內(nèi)存的浪費,而把熱數(shù)據(jù)放入Redis,既能加速讀寫操作,又能減輕后端存儲的負(fù)載,可謂事半功倍。
因此,Redis并非“萬金油”。相信隨著對Redis的深入學(xué)習(xí),我們會更清晰地把握它真正的適用場景。
四、Redis重大版本
- Redis 2.6 :2012年發(fā)布,支持服務(wù)端Lua腳本,鍵過期時間精確到毫秒,從節(jié)點新增只讀功能。
- Redis 2.8 :2013年發(fā)布,優(yōu)化主從復(fù)制的PSYNC機制,支持通過config set配置maxclients,新增config rewrite命令。
- Redis 3.0 :2015年發(fā)布,推出官方分布式方案Redis Cluster,優(yōu)化小對象內(nèi)存訪問,新增client pause命令。
- Redis 3.2 :2016年發(fā)布,添加GEO地理信息處理功能,引入List新編碼類型quicklist,新增hstrlen命令。
- Redis 4.0 :2017年發(fā)布,引入模塊系統(tǒng),優(yōu)化主從復(fù)制為PSYNC2.0,新增LFU緩存淘汰算法,支持非阻塞del/flush命令。
- Redis 5.0 :2018年發(fā)布,新增流數(shù)據(jù)類型(Stream),升級Redis模塊API,RDB文件包含LFU/LRU信息。
- Redis 6.0 :2020年發(fā)布,支持多線程IO,優(yōu)化模塊API,改進(jìn)過期鍵處理機制,新增SSL支持。
- Redis 7.0 :2022年發(fā)布,新增Function自定義函數(shù)庫,支持Client-Eviction機制、Sharded-Pub/Sub,提供命令執(zhí)行耗時直方圖。
五、Ubuntu 安裝 Redis 6
相較于Redis 7, Redis 6 已經(jīng)具備了大部分功能,且更容易安裝。
Redis官方不支持Windows系統(tǒng),因為Redis的特性與Linux息息相關(guān)。又由于Redis的優(yōu)秀特性,微軟的開源技術(shù)組也維護(hù)了一個 Redis 的windows版本分支,不過仍然建議在Linux上學(xué)習(xí)使用Redis。
1. 更新apt軟件源
sudo apt update
2. 安裝 Redis
sudo apt install redis
3. 修改配置文件支持遠(yuǎn)程連接
修改 /etc/redis/redis.conf (注意需要sudo權(quán)限)
- 修改 bind 127.0.0.1 為 bind 0.0.0.0
- 修改protected-mode yes 為 protected-mode no
4. 重啟redis服務(wù)
sudo service redis-server restart
5. 檢驗redis狀態(tài)
- 通過netstat命令
netstat -anp | grep redis
2. 啟動redis客戶端
redis-cli
啟動完成后輸入ping,若返回pong,則redis連接正常
使用ctrl + d 退出客戶端。
到此這篇關(guān)于初始Redis概念、特性、使用場景、安裝教程的文章就介紹到這了,更多相關(guān)redis安裝使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redis有序集合類型的操作_動力節(jié)點Java學(xué)院整理
今天通過本文給大家說一下Redis中最后一個數(shù)據(jù)類型 “有序集合類型”,需要的的朋友參考下吧2017-08-08Redis Redisson lock和tryLock的原理分析
這篇文章主要介紹了Redis Redisson lock和tryLock的原理分析,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04Redis事務(wù)涉及的watch、multi等命令詳解
這篇文章主要介紹了Redis事務(wù)涉及的watch、multi等命令,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值 ,需要的朋友可以參考下2018-10-10