NoSQL之Redis配置解析

weixin_50345481發表於2020-12-17


前言

通過從Redis與Memcached應用差別,Redis的資料型別的解析,配置。可以比較完善的理解,掌握Redis的相關知識。


一 儲存資料與資料庫分類

1.1 儲存資料型別分類

結構化資料:可以通過二維表格形式表述這個資料(使用者名稱,密碼)
非結構化資料:不方便以二維表格形式表述的這種型別的資料(圖片)

1.2 根據不同種儲存資料型別分類分成兩種不同型別的資料庫:

sql結構化資料庫:裡面儲存的資料型別是結構化資料。別稱稱為關係型資料庫
nospl非結構化資料庫:裡面儲存的資料型別是非結構化資料。別稱稱為非關係型資料庫

1.3 關聯式資料庫與非關聯式資料庫

1.3.1 關聯式資料庫

一個結構化的資料庫,建立在關係模型基礎上
一般面向於記錄

包括

Oracle,MySQL,SQL Server,Microsoft Access,DB2等

1.3.2 非關係型資料庫

不須建立連線,只存資料本身,存取,讀取速度快於關聯式資料庫
除了主流的關係型資料庫外的資料庫,都認為是非關係型

包括

Redis,MongBD,Hbase,CouhDB等

1.3.2 非關係型資料庫產生背景

High performance----對資料庫高併發讀寫需求
Huge Storage----對海量資料高效儲存與訪問需求
High Scalability && High Availability----對資料庫高可擴充套件性與高可用性需求

二 Redis介紹

2.1 Redis簡介

1.Redis基於記憶體執行並支援持久化

2.採用key-value(鍵值對)的儲存形式

key:關鍵詞
value:關鍵詞值

3.優點

具有極高的資料讀寫速度
支援豐富的資料型別
支援資料的持久化(資料寫入Redis記憶體中,記憶體具有易失性,寫入同時寫入硬碟中,或者支援二進位制日誌)
原子性(資料儲存方式不可分割,最簡)
支援資料備份(可選擇資料備份位置)

2.2 Redis與Memcached差別

說到快取技術,只要有一定經驗的開發人員,肯定會想到redis和memcached這兩個。並且在BAT裡,redis已經逐漸取代了memcached,成為分散式場景廣泛使用的快取方案。接下來,我們就分析下,redis是如何取代memcached,成為開發者的寵兒的。

2.2.1 支援的儲存型別不同

雖然redis和memcached都是記憶體型資料庫,並且memcached不僅能夠儲存string型別,還能夠儲存圖片、檔案、視訊等格式的檔案。然而對於更多的使用記憶體資料庫做快取以及分散式方案的程式開發者來說,memcached提供的string型別儲存的應用場景非常有限,而儲存圖片視訊的功能又十分雞肋(許多公司的使用者場景是沒這方面需求)。相比之下,redis提供set,hash,list等多種型別的儲存結構,非常適合分散式快取的實現。

2.2.2 資料落盤

memcached 資料不可恢復,雖然大多數人使用快取以及分散式方案都不會要求資料持久化,但是誰也不能保證不出現萬一的情況。一旦發生穩定性問題,memcached掛掉後,資料是不可恢復的,而redis除了支援在配置裡開啟資料落盤(RDB),還能通過aof來找回資料。

2.2.3 記憶體空間與資料量

memcached可以修改最大記憶體,使用的是LRU演算法,而redis目前底層使用了自己的VM,引入了新的特性突破了實體記憶體的限制。個人認為在這方面依然是redis更加優秀一些。
value值-redis最大可以達到1GB,而memcache只有1MB;

2.2.4 使用場景

2.2.4.1 會話快取(Session Cache)

最常用的一種使用Redis的情景是會話快取(session cache)。用Redis快取會話比其他儲存(如Memcached)的優勢在於:Redis提供持久化。當維護一個不是嚴格要求一致性的快取時,如果使用者的購物車資訊全部丟失,大部分人都會不高興的,現在,他們還會這樣嗎?幸運的是,隨著 Redis 這些年的改進,很容易找到怎麼恰當的使用Redis來快取會話的文件。甚至廣為人知的商業平臺Magento也提供Redis的外掛。

2.2.4.2 全頁快取(FPC)

除基本的會話token之外,Redis還提供很簡便的FPC平臺。回到一致性問題,即使重啟了Redis例項,因為有磁碟的持久化,使用者也不會看到頁面載入速度的下降,這是一個極大改進,類似PHP本地FPC。再次以Magento為例,Magento提供一個外掛來使用Redis作為全頁快取後端。
此外,對WordPress的使用者來說,Pantheon有一個非常好的外掛 wp-redis,這個外掛能幫助你以最快速度載入你曾瀏覽過的頁面。

2.2.4.3 佇列

Reids在記憶體儲存引擎領域的一大優點是提供 list 和 set 操作,這使得Redis能作為一個很好的訊息佇列平臺來使用。Redis作為佇列使用的操作,就類似於本地程式語言(如Python)對 list 的 push/pop 操作。如果你快速的在Google中搜尋“Redis queues”,你馬上就能找到大量的開源專案,這些專案的目的就是利用Redis建立非常好的後端工具,以滿足各種佇列需求。例如,Celery有一個後臺就是使用Redis作為broker,你可以從這裡去檢視。

2.2.4.4 排行榜/計數器

Redis在記憶體中對數字進行遞增或遞減的操作實現的非常好。集合(Set)和有序集合(Sorted Set)也使得我們在執行這些操作的時候變的非常簡單,Redis只是正好提供了這兩種資料結構。所以,我們要從排序集合中獲取到排名最靠前的10個使用者–我們稱之為“user_scores”,我們只需要像下面一樣執行即可:當然,這是假定你是根據你使用者的分數做遞增的排序。如果你想返回使用者及使用者的分數,你需要這樣執行:
ZRANGE user_scores 0 10 WITHSCORES
Agora Games就是一個很好的例子,用Ruby實現的,它的排行榜就是使用Redis來儲存資料的,你可以在這裡看到。

2.2.4.5 釋出/訂閱

最後(但肯定不是最不重要的)是Redis的釋出/訂閱功能。釋出/訂閱的使用場景確實非常多。我已看見人們在社交網路連線中使用,還可作為基於釋出/訂閱的指令碼觸發器,甚至用Redis的釋出/訂閱功能來建立聊天系統!(不,這是真的,你可以去核實)。

2.2.4.6 其他

但是如果是對快取的資料格式有更多的要求,且對安全性也有很高的要求的話,建議還是使用redis,這也是redis目前正在逐漸代替memcached的根本原因。

2.2.4.7 差別總結

                 Memcached                   Redis
型別            Key-value資料庫           Key-value資料庫
過期策略             支援                      支援
資料型別          單一資料型別               五大資料型別
持久化              不支援                     支援
主從複製            不支援                      支援  
虛擬記憶體            不支援                      支援

2.3 Redis解析:

Redis支援五種資料型別:string(字串),hash(雜湊),list(列表),set(集合)及zset(sorted set:有序集合)。

2.3.1 String(字串)

1.string 是 redis 最基本的型別,你可以理解成與 Memcached 一模一樣的型別,一個 key 對應一個 value。

2.string 型別是二進位制安全的。意思是 redis 的 string 可以包含任何資料。比如jpg圖片或者序列化的物件。

3.string 型別是 Redis 最基本的資料型別,string 型別的值最大能儲存 512MB。

4.用法示例:set 鍵  值 設定鍵值對     get   鍵   獲取鍵的值

set:設定
get:獲取
Set  sting1  8
sting1:鍵名
鍵值為8
設定鍵值為8
Get  string1
8
獲取鍵值為8
Incr string1
9
Incr:字增長 +1
Decr string1
8
Decr:自降 -1
Decrby string1 2
6
設定下降值為2
8-2=6
Incrby string1 5
11
設定增值為5
6+5=11

2.3.2 Hash(雜湊)

1.Redis hash 是一個鍵值(key=>value)對集合。

2.Redis hash 是一個 string 型別的 field 和 value 的對映表,hash 特別適合用於儲存物件。

3.用法示例:Hset:新增hash資料 hget:獲取hash資料 hmget:獲取多個hash資料

Hset hash1 key1 a
key1:關鍵詞1
設定欄位關鍵詞值為a
Hset hash1 key2 b
Hset hash1 key3 c
Hset hash1 field1 a1 field2 a2
Hget hash1 key1
獲取欄位關鍵詞值
Hmget hash1 key1 key2 key3
Hmget hash1 field1 field2
獲取多個欄位關鍵詞值

2.3.3 List(列表)

1.Redis 列表是簡單的字串列表,按照插入順序排序。你可以新增一個元素到列表的頭部(左邊)或者尾部(右邊)。


在這裡插入圖片描述

2.用法示例:lpush:從左邊推入值 lpop:從左邊彈出值  rpush:從右邊推入值 rpop:從右邊彈出值  llen:檢視某個list資料型別的長度

Lpush list1 1    從左邊輸入值 1
list1:鍵值名稱
Lpush list1 2
Lpush list1 3
Llen list1
3
儲存列表長度 3
Rpop list1
1
從右邊輸出第一個鍵值為 1
Llen list1
2
Lrange list1 列出所有list1的值

2.3.4 Set(集合)

1.Redis 的 Set 是 string 型別的無序集合。

2.集合是通過雜湊表實現的,所以新增,刪除,查詢的複雜度都是 o(1)。

3.sadd 命令新增一個 string 元素到 key 對應的 set 集合中,成功返回 1,如果元素已經在集合中返回 0。

sadd key member
scard:檢視set資料中存在的元素個數
sismember:判斷set資料中是否存在某個元素
srem:刪除某個set資料中的元素

4.用法示例:

sadd   set1  12
1
新增鍵值12 12未存在,則新增成功輸出返回1
sadd  set1  13
1
sadd   set1  12
0
新增鍵值12 12已存在,則新增失敗輸出返回0
Scard  set1
2
檢視set資料中存在的元素個數 個數2個
Sismember  set1  11
0
判斷set資料中是否存在鍵值11,不存在輸出返回0
Sismember  set1  13
1
Srem set1 13
1
刪除鍵值13 操作成功輸出返回1
Sismember set1  13
0
Smembers  set1 列出set1所有值

2.3.5 zset(sorted set:有序集合)

1.Redis zset 和 set 一樣也是string型別元素的集合,且不允許重複的成員。

2.不同的是每個元素都會關聯一個double型別的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。

3.zset的成員是唯一的,但分數(score)卻可以重複。

zadd 命令
新增元素到集合,元素在集合中存在則更新對應score
使用方法:zadd key score member
zcard:查詢
zrang:資料排序

4.用法示例:

Zadd zset1 1.1 val1  
新增 鍵值 分數1.1  成員
Zadd zset1 2.2 val2
Zadd zset1 3.3 val3
Zadd zset1 3.3 val33
Zcard zset1
4
查詢鍵值個數為4個
Zrangebyscore  zset1  0  10
在0-10個成員中,進行排序(最多11個成員)
1) val1
2) val2
3) val3
4) val33
Zrange  zset1  0  10  withscores
在0-10個成員中,進行排序,帶上分數(最多11個成員)
1) val1
2) 1.10000000000000001
3) Val2
4) 2.20000000000000002
5) Val3
6) 3.29999999999999998
7) Val3.3
8) 3.29999999999999998

2.3.6 各個資料型別應用場景解析

在這裡插入圖片描述

三 Redis應用部署

3.1 部署流程

新增安裝包
redis-5.0.4.tar.gz

1.解壓縮

[root@server1 ~]# tar zxvf redis-5.0.4.tar.gz 

在這裡插入圖片描述
2.設定編輯檔案

[root@server1 ~]# cd redis-5.0.4/
[root@server1 redis-5.0.4]# make   進行配置
[root@server1 redis-5.0.4]# make PREFIX=/usr/local/redis install  
更改安裝路徑可以用make PREFIX=安裝路徑 install

3.建立連結

[root@server1 redis-5.0.4]# ln -s /usr/local/redis/bin/* /usr/local/bin
[root@server1 redis-5.0.4]# cd
[root@server1 ~]# cd redis-5.0.4/  
[root@server1 redis-5.0.4]# cd /usr/local/redis/bin/  檢視命令
[root@server1 bin]# ls -lh

在這裡插入圖片描述

[root@server1 bin]# cd
[root@server1 ~]# cd redis-5.0.4/
[root@server1 redis-5.0.4]# cd utils/   尋找檢視安裝指令碼
[root@server1 utils]# ls -lh
./install_server.sh 執行指令碼安裝

在這裡插入圖片描述
在這裡插入圖片描述

3.1.1 安裝完成

可通過Redis的服務控制指令碼/etc/init.d/redis_6379來對Redis服務進行控制,如停止Redis服務,啟動Redis服務,重啟Redis服務,檢視Redis執行狀態

[root@server1 ~]# netstat -anpt | grep redis   檢視埠
[root@server1 ~]# /etc/init.d/redis_6379 stop   停止Redis服務
[root@server1 ~]# /etc/init.d/redis_6379 start    啟動Redis服務
[root@server1 ~]# netstat -anpt | grep redis   

在這裡插入圖片描述

3.1.2 redis-cli命令列工具

Redis資料庫系統也是一個典型的C/S(客戶端/伺服器端)架構的應用,要服務Redis資料庫需要使用

redis-cli 命令列工具
Redis 資料庫系統也是一個典型的C/S(客戶端/伺服器端)架構的應用,要訪問Redis資料庫需要使用專門的客戶端軟體。Redis服務的客戶端軟體就是其自帶的redis-cli命令列工具。使用redis-cli連線指定資料庫,連線成功過後會進入提示符為“遠端主機IP地址: 埠號>”的資料庫操作環境。使用者可以輸入各種操作語句對資料庫進行管理。如執行ping命令可以檢測redis服務是否啟動。

在進行資料庫連線操作時,可以通過選項來指定遠端主機上的Redis資料庫,
命令語法
redis-cli -h host -p port -a password 
其中, -h指定遠端主機、 -p指定Redis服務的埠號、-a 指定密碼。若不新增任何選項表示,連線本機上的 Redis資料庫;若未設定資料庫密碼可以省略-a選項。

編輯配置檔案

[root@server1 ~]# vi /etc/redis/6379.conf   
[root@server1 ~]# /etc/init.d/redis_6379 stop  停止Redis服務
[root@server1 ~]# /etc/init.d/redis_6379 start  啟動Redis服務
[root@server1 ~]# redis-cli -h 20.0.0.10 -p 6379  連線redis資料庫

新增
bind 20.0.0.10 127.0.0.1  
預設只連線127.0.0.1,允許接收本機地址,繫結地址

在這裡插入圖片描述

在這裡插入圖片描述
連線上Redis資料庫進行五種型別的服務配置操作

3.2 應用配置五種資料型別

3.2.1 String(字串)

[root@server1 ~]# redis-cli -h 20.0.0.10 -p 6379
20.0.0.10:6379> set a 13   設定a的值為13
OK
20.0.0.10:6379> get a      獲取a值 輸出返回13
"13"
20.0.0.10:6379> type a     檢視a的狀態型別
string
20.0.0.10:6379> incr a     自增長 +113+1=14 
(integer) 14                integer:整數
20.0.0.10:6379> get a      獲取a值的為14
"14"
20.0.0.10:6379> decr a      自減 -1 14=13
(integer) 13
20.0.0.10:6379> get a
"13"
20.0.0.10:6379> incrby a 7    設定增值為7 13+7=20
(integer) 20
20.0.0.10:6379> decrby a 10   設定下降值為10 20-10=10
(integer) 10

在這裡插入圖片描述

3.2.2 Hash(雜湊)

鍵值對集合(key=>value)

20.0.0.10:6379> hset hash1 key1 a  設定欄位key1為a
(integer) 1
20.0.0.10:6379> hset hash1 key1 aa  設定欄位key1為aa覆蓋
(integer) 0
20.0.0.10:6379> hset hash1 key2 aa   設定欄位key2為aa
(integer) 1
20.0.0.10:6379> hset hash1 key3 aaa   設定欄位key3為aaa
(integer) 1
20.0.0.10:6379> hset hash1 field1 a1 field2 a2  
(integer) 2
存入多個欄位,分別為field1為a1,field2為a2
20.0.0.10:6379> hget hash1 key1    獲取欄位key1為aa
"aa"
20.0.0.10:6379> hget hash1 key2    獲取欄位key2為aa
"aa"
20.0.0.10:6379> hget hash1 key3    獲取欄位key3為aaa
"aaa"
20.0.0.10:6379> hmget hash1 field1 field2  
1) "a1"
2) "a2"
獲取多個欄位field1為a1,field2為a2
20.0.0.10:6379> hmget hash1 key1 key2 key3 field1 field2
1) "aa"
2) "aa"
3) "aaa"
4) "a1"
5) "a2"
獲取獲取多個欄位key1為aa,key2為aa,key3為aaa,field1為a1,field2為a2

在這裡插入圖片描述

3.2.3 List(列表)

左進右出,左進左出

20.0.0.10:6379> lpush list1 1   左邊輸入第一位數字,數值為1
(integer) 1
20.0.0.10:6379> lpush list1 2
(integer) 2
20.0.0.10:6379> lpush list1 3
(integer) 3
20.0.0.10:6379> lpush list1 3   左邊輸入第4位數字,數值為3
(integer) 4
20.0.0.10:6379> lpush list1 4
(integer) 5
20.0.0.10:6379> lpop list1     左邊輸出左邊排列第一位數字數值為4
"4"
20.0.0.10:6379> rpop list1     右邊輸出右邊排列第一位數字數值為1
"1"
20.0.0.10:6379> llen list1     輸出列表長度為3
(integer) 3
20.0.0.10:6379> lrange list1 0 4         列出所有list1中的值     
1) "3"
2) "3"
3) "2"

在這裡插入圖片描述

3.2.4 Set(集合)無序集合

20.0.0.10:6379> sadd set1 10   新增鍵值10,10未存在,新增成功輸出返回1
(integer) 1
20.0.0.10:6379> sadd set1 20   新增鍵值20,20未存在,新增成功輸出返回1
(integer) 1
20.0.0.10:6379> sadd set1 20  新增鍵值20,20已存在,新增失敗輸出返回0
(integer) 0
20.0.0.10:6379> sadd set1 30
(integer) 1
20.0.0.10:6379> scard set1   檢視set資料中的鍵值個數為3(integer) 3
20.0.0.10:6379> sismember set1 40  
(integer) 0
判斷鍵值40是否存在與set資料中,不存在輸出返回0
20.0.0.10:6379> sismember set1 10
(integer) 1
判斷鍵值10是否存在與set資料中,存在輸出返回1
20.0.0.10:6379> sismember set1 20
(integer) 1
20.0.0.10:6379> sismember set1 30
(integer) 1
20.0.0.10:6379> srem set1 10    刪除鍵值10,成功輸出返回1
(integer) 1
20.0.0.10:6379> sismember set1 10
(integer) 0
判斷鍵值10是否存在與set資料中,不存在輸出返回0

在這裡插入圖片描述

3.2.4.1 數字列表

20.0.0.10:6379> sadd set1 40   新增鍵值40
(integer) 1
20.0.0.10:6379> sadd set1 2
(integer) 1
20.0.0.10:6379> sadd set1 15
(integer) 1
20.0.0.10:6379> sadd set1 25
(integer) 1
20.0.0.10:6379> sadd set1 18
(integer) 1
20.0.0.10:6379> sadd set1 37
(integer) 1
20.0.0.10:6379> smembers set1  列出set資料上的所有鍵值,
1) "2"
2) "15"
3) "18"
4) "20"
5) "25"
6) "30"
7) "37"
8) "40"
數字自動進行從小到大排序列出

在這裡插入圖片描述

3.2.4.2 新增字母進行列表顯示

20.0.0.10:6379> sadd set2 aaa  新增鍵值aaa
(integer) 1
20.0.0.10:6379> sadd set2 aa
(integer) 1
20.0.0.10:6379> sadd set2 b
(integer) 1
20.0.0.10:6379> sadd set2 esss
(integer) 1
20.0.0.10:6379> sadd set2 s1
(integer) 1
20.0.0.10:6379> sadd set2 g12
(integer) 1
20.0.0.10:6379> sadd set2 h12345
(integer) 1
20.0.0.10:6379> smembers set2   列出所有鍵值
1) "b"
2) "esss"
3) "aaa"
4) "h12345"
5) "aa"
6) "s1"
7) "g12"
發現字母列出時,未自動進行排序

在這裡插入圖片描述

3.2.5 zset(無序集合)

20.0.0.10:6379> zadd zset1 1 val1   新增鍵值,分數為1,成員val1
(integer) 1
20.0.0.10:6379> zadd zset1 3 val2  新增鍵值,分數為3,成員val2
(integer) 1
20.0.0.10:6379> zadd zset1 2.4 val3
(integer) 1
20.0.0.10:6379> zadd zset1 7 val4
(integer) 1
20.0.0.10:6379> zadd zset1 4 val5
(integer) 1
20.0.0.10:6379> zadd zset1 1.3 val6
(integer) 1
20.0.0.10:6379> zadd zset1 1.3 val66
(integer) 1
20.0.0.10:6379> zrangebyscore zset1 0 10  只顯示成員的排序
1) "val1"
2) "val6"
3) "val66"
4) "val3"
5) "val2"
6) "val5"
7) "val4"
20.0.0.10:6379> zrange zset1 0 10 withscores  連帶分數進行排序
 1) "val1"
 2) "1"
 3) "val6"
 4) "1.3"
 5) "val66"
 6) "1.3"
 7) "val3"
 8) "2.3999999999999999"
 9) "val2"
10) "3"
11) "val5"
12) "4"
13) "val4"
14) "7"

在這裡插入圖片描述
在這裡插入圖片描述


總結

通過以上的學習瞭解,通過Redis與Memcadhed之間的效能比較以及Redis的資料型別解析配置,對此類的應用有了較為完善的理解,掌握。

相關文章