超強Redis一篇入門

點贊多大膽,就有多大產路漫漫其修遠兮,吾將上下而求索,獻給每一位技術使用者和愛好者!

乾貨滿滿,擺好姿勢,點贊發車

Redis系列目錄

最近工作要講到Redis,之前也推出了Redis的文章,現在對Redis系列文章重新編排整理升級(損失了好多積分),本Redis系列後期還會持續更新內容,大家可持續關注,希望可以幫到Redis愛好者和使用者,乾貨滿滿,我們出發吧!

《Redis一篇入門》

《Redis常用API命令整理》

《最新超詳細註釋解析SpringBoot2.X操作Redis5.X》

《Redis 主從複製 高可用和分佈式基石》

《一氣呵成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或者設置訪問密碼

 

我是芝士,用你勤勞的雙手點個贊吧,這將是我創作更多優質文章的動力,好不好嘛!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章