當前位置:
首頁 > 最新 > 學會這15點,讓你分分鐘拿下Redis資料庫

學會這15點,讓你分分鐘拿下Redis資料庫

有趣有內涵的文章第一時間送達!

1、Redis簡介

REmote DIctionary Server(Redis)是一個由Salvatore Sanfilippo寫的key-value存儲系統。Redis是一個開源的使用ANSI C語言編寫、遵守BSD協議、支持網路、可基於內存可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。它通常被稱為數據結構伺服器,因為值(value)可以是 字元串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等類型。

大家都知道了redis是基於key-value的no sql資料庫,因此,先來了解一下關於key相關的知識點

1、任何二進位的序列都可以作為key使用

2、Redis有統一的規則來設計key

3、對key-value允許的最大長度是512MB

2、支持的語言

3、Redis的應用場景到底有哪些??

1、最常用的就是會話緩存

2、消息隊列,比如支付

3、活動排行榜或計數

4、發布、訂閱消息(消息通知)

5、商品列表、評論列表

4、Redis安裝

安裝的大概步驟如下:

Redis是c語言開發的,安裝redis需要c語言的編譯環境

如果沒有gcc需要在線安裝:yum install gcc-c++

第一步:獲取源碼包:wget http://download.redis.io/releases/redis-3.0.0.tar.gz

第二步:解壓縮redis:tar zxvf redis-3.0.0.tar.gz

第三步:編譯。進入redis源碼目錄(cd redis-3.0.0)。執行 make

第四步:安裝。make install PREFIX=/usr/local/redis

#PREFIX參數指定redis的安裝目錄

5、Redis數據類型

Redis一共支持五種數據類型

1、string(字元串)

2、hash(哈希)

3、list(列表)

4、set(集合)

5、zset(sorted set 有序集合)

string(字元串)

它是redis最基本的數據類型,一個key對應一個value,需要注意是一個鍵值最大存儲512MB。

相關命令介紹

set 為一個Key設置value(值)

get 獲得某個key對應的value(值)

getset 為一個Key設置value(值)並返回對應的值

mset 為多個key設置value(值)

hash(哈希)

redis hash是一個鍵值對的集合, 是一個string類型的field和value的映射表,適合用於存儲對象

相關命令介紹

hset 將Key對應的hash中的field配置為value,如果hash不存則自動創建,

hget 獲得某個hash中的field配置的值

hmset 批量配置同一個hash中的多個field值

hmget 批量獲得同一個hash中的多個field值

list(列表)

是redis簡單的字元串列表,它按插入順序排序

相關命令介紹

lpush 向指定的列表左側插入元素,返回插入後列表的長度

rpush 向指定的列表右側插入元素,返回插入後列表的長度

llen 返回指定列表的長度

lrange 返回指定列表中指定範圍的元素值

set(集合)

是string類型的無序集合,也不可重複

相關命令介紹

sadd 添加一個string元素到key對應的set集合中,成功返回1,如果元素存在返回0

smembers 返回指定的集合中所有的元素

srem 刪除指定集合的某個元素

zset(sorted set 有序集合)

是string類型的有序集合,也不可重複

sorted set中的每個元素都需要指定一個分數,根據分數對元素進行升序排序,如果多個元素有相同的分數,則以字典序進行升序排序,sorted set 因此非常適合實現排名

相關命令介紹

zadd 向指定的sorteset中添加1個或多個元素

zrem 從指定的sorteset中刪除1個或多個元素

zcount 查看指定的sorteset中指定分數範圍內的元素數量

zscore 查看指定的sorteset中指定分數的元素

zrangebyscore 查看指定的sorteset中指定分數範圍內的所有元素

6、鍵值相關的命令

exists#確認key是否存在

del#刪除key

expire#設置Key過期時間(單位秒)

persist#移除Key過期時間的配置

rename#重命名key

type#返回值的類型

7、Redis服務相關的命令

slect#選擇資料庫(資料庫編號0-15)

quit#退出連接

info#獲得服務的信息與統計

monitor#實時監控

config get#獲得服務配置

flushdb#刪除當前選擇的資料庫中的key

flushall#刪除所有資料庫中的key

8、Redis的發布與訂閱

Redis發布與訂閱(pub/sub)是它的一種消息通信模式,一方發送信息,一方接收信息。

下圖是三個客戶端同時訂閱同一個頻道

下圖是有新信息發送給頻道1時,就會將消息發送給訂閱它的三個客戶端

9、Redis事務

Redis事務可以一次執行多條命令

1、發送exec命令前放入隊列緩存,結束事務

2、收到exec命令後執行事務操作,如果某一命令執行失敗,其它命令仍可繼續執行

3、一個事務執行的過程中,其它客戶端提交的請求不會被插入到事務執行的命令列表中

一個事務經歷三個階段

開始事務(命令:multi)

命令執行

結束事務(命令:exec)

10、Redis安全配置

可以通過修改配置文件設備密碼參數來提高安全性


#requirepass foobared

去掉注釋#號就可以配置密碼

沒有配置密碼的情況下查詢如下

配置密碼之後,就需要進行認證

11、Redis持久化

Redis持久有兩種方式:Snapshotting(快照),Append-only file(AOF)

Snapshotting(快照)

1、將存儲在內存的數據以快照的方式寫入二進位文件中,如默認dump.rdb中

2、save 900 1

#900秒內如果超過1個Key被修改,則啟動快照保存

3、save 300 10

#300秒內如果超過10個Key被修改,則啟動快照保存

4、save 60 10000

#60秒內如果超過10000個Key被修改,則啟動快照保存

Append-only file(AOF)

1、使用AOF持久時,服務會將每個收到的寫命令通過write函數追加到文件中(appendonly.aof)

2、AOF持久化存儲方式參數說明

appendonly yes

#開啟AOF持久化存儲方式

appendfsync always

#收到寫命令後就立即寫入磁碟,效率最差,效果最好

appendfsync everysec

#每秒寫入磁碟一次,效率與效果居中

appendfsync no

#完全依賴OS,效率最佳,效果沒法保證

12、Redis 性能測試

自帶相關測試工具

實際測試同時執行100萬的請求

13、Redis的備份與恢復

Redis自動備份有兩種方式

第一種是通過dump.rdb文件實現備份

第二種使用aof文件實現自動備份

dump.rdb備份

Redis服務默認的自動文件備份方式(AOF沒有開啟的情況下),在服務啟動時,就會自動從dump.rdb文件中去載入數據。

具體配置在redis.conf

save 900 1

save 300 10

save 60 10000

也可以手工執行save命令實現手動備份

redis快照到dump文件時,會自動生成dump.rdb的文件

SAVE命令表示使用主進程將當前資料庫快照到dump文件

BGSAVE命令表示,主進程會fork一個子進程來進行快照備份

兩種備份不同之處,前者會阻塞主進程,後者不會。

恢復舉例

將備份文件備份到其它目錄

刪除數據

關閉服務,將原備份文件拷貝回save備份目錄

登錄查看數據是否恢復

AOF自動備份

redis服務默認是關閉此項配置

配置文件的相關參數,前面已經詳細介紹過。

AOF文件備份,是備份所有的歷史記錄以及執行過的命令,和mysql binlog很相似,在恢復時就是重新執次一次之前執行的命令,需要注意的就是在恢復之前,和資料庫恢復一樣需要手工刪除執行過的del或誤操作的命令。

AOF與dump備份不同

1、aof文件備份與dump文件備份不同

2、服務讀取文件的優先順序不同,會按照以下優先順序進行啟動

如果只配置AOF,重啟時載入AOF文件恢複數據

如果同時 配置了RBD和AOF,啟動是只載入AOF文件恢複數據

如果只配置RBD,啟動時將載入dump文件恢複數據

注意:只要配置了aof,但是沒有aof文件,這個時候啟動的資料庫會是空的

14、Redis 生產優化介紹

1、內存管理優化

hash-max-ziplist-entries 512

hash-max-ziplist-value 64

list-max-ziplist-entries 512

list-max-ziplist-value 64

#list的成員與值都不太大的時候會採用緊湊格式來存儲,相對內存開銷也較小

在linux環境運行Redis時,如果系統的內存比較小,這個時候自動備份會有可能失敗,需要修改系統的vm.overcommit_memory 參數,這個參數是linux系統的內存分配策略

0 表示內核將檢查是否有足夠的可用內存供應用進程使用;如果有足夠的可用內存,內存申請允許;否則,內存申請失敗,並把錯誤返回給應用進程。

1 表示內核允許分配所有的物理內存,而不管當前的內存狀態如何。

2 表示內核允許分配超過所有物理內存和交換空間總和的內存

Redis官方的說明是,建議將vm.overcommit_memory的值修改為1,可以用下面幾種方式進行修改:

(1)編輯/etc/sysctl.conf 改vm.overcommit_memory=1,然後sysctl -p 使配置文件生效

(2)sysctl vm.overcommit_memory=1

(3)echo 1 > /proc/sys/vm/overcommit_memory

2、內存預分配

3、持久化機制

定時快照:效率不高,會丟失數據

AOF:保持數據完整性(一個實例的數量不要太大2G最大)

優化總結

1)根據業務需要選擇合適的數據類型

2)當業務場景不需持久化時就關閉所有持久化方式(採用ssd磁碟來提升效率)

3)不要使用虛擬內存的方式,每秒實時寫入AOF

4)不要讓REDIS所在的伺服器物理內存使用超過內存總量的3/5

5)要使用maxmemory

6)大數據量按業務分開使用多個redis實例

15、Redis集群應用

集群是將多個redis實例集中在一起,實現同一業務需求,或者實現高可用與負載均衡

到底有哪些集群方案呢??

1、haproxy+keepalived+redis集群

1)通過redis的配置文件,實現主從複製、讀寫分離

2)通過haproxy的配置,實現負載均衡,當從故障時也會及時從集群中T除

3)利用keepalived來實現負載的高可用

2、redis官方Sentinel集群管理工具

1)sentinel負責對集群中的主從服務監控、提醒和自動故障轉移

2)redis集群負責對外提供服務

關於redis sentinel cluster集群配置可參考

3、Redis Cluster

Redis Cluster是Redis的分散式解決方案,在Redis 3.0版本正式推出的,有效解決了Redis分散式方面的需求。當遇到單機內存、並發、流量等瓶頸時,可以採用Cluster架構達到負載均衡的目的。

1)官方推薦,毋庸置疑。

2)去中心化,集群最大可增加1000個節點,性能隨節點增加而線性擴展。

3)管理方便,後續可自行增加或摘除節點,移動分槽等等。

4)簡單,易上手。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 民工哥Linux運維 的精彩文章:

高性能、高可用平台架構的演變過程

TAG:民工哥Linux運維 |