1. 程式人生 > >[Redis學習] 初識Redis

[Redis學習] 初識Redis

1.Redis特性

  Redis是基於記憶體的Key-Value型高效能的NoSQL資料庫。Redis之所以受到如此多公司的青睞,必然有之過人之處,下面關於Redis的8個重要特性。

1.1 速度快

  正常情況下,Redis執行命令的速度非常快,下面我們分析一下Redis速度快的原因。可以大致歸納為一下四點:
1. Redis的所有資料都是存放在記憶體中的,所以把資料放在記憶體中是Redis速度快的最主要原因。
2. Redis是用C語言實現的,一般來說C語言實現的程式“距離”作業系統更近,執行速度 相對會快。
3. Redis使用了單執行緒架構,預防了多執行緒可能產生的競爭問題。
4. 作者對於Redis原始碼的精打細磨

1.2 基於鍵值對的資料結構伺服器

  Redis中的值不僅可以是字串,而且還可以是具體的資料結構,這樣不僅能便於在許多應用場景開發,同時也能夠提高開發效率。Redis主要提供了5種資料結構:字串、雜湊、列表、集合、有序集合,同時在字串的基礎上演變出了點陣圖(Bitmaps)和HyperLogLog兩種神奇的“資料結構”,並且隨著LBS(基於位置服務)的不斷髮展,加入了有關GEO(地理資訊定位)的功能,總之在這些資料結構的幫助下,開發者可以開發出各種“有意思”的應用。

1.3 豐富的功能

除了上面提到的5中資料結構,Redis還提供了許多額外的功能:

  • 提供了鍵過期功能,可以用來實現快取
  • 提供了釋出訂閱功能,可以用來實現訊息系統
  • 提供了簡單的事務功能,能在一定程度上保證事務特性
  • 提供了流水線(Pipeline)功能,這樣客戶端能將一批命令一次性傳到Redis,減少了網路的開銷。

1.4 簡單穩定

  Redis的簡單主要表現在三個方面。首先,Redis的原始碼很少,早期版本的程式碼只有兩萬行左右,3.0版本以後由於添加了叢集特性,程式碼增至5萬行左右,相對於很多NoSQL資料庫來說程式碼量相對少很多。其次,Redis使用單執行緒模型,這樣不僅使得Redis服務端處理模型變得簡單,而且也使得客戶端開發變得簡單。最後,Redis不需要依賴於作業系統中的類庫,Redis自己實現了事件處理的相關功能。

  Redis雖然簡單,但是非常穩定。

1.5 客戶端語言多

  Redis提供了簡單的TCP通訊協議,很多程式語言可以很方便的接入到Redis,並且由於Redis收到社群和各大公司的廣泛認可,所以支援Redis的客戶端語言也非常多,幾乎涵蓋了主流的程式語言。

1.6 持久化

  通常看,將資料放在記憶體中是不安全的,一旦發生斷點或者機器故障,重要的資料會丟失,因此Redis提供了兩種持久化方式:

RDB
AOF

即可以用兩種策略將記憶體的資料儲存到硬碟中,這樣就保證了資料的可永續性。
這裡寫圖片描述

1.7 主從複製

  Redis提供了複製功能,實現了多個相同資料的Redis副本,複製功能是分散式Redis的基礎。
這裡寫圖片描述

1.8 高可用和分散式

  Redis從2.8版本提供了高可用實現Redis Sentinel,它能夠保證Redis節點的故障發現和故障自動轉移。Redis從3.0版本正式提供了分散式實現Redis Cluster,它是Redis真正的分散式實現,提供了高可用、讀寫和容量的擴充套件性。

2.Redis使用場景

2.1 快取

  快取機制幾乎在所有的大型網站都有使用,合理的使用快取不僅可以加快資料的訪問速度,而且能夠有效降低後端資料來源的壓力。Redis提供了鍵值過期時間設定,並且也提供了靈活控制最大記憶體和記憶體溢位後的淘汰策略。可以說,一個合理的快取設計能夠為一個網站的穩定保駕護航。

2.2 排行榜系統

  排行榜系統幾乎存在於所有的網站,例如按照熱度排名的排行榜,按照發布時間的排行榜,按照各種複雜維度計算出的排行榜,Redis提供了列表和有序集合資料結構,合理的使用這些資料結構可以很方便的構建各種排行榜系統。

2.3 計數器應用

  計數器在網站中的作用至關重要,例如視訊網站的有播放數,電商網站有瀏覽數,為了保證資料的實時性,每一個播放和瀏覽都要做加1操作,如果併發量很大對於傳統關係型資料的效能是一種挑戰。Redis天然支援計數功能而且計數的效能非常好,可以說是計數器系統的重要選擇。

2.4 社交網路

  贊、踩、粉絲、共同好友、推送、下拉重新整理等是社交網站的必備功能,Redis提供的資料結構可以相對比較容易的實現這些功能。

2.5 訊息佇列系統

  訊息佇列系統可以說是一個大型網站的必備基礎元件,因為其具有業務解耦、非實時業務削峰等特性。Redis提供了釋出訂閱功能和阻塞佇列的功能,雖然和專業的訊息佇列比還不夠足夠強大,但是對於一般的訊息佇列功能基本可以滿足。

3.正確安裝並啟動Redis

3.1 Redis單機版搭建

  1. 安裝gcc編譯環境,使用命令
yum install gcc-c++
  1. 將redis原始碼上傳到伺服器/usr/local目錄下

  2. 解壓縮redis原始碼包

tar -zxvf redis-4.0.2.tar.gz
  1. 進入到解壓縮的資料夾下進行編譯
make
  1. 安裝
make install PREFIX=/usr/local/redis

【說明】:

PREFIX=/usr/local/redis是指定redis的安裝目錄

  1. 啟動檢測是否安裝成功

有兩種啟動方式,前端啟動和後臺啟動

① 前端啟動

./redis-server

這裡寫圖片描述

② 後臺啟動

1> 複製編譯目錄下的redis.conf到redis的安裝目錄

cd /usr/local/redis-4.0.2
cp redis.conf /usr/local/redis/bin/

2> 修改redis.conf,將daemonize no改為daemonize yes

cd /usr/local/redis/bin/
vim redis.conf

修改完成後儲存退出:命令 ESC :wq

3> 執行啟動命令

./redis-server redis.conf

這裡寫圖片描述

4> 使用命令檢視是否啟動

ps aux|grep redis

這裡寫圖片描述

5> 啟動redis客戶端

./redis-cli
keys *

退出redis客戶端輸入:

quit

如下圖所示,則證明redis已經可用了!
這裡寫圖片描述

6> 開放6379埠或關閉防火牆

firewall-cmd --zone=public --add-port=6379/tcp --permanent

【問題】
當我使用Redis Desktop Manager連線的時候總是連線不上,即使防火牆也關閉了,經過排查發現是redis的配置檔案中bind繫結的IP是127.0.0.1,而我連線使用的IP是虛擬機器IP。
將redis.conf的配置檔案如下圖所示的地方改為虛擬機器IP後重新啟動redis就可以了:
這裡寫圖片描述

3.2 Redis啟動前的配置

生產環境中,要把redis作為一個系統的daemon程序去執行的,每次系統啟動,redis程序一起啟動。

3.2.1 Redis各檔案目錄設定

  1. redis的解壓目錄下,進入utils目錄中,找到redis_init_script指令碼
  2. 將redis_init_script指令碼拷貝到linux的/etc/init.d目錄中,將redis_init_script重新命名為redis_6379,6379是我們希望這個redis例項監聽的埠號
  3. 修改redis_6379指令碼的第6行的REDISPORT,設定為相同的埠號(預設就是6379)
  4. 建立兩個目錄: /etc/redis (存放redis的配置檔案) , /var/redis/6379 (存放redis的持久化檔案)
  5. 修改redis配置檔案(預設根目錄下,redis.conf),拷貝到/etc/redis目錄中,修改名稱為6379.conf
  6. 修改redis.conf中的部分配置為生產環境
daemonize   yes                             讓redis以daemon程序進行
pidfile     /var/run/redis_6379.pid         設定redis的pid檔案位置
port        6379                            設定redis的監聽埠號
dir         /var/redis/6379                 設定持久化檔案的儲存位置

3.2.2 啟動redis,執行指令碼

cd /etc/init.d/redis_6379
./redis_6379 start
  1. 讓redis跟隨系統啟動自動啟動
    在redis_6379指令碼中,最上面,加入兩行註釋
#chkconfig:2345 90 10
#description: Redis is a persistent key-value database
  1. 執行如下命令設定開機自啟
chkconfig redis_6379 on

3.2.3 redis-cli的使用

redis-cli SHUTDOWN   連線本機的6379
redis-cli -h 127.0.0.1 -p 6379 SHUTDOWM   指定要連線的ip和埠號
redis-cli PING ping redis的埠,看是否正常
redis-cli 進入互動式命令列
SET K1 V1
GET K1