點贊多大膽,就有多大產!路漫漫其修遠兮,吾將上下而求索,獻給每一位技術使用者和愛好者!
乾貨滿滿,擺好姿勢,點贊發車
Redis系列目錄
最近工作要講到Redis,之前也推出了Redis的文章,現在對Redis系列文章重新編排整理升級(損失了好多積分),本Redis系列後期還會持續更新內容,大家可持續關注,希望可以幫到Redis愛好者和使用者,乾貨滿滿,我們出發吧!
《最新超詳細註釋解析SpringBoot2.X操作Redis5.X》
《一氣呵成Redis Sentinel從配置到編碼實現Redis高可用故障轉移》
《Redis Cluster 集羣模式從零理論 加 集羣搭建》
《Redis Cluster集羣 升級 集羣伸縮和SpringBoot操作Redis 集羣》
初識Redis
什麼是Redis
完全開源免費,使用C語言編寫,遵守BSD協議的一個高性能key-value分佈式內存數據庫並提供持久化的NoSQL數據庫。Redis支持五種數據類型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合),可用作數據庫、緩存和消息中間件。
Redis特性
速度快
Redis官方給出的數據是10W QPS(每秒可以操作數據10W次),這個數據會根據電腦性能和Redis的使用方式不同而略微不同,但是在萬級數據中操作沒有壓力。
那麼Redis爲什麼這麼快,主要有以下幾個方面
1、純內存操作
數據存放在內存中,內存的響應時間大約是 100納秒 ,這是Redis每秒萬億級別訪問的重要基礎。
2、編程語言
純ANSI C編寫,不依賴第三方類庫,沒有像memcached那樣使用libevent,因爲libevent迎合通用性而造成代碼龐大,所以作者用libevent中兩個文件修改實現了自己的epoll event loop。
3、線程模型
Redis使用單線程操作,避免了頻繁的上下文切換,雖然是採用單線程,但是單線程避免了不必要的上下文切換和競爭條件,也不存在多進程或者多線程導致的切換而消耗 CPU;雖然作者認爲CPU不是瓶頸,內存與網絡帶寬纔是,但實際測試時並非如此。
4、採用了非阻塞I/O多路複用機制
多路I/O複用模型是利用 select、poll、epoll 可以同時監察多個流的 I/O 事件的能力,在空閒的時候,會把當前線程阻塞掉,當有一個或多個流有 I/O 事件時,就從阻塞態中喚醒,於是程序就會輪詢一遍所有的流(epoll 是隻輪詢那些真正發出了事件的流),並且只依次順序的處理就緒的流,這種做法就避免了大量的無用操作。這裏“多路”指的是多個網絡連接,“複用”指的是複用同一個線程。加上Redis自身的事件處理模型將epoll中的連接,讀寫,關閉都轉換爲了事件,不在I/O上浪費過多的時間
持久化
Redis的數據存儲在內存中,對數據的更新會異步存儲在磁盤中,Redis提供兩種持久化策略保證服務在宕機或者斷電等不正常情況發生時,重啓Redis服務來恢復數據到內存中。
多種數據結構
Redis提供了string、List、set、Zset、Hash五種數據結構來存儲數據,而memcached只支持string數據類型。在redis的新版本中提供了 bitmaps(位圖), hyperloglogs (超小內存唯一值計數)和 geospatial(地理空間)數據類型
支持多種編程語言
功能豐富
1、消息發佈訂閱
2、Lua腳本
3、事務
4、pipeline
簡單
Redis單節點的核心代碼只有23000行,我們來喫透Redis這個項目,或者有些企業通過修改Redis源代碼來實現定製化功能都是非常容易的,Redis不依賴於外部的第三庫,單線程模型,無論服務端還是客戶端開發都會相對容易。
主從複製
在Redis中有主從複製,分爲主服務器和從服務器兩個角色,主服務器數據可以同步到從服務器上,可以爲高可用和分佈式提供很好的基礎。
高可用和分佈式
Redis的單點或者主從複製模型,如果想要實現高可用是比較困難的,在2.8版本推出Redis-Sentinel支持高可用,Redis在3.0版本推出Redis-Cluster支持分佈式
Redis典型應用場景
緩存系統
由於redis訪問速度塊、支持的數據類型比較豐富,所以redis很適合用來存儲熱點數據,另外結合expire,我們可以設置過期時間然後再進行緩存更新操作,這個功能最爲常見,我們幾乎所有的項目都有所運用
限時業務
redis中可以使用expire命令設置一個鍵的生存時間,到時間後redis會刪除它。利用這一特性可以運用在限時的優惠活動信息、手機驗證碼等業務場景
計數器
redis由於incrby命令可以實現原子性的遞增,所以可以運用於高併發的秒殺活動、分佈式序列號的生成、具體業務還體現在比如限制一個手機號發多少條短信、一個接口一分鐘限制多少請求、一個接口一天限制調用多少次等等
排行榜
關係型數據庫在排行榜方面查詢速度普遍偏慢,所以可以藉助redis的SortedSet進行熱點數據的排序。在實際運用中性能體驗也蠻不錯
分佈式鎖
這個主要利用redis的setnx命令進行,setnx:"set if not exists"就是如果不存在則成功設置緩存同時返回1,否則返回0 ,如果我們服務器是集羣的,定時任務可能在兩臺機器上都會運行,所以在定時任務中首先 通過setnx設置一個lock,如果成功設置則執行,如果沒有成功設置,則表明該定時任務已執行。 當然結合具體業務,我們可以給這個lock加一個過期時間,比如說30分鐘執行一次的定時任務,那麼這個過期時間設置爲小於30分鐘的一個時間 就可以,這個與定時任務的週期以及定時任務執行消耗時間相關。我們可以將這個特性運用於其他需要分佈式鎖的場景中,結合過期時間主要是防止死鎖的出現。zookeeper也可以來實現分佈式鎖
延時操作
比如在訂單生產後我們佔用了庫存,10分鐘後去檢驗用戶是夠真正購買,如果沒有購買將該單據設置無效,同時還原庫存。 由於redis自2.8.0之後版本提供Keyspace Notifications功能,允許客戶訂閱Pub/Sub頻道,以便以某種方式接收影響Redis數據集的事件。 所以我們對於上面的需求就可以用以下解決方案,我們在訂單生產時,設置一個key,同時設置10分鐘後過期, 我們在後臺實現一個監聽器,監聽key的失效,監聽到key失效時將後續邏輯加上。 當然我們也可以利用rabbitmq、activemq等消息中間件的延遲隊列服務實現該需求
點贊、好友等相互關係的存儲
Redis set對外提供的功能與list類似是一個列表的功能,特殊之處在於set是可以自動排重的,當你需要存儲一個列表數據,又不希望出現重複數據時,set是一個很好的選擇,並且set提供了判斷某個成員是否在一個set集合內的重要接口,這個也是list所不能提供的。 又或者在微博應用中,每個用戶關注的人存在一個集合中,就很容易實現求兩個人的共同好友功能
隊列
由於redis有list push和list pop這樣的命令,所以能夠很方便的執行隊列操作,如果你要實現複雜的隊列使用RabbitMQ等專業隊列中間件
Redis的使用場景還有很多很多這裏就不一一列舉額,大家掌握Redis的特性在工作中可以靈活運用即可
Redis安裝和配置
Redis安裝環境
Redis可以在windows下和Unix下安裝,我們這裏選擇使用Linux下安裝,也是推薦的一種方式
下載
我們進入到/usr/local目錄下下載安裝包,或者到官網下載之後上傳到Linux上。下載地址:http://download.redis.io/releases/
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
解壓安裝
解壓
tar -zxvf redis-5.0.5.tar.gz
安裝
進入到redis解壓目錄運行make & make install進行編譯安裝
make & make install
Redis核心文件目錄介紹
src目錄
Redis的核心目錄是src目錄,在Redis的安裝目錄下,Redis的相關啓動關閉命令就在該目錄下
redis-server------------>操作Redis服務器命令
redis-cli----------------->Redis命令行客戶端
redis-benchmark----->Redis性能檢測工具
redis-check-aof------->AOF文件修復工具
redis-check-rdb---->RDB文件檢查工具
redis-sentinel---------->Sentinel服務器(2.8以後版本)
我們目前需要關心的是redis-server和redis-cli這兩個命令
redis.conf文件
redis.conf配置文件在redis的安裝目錄下,這個是redis的核心配置文件,如果我們要修改配置可以讀取該文件,默認讀取redis安裝目錄下的這個配置文件,我們在啓動Redis時也可以指定配置文件讀取。
動點手腳
我們進入到src目錄下之後發現有很多文件,我們需要使用的就是那麼幾個可執行命令,我們可以在redis安裝目錄下創建bin目錄將可執行文件拷貝進來,方便使用。參考圖如下,大家使用cp命令即可實現
redis啓動和連接
默認啓動
使用默認的配置啓動redis,直接使用redis-server命令即可,使用非守護進程的方式啓動,會佔用當前操作窗口,我們可以之間按ctrl+c退出Redis
redis-server
動態參數
我們可以使用動態參數方式連接redis,我們指定端口號爲6380
redis-server --port 6380
指定配置文件(推薦使用)
1、在redis安裝目錄下創建conf目錄存儲配置文件
mkdir conf
2、將redis.conf配置文件中的內容去除註釋和空格等輸出到指定配置文件(redis-6379.conf)中
cat redis.conf | grep -v "#" | grep -v "^$" >> conf/redis-6379.conf
3、修改redis-6379.conf文件,大家修改時注意註釋的地方即可
#bind 127.0.0.1
protected-mode no
port 6379
daemonize yes
logfile "/var/redis-5.0.5/logs/redis.log"
dir "/var/redis-5.0.5/data"
4、創建data和logs目錄
mkdir -p /var/redis-5.0.5/data /var/redis-5.0.5/logs
5、啓動,redis-server後跟上配置文件路徑即可
redis-server conf/redis-6379.conf
6、查看redis進程
ps -ef | grep redis
客戶端連接
我們這裏使用命令行客戶端連接redis,使用redis-cli命令 -h寫ip,-p寫端口
redis-cli -h 127.0.0.1 -p 6379
測試使用
ping命令如果返回PONG代表連接成功
set 設置String類型值,k1、爲鍵,hello爲值
get 根據鍵獲取值,k1爲鍵,hello爲返回的值
Redis常用配置
Redis的配置有很多,這裏我們是簡單入門說一些常用的配置,其他的配置我們在指定的模塊貼出,這些配置都是在我們上邊說到的redis.conf文件中
daemonize
大概在136行,默認爲no,是否將redis進程當做守護進程在後臺運行,我們可以將其設置爲yes
port
大概在92行,redis的默認端口爲6379,如果需要單節點上啓動多個redis實例,需要修改端口號
logfile
大概在171行,配置redis的日誌文件,默認什麼都沒有,我們可以修改日誌想要存儲的路徑等,查看redis運行的情況
dir
大概在263行,配置redis的持久化文件存儲路徑,默認是./也就是當前路徑,也就是啓動redis-server命令的路徑,可以按需修改
bind
大概在69行,是綁定本機的IP地址,(準確的是:本機的網卡對應的IP地址,每一個網卡都有一個IP地址),而不是redis允許來自其他計算機的IP地址。如果指定了bind,則說明只允許來自指定網卡的Redis請求。如果沒有指定,就說明可以接受來自任意一個網卡的Redis請求,我這裏直接將其註釋掉
protected-mode
大概在88行,redis3.2版本後新增protected-mode配置,默認是yes,即開啓。設置外部網絡連接redis服務,設置方式如下:
1、關閉protected-mode模式,此時外部網絡可以直接訪問
2、開啓protected-mode保護模式,需配置bind ip或者設置訪問密碼
我是芝士,用你勤勞的雙手點個贊吧,這將是我創作更多優質文章的動力,好不好嘛!