Redis的配置及與memcached區別

繁星若渺發表於2020-12-17

1、儲存資料概述

■ 儲存資料型別分類:
● 結構化資料:可以通過二維表格形式表述這個資料。
● 非結構化資料:不方便以二維表格形式表述的這種型別的資料。

■ 根據不同種儲存資料型別分類分成兩種不同型別的資料庫:
● sql結構化資料庫:裡面儲存的資料型別是結構化資料。別稱稱為關係型資料庫
● nosql非結構化資料庫:裡面儲存的資料型別是非結構化資料。別稱稱為非關係型資料庫

2、關聯式資料庫與非關係型資料庫

■ 關係型資料庫
● 一個結構化的資料庫,建立在關係模型基礎上
● 一般面向於記錄
● 包括
◆Oracle、 MySQL、SQL Server、Microsoft Access、DB2等
● 特點:
表與表之間可以建立某種聯絡

■ 非關係型資料庫
● 除了主流的關係型資料庫外的資料庫,都認為是非關係型
● 包括
◆Redis、 MongBD、 Hbase、 CouhDB等
● 特點:只存資料本身,不建立表與表之間的聯絡,儲存和讀取速度快

2.1、非關係型資料庫產生背景

■ High performance—對資料庫高併發讀寫需求

■ Huge Storage—對海量資料高效儲存與訪問需求

■ High Scalability && High Availability—對資料庫高可擴充套件性與高可用性需求

3、Redis簡介

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

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

■ 優點
● 具有極高的資料讀寫速度
● 支援豐富的資料型別
● 支援資料的持久化
● 原子性
● 支援資料備份

3.1、redis與memcached比較

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

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

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

3.11、使用場景

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

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

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

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

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

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

3.2、Redis支援五種資料型別

■ String(字串)
● string 是 redis 最基本的型別,你可以理解成與 Memcached 一模一樣的型別,一個 key 對應一個 value。
● string 型別是二進位制安全的。意思是 redis 的 string 可以包含任何資料。比如jpg圖片或者序列化的物件。
● string 型別是 Redis 最基本的資料型別,string 型別的值最大能儲存 512MB。
● 例項:set 鍵 值 設定鍵值對 get 鍵 獲取鍵的值
Set sting1 8
Get string1
8
Incr string1
9
Decr string1
8
Decrby string1 2
6
Incrby string1 5
11

■Hash(雜湊)
● Redis hash 是一個鍵值(key=>value)對集合。
● Redis hash 是一個 string 型別的 field 和 value 的對映表,hash 特別適合用於儲存物件。
● 例項:Hset:新增hash資料 hget:獲取hash資料 hmget:獲取多個hash資料
Hset hash1 key1 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

■List(列表)
● Redis 列表是簡單的字串列表,按照插入順序排序。你可以新增一個元素到列表的頭部(左邊)或者尾部(右邊)。
● 例項:lpush:從左邊推入值 lpop:從左邊彈出值 rpush:從右邊推入值 rpop:從右邊彈出值 llen:檢視某個list資料型別的長度
Lpush list1 1
Lpush list1 2
Lpush list1 3
Llen list1
3
Rpop list1
1
Llen list1
2
Lrange list1 列出所有list1的值

■Set(集合)
● Redis 的 Set 是 string 型別的無序集合。
● 集合是通過雜湊表實現的,所以新增,刪除,查詢的複雜度都是 O(1)。
● sadd 命令
● 新增一個 string 元素到 key 對應的 set 集合中,成功返回 1,如果元素已經在集合中返回 0。
sadd key member
scard:檢視set資料中存在的元素個數
sismember:判斷set資料中是否存在某個元素
srem:刪除某個set資料中的元素
● 例項:
sadd set1 12
1
sadd set1 13
1
sadd set1 12
0
Scard set1
2
Sismember set1 11
0
Sismember set1 13
1
Srem set1 13
1
Sismember set1 13
0
Smembers set1 列出set1所有值

■ zset(sorted set:有序集合)
● Redis zset 和 set 一樣也是string型別元素的集合,且不允許重複的成員。
● 不同的是每個元素都會關聯一個double型別的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。
zset的成員是唯一的,但分數(score)卻可以重複。
zadd 命令
新增元素到集合,元素在集合中存在則更新對應score
使用方法:zadd key score member
zcard:查詢
zrang:資料排序
● 例項:
Zadd zset1 1.1 val1
Zadd zset1 2.2 val2
Zadd zset1 3.3 val3
Zadd zset1 3.3 val33
Zcard zset1
4
Zrangebyscore zset1 0 10

  1. val1
  2. val2
  3. val3
  4. val33
    Zrange zset1 0 10 withscores
  5. val1
  6. 1.10000000000000001
  7. Val2
  8. 2.20000000000000002
  9. Val3
  10. 3.29999999999999998
  11. Val3.3
  12. 3.29999999999999998

在這裡插入圖片描述

4、Redis 安裝部署實驗

4.1、放入Redis安裝包,進行解壓縮

在這裡插入圖片描述

[root@server7 ~]# tar zxvf redis-5.0.4.tar.gz  #解壓縮
[root@server7 ~]# cd redis-5.0.4/
[root@server7 redis-5.0.4]# make  #編譯安裝
[root@server7 redis-5.0.4]# make PREFIX=/usr/local/redis install   #設定安裝路徑
[root@server7 redis-5.0.4]# ln -s /usr/local/redis/bin/* /usr/local/bin      #命令連結
[root@server7 redis-5.0.4]# cd utils/
[root@server7 utils]# ll

在這裡插入圖片描述

[root@server7 utils]# ./install_server.sh    #執行安裝指令碼

在這裡插入圖片描述

[root@server7 utils]# netstat -anpt | grep redis

在這裡插入圖片描述

[root@server7 utils]# cd
[root@server7 ~]# redis-cli              #連線資料庫

在這裡插入圖片描述

[root@server7 ~]# vi /etc/redis/6379.conf   #進入配置檔案

在這裡插入圖片描述

[root@server7 ~]# /etc/init.d/redis_6379 stop  #停止redis
[root@server7 ~]# /etc/init.d/redis_6379 start  #開啟redis
[root@server7 ~]# redis-cli -h 192.168.74.70 -p 6379      #連線本機

在這裡插入圖片描述

5、Redis支援的五種資料型別測試

5.1、string(字串)

192.168.74.70:6379> set a 9
OK
192.168.74.70:6379> get a
"9"
192.168.74.70:6379> type a
string

在這裡插入圖片描述

192.168.74.70:6379> incr a
(integer) 10
192.168.74.70:6379> get a
"10"
192.168.74.70:6379> decr a
(integer) 9
192.168.74.70:6379> get a
"9"
192.168.74.70:6379> incrby a 8
(integer) 17
192.168.74.70:6379> get a
"17"
192.168.74.70:6379> decrby a 5
(integer) 12
192.168.74.70:6379> get a
"12"

在這裡插入圖片描述

5.2、Hash(雜湊)

192.168.74.70:6379> hset hash1 key1 4
(integer) 1
192.168.74.70:6379> hset hash1 key2 8
(integer) 1
192.168.74.70:6379> hset hash1 key3 9
(integer) 1
192.168.74.70:6379> hset hash1 field1 a1 field2 a2
(integer) 2
192.168.74.70:6379> hget hash1 key1
"4"
192.168.74.70:6379> hget hash1 key2
"8"
192.168.74.70:6379> hget hash1 key3
"9"
192.168.74.70:6379> hget hash1 field1 field2
(error) ERR wrong number of arguments for 'hget' command
192.168.74.70:6379> hmget hash1 field1 field2
1) "a1"
2) "a2"
192.168.74.70:6379> hmget hash1 field1 field2 key1 key2 key3
1) "a1"
2) "a2"
3) "4"
4) "8"
5) "9"
192.168.74.70:6379> 

在這裡插入圖片描述

5.3、List(列表)

192.168.74.70:6379> lpush list a         #左入a
(integer) 1
192.168.74.70:6379> lpush list b         #左入b
(integer) 2
192.168.74.70:6379> lpush list c          #左入c
(integer) 3
192.168.74.70:6379> lpop list             #最先取出C
"c"
192.168.74.70:6379> llen list              #長度為2
(integer) 2
192.168.74.70:6379> lrange list 0 2   #列出list所剩值
1) "b"
2) "a"
192.168.74.70:6379> lrange list 0 1  #列出list所剩值
1) "b"
2) "a"
192.168.74.70:6379> lrange list 0 3  #列出list所剩值
1) "b"
2) "a"
192.168.74.70:6379> lrange list 1 2  #列出list所剩值
1) "a"
192.168.74.70:6379> rpop list  #右出由於a在最下面,所以取出a
"a"
192.168.74.70:6379> lrange list 0 3  #list剩餘值為b
1) "b"
192.168.74.70:6379> lpush list 8   #左入8
(integer) 2
192.168.74.70:6379> lpop list #左出最後新增的88被最先取出
"8"

5.4、Set(無序集合)

192.168.74.70:6379> sadd set a     #輸入鍵值a,"1"顯示正確
(integer) 1
192.168.74.70:6379> sadd set b   #輸入鍵值b,"1"顯示正確
(integer) 1
192.168.74.70:6379> sadd set a   #輸入鍵值a,"0"顯示錯誤,已存在這個元素
(integer) 0
192.168.74.70:6379> sismember set a  #查詢已存在為"1"
(integer) 1
192.168.74.70:6379> sismember set t #查詢不存在為"0"
(integer) 0
192.168.74.70:6379> srem set a  #刪除元素a
(integer) 1
192.168.74.70:6379> sismember set a  #元素a不存在,已成功刪除
(integer) 0
192.168.74.70:6379> sadd set e
(integer) 1
192.168.74.70:6379> sadd set l
(integer) 1
192.168.74.70:6379> smembers set
1) "e"
2) "l"
3) "b"
192.168.74.70:6379> sadd set a1
(integer) 1
192.168.74.70:6379> sadd set a3
(integer) 1
192.168.74.70:6379> smembers set  #字母為無序集合
1) "a1"
2) "e"
3) "l"
4) "b"
5) "a3"
192.168.74.70:6379> sadd set 1
(integer) 1
192.168.74.70:6379> sadd set 2
(integer) 1
192.168.74.70:6379> sadd set 9
(integer) 1
192.168.74.70:6379> sadd set 4
(integer) 1
192.168.74.70:6379> sadd set 19
(integer) 1
192.168.74.70:6379> sadd set 6
(integer) 1
192.168.74.70:6379> smembers set  #數字也為無序集合
1) "6"
2) "4"
3) "19"
4) "1"
5) "9"
6) "2"

5.5、Zset(sorted set:有序集合)

在這裡插入圖片描述

192.168.74.70:6379> zadd zset 1 val1
(integer) 1
192.168.74.70:6379> zadd zset 1 val2
(integer) 1
192.168.74.70:6379> zadd zset 3 val3
(integer) 1
192.168.74.70:6379> zadd zset 4 val4
(integer) 1
192.168.74.70:6379> zadd zset 5 val5
(integer) 1
192.168.74.70:6379> zrangebyscore zset 0 8  #有序集合
1) "val1"
2) "val2"
3) "val3"
4) "val4"
5) "val5"
192.168.74.70:6379> zrangebyscore zset 0 8 withscores #連帶分數從小到大
 1) "val1"
 2) "1"
 3) "val2"
 4) "1"
 5) "val3"
 6) "3"
 7) "val4"
 8) "4"
 9) "val5"
10) "6"

相關文章