[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單機版搭建
- 安裝gcc編譯環境,使用命令
yum install gcc-c++
將redis原始碼上傳到伺服器/usr/local目錄下
解壓縮redis原始碼包
tar -zxvf redis-4.0.2.tar.gz
- 進入到解壓縮的資料夾下進行編譯
make
- 安裝
make install PREFIX=/usr/local/redis
【說明】:
PREFIX=/usr/local/redis是指定redis的安裝目錄
- 啟動檢測是否安裝成功
有兩種啟動方式,前端啟動和後臺啟動
① 前端啟動
./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各檔案目錄設定
- redis的解壓目錄下,進入utils目錄中,找到redis_init_script指令碼
- 將redis_init_script指令碼拷貝到linux的/etc/init.d目錄中,將redis_init_script重新命名為redis_6379,6379是我們希望這個redis例項監聽的埠號
- 修改redis_6379指令碼的第6行的REDISPORT,設定為相同的埠號(預設就是6379)
- 建立兩個目錄: /etc/redis (存放redis的配置檔案) , /var/redis/6379 (存放redis的持久化檔案)
- 修改redis配置檔案(預設根目錄下,redis.conf),拷貝到/etc/redis目錄中,修改名稱為6379.conf
- 修改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
- 讓redis跟隨系統啟動自動啟動
在redis_6379指令碼中,最上面,加入兩行註釋
#chkconfig:2345 90 10
#description: Redis is a persistent key-value database
- 執行如下命令設定開機自啟
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