Redis的安裝配置與命令操作

人生夢復夢發表於2020-12-21

1.儲存資料與資料庫分類

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.3 非關係型資料庫產生背景

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

2.Redis介紹

2.1 Redis簡介

  • Redis基於記憶體執行並支援持久化
  • 採用key-value(鍵值對)的儲存形式
key:關鍵詞
value:關鍵詞值
  • 優點
具有極高的資料讀寫速度
支援豐富的資料型別
支援資料的持久化
原子性(資料儲存方式不可分割,最簡)
支援資料備份(可選擇資料備份位置)

2.2 Redis概述

  • redis(remote dictionary server,遠端字典服務)是一個開源的使用ANSIC語言編寫、遵守BSD協議,支援網路,可基於記憶體可持久化的日誌型、key-Value的資料庫,並提供多種語言的API;
  • 它通常被稱為結構伺服器,因為值(value)可以是字串(string),雜湊(hash),列表(list),集合(sets)和有序集合(sorted sets)等型別;
  • redis是完全開源免費的,是一個高效能的key-value資料庫。

2.3 Redis的特點與優勢

  • 特點:
redis支援資料的持久化,可以將記憶體中的資料庫儲存在磁碟中,重啟的時候可以再次載入進行使用

redis不僅僅支援簡單的key-value型別的資料,同時還提供list,set,zset,hash等資料結構的儲存

redis支援資料的備份,即master-slave模式的資料備份(下一篇將會詳述redis群集)
  • 優勢:
效能極高-redis的讀的速度是110000次/s,寫的速度是81000次/s

豐富的資料型別-redis支援二進位制案例的strings,lists,hashes,sets以及ordered sets資料型別操作

原子-redis的所有操作都是原子性的,意思就是要麼成功執行要麼完全不執行。單個操作是原子性的,多個操作也支援事務,即原子性,通過MULTI和EXEC指令包起來

豐富的特性-redis還支援publish/subscribe通知,key過期等特性

2.4 Redis與其他key-value的不同

redis有著更為複雜的資料結構並且提供對他們的原子操作,這是一個不同於其他資料庫的進化路徑;

redis的資料型別都是基於基本資料結構的同時對程式設計師透明,無需進行額外的抽象;

redis執行在記憶體中,但是可以持久化到磁碟,所以在對不同資料集進行高速讀寫時需要權衡記憶體,因為資料不能大於硬體記憶體。

在記憶體資料庫方面的另外一個優點是,相比在磁碟上相同的複雜的資料結構,在記憶體中操作起來非常簡單,這樣redis可以做很多內部複雜性很強的事情;

同時,在磁碟格式方面他們是緊湊的以追加的方式生產的,因為他們不需要進行隨機訪問

2.5 使用場景

  • 會話快取(Session Cache)
    最常用的一種使用Redis的情景是會話快取(session cache)。用Redis快取會話比其他儲存(如Memcached)的優勢在於:Redis提供持久化。

  • 全頁快取(FPC)
    除基本的會話token之外,Redis還提供很簡便的FPC平臺。回到一致性問題,即使重啟了Redis例項,因為有磁碟的持久化,使用者也不會看到頁面載入速度的下降,這是一個極大改進,類似PHP本地FPC。

  • 佇列
    Reids在記憶體儲存引擎領域的一大優點是提供 list 和 set 操作,這使得Redis能作為一個很好的訊息佇列平臺來使用。Redis作為佇列使用的操作,就類似於本地程式語言(如Python)對 list 的 push/pop 操作。

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

  • 釋出/訂閱
    最後是Redis的釋出/訂閱功能。釋出/訂閱的使用場景也是非常多的

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

2.6 Redis與Memcached區別

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

3.Redis解析

Redis支援五種資料型別:

  • string(字串)
  • hash(雜湊)
  • list(列表)
  • set(集合)
  • zset (sorted set:有序集合)

3.1 String (字串) 詳解

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

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

  • string 型別是Redis最基本的資料型別,string型別的值最大能儲存 512MB;

  • 用法示例:

set 鍵值 設定鍵值; get 鍵值 (獲取鍵的值)
set:設定
get:獲取

Set sting1  6
sting1:鍵名
鍵值為6
設定鍵值為6
Get  string1
6
獲取鍵值為6

Incr string1
7
Incr:字增長 +1

Decr string1
5
Decr:自降 -1

Decrby string1 2
4
設定下降值為2
6-2=4

Incrby string1 4
10
設定增值為4
6+4=10

3.2 Hash (雜湊) 詳解

  • Redis hash 是一個鍵值(key=>value)對集合。
  • Redis hash 是一個 string 型別的 field 和 value 的對映表,hash 特別適合用於儲存物件。
  • 用法示例:
Hset:新增hash資料
Hget:獲取hash資料
Hmget:獲取多個hash資料
Hset hash1 key1 a
key1:關鍵詞1
設定欄位關鍵詞值為a
Hset hash1 key2 b

Hget hash1 key1
獲取欄位關鍵詞值

Hmget hash1 key1 key2
獲取多個欄位關鍵詞值

3.3 List(列表)

  • Redis 列表是簡單的字串列表,按照插入順序排序。你可以新增一個元素到列表的頭部(左邊)或者尾部(右邊)。
  • 用法示例:
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的值

3.4 Set (集合)

  • Redis 的 Set 是 string 型別的無序集合;

  • 集合是通過雜湊表實現的,所以新增,刪除,查詢的複雜度都是 0/1;

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

sadd key member
scard:檢視set資料中存在的元素個數
sismember:判斷set資料中是否存在某個元素
srem:刪除某個set資料中的元素
  • 用法示例:
sadd set1 12
1
新增鍵值1212未存在時則新增成功輸出返回1

sadd set1 13
1

sadd  set1 12
0
新增鍵值1212已存在則新增失敗輸出返回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所有值

3.5 zset (sorted set:有序集合)

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

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

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

zadd 命令
新增元素到集合,元素在集合中存在則更新對應score
使用方法:zadd key score member
zcard:查詢
zrang:資料排序
  • 用法示例:
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 100-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) Val33
8) 3.29999999999999998

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

在這裡插入圖片描述

4.Redis應用部署

4.1 部署流程

4.1.1 匯入redis軟體包

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

在這裡插入圖片描述

4.1.2 解壓縮

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

4.1.3 設定編輯檔案

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

4.1.4 建立連結

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

在這裡插入圖片描述

4.1.5 安裝資料庫

[root@localhost ~]# cd redis-5.0.4/utils/
[root@localhost utils]# ./install_server.sh
Welcome to the redis service installer
This script will help you easily set up a running redis server

Please select the redis port for this instance: [6379] 
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf] 
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log] 
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379] 
Selected default - /var/lib/redis/6379
Please select the redis executable path [/usr/local/bin/redis-server] 
Selected config:
Port           : 6379
Config file    : /etc/redis/6379.conf
Log file       : /var/log/redis_6379.log
Data dir       : /var/lib/redis/6379
Executable     : /usr/local/bin/redis-server
Cli Executable : /usr/local/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!

在這裡插入圖片描述

4.1.6 檢視埠服務並修改配置檔案

[root@localhost ~]# netstat -anpt | grep redis
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      57740/redis-server 
[root@localhost ~]# vi /etc/redis/6379.conf
...//省略部分資訊
bind 192.168.140.20 127.0.0.1		//新增本機地址

在這裡插入圖片描述

4.1.7 重啟並連線redis服務

[root@localhost ~]# /etc/init.d/redis_6379 stop
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
[root@localhost ~]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@localhost ~]# redis-cli -h 192.168.140.20 -p 6379
192.168.140.20:6379> 

4.2 五種資料型別的應用

4.2.1 String字串的應用

[root@localhost ~]# redis-cli -h 192.168.140.20 -p 6379
192.168.140.20:6379> set yy 7	//設定yy的值為7
OK
192.168.140.20:6379> get yy	//獲取yy的值
"7"
192.168.140.20:6379> type yy	//檢視yy的狀態型別
string
192.168.140.20:6379> incr yy	//設定自增+1
(integer) 8	//integer表示整數
192.168.140.20:6379> get yy	//獲取yy的值
"8"
192.168.140.20:6379> decr yy	//設定自減-1
(integer) 7
192.168.140.20:6379> get yy
"7"
192.168.140.20:6379> incrby yy 2	//設定增值為2
(integer) 9
192.168.140.20:6379> get yy
"9"
192.168.140.20:6379> decrby yy 5	//設定降值為5
(integer) 4
192.168.140.20:6379> 

在這裡插入圖片描述

4.2.2 Hash的應用

[root@localhost ~]# redis-cli -h 192.168.140.20 -p 6379
192.168.140.20:6379> hset hash1 key1 kp	//設定欄位key1為kp,注意重新設定時會覆蓋上一次的內容
(integer) 1
192.168.140.20:6379> hset hash1 key2 kpp	//設定欄位key2為kpp
(integer) 1
192.168.140.20:6379> hset hash1 key3 kkpp	//設定欄位key3為kkpp
(integer) 1
192.168.140.20:6379> hset hash1 field1 k1 field2 k2	//存入多個欄位,分別為k1和k2
(integer) 2
192.168.140.20:6379> hget hash key1	//獲取欄位key1
"kp"
192.168.140.20:6379> hget hash key2	//獲取欄位key2
"kpp"
192.168.140.20:6379> hget hash key3	//獲取欄位key3
"kkpp"
192.168.140.20:6379> hmget hash1 field1 field2	//獲取多個 欄位field1為k1,field2為k2
1) "k1"
2) "k2"
192.168.140.20:6379> hmget hash1 key1 key2 key3 field1 field2	//獲取多個欄位
1) "kpp"
2) "kpp"
3) "kkpp"
4) "k1"
5) "k2"
192.168.140.20:6379> 

4.2.3 List(列表)的應用

  • 原則:左進右出,左進左出
  • lpush:從左邊推入值lpop
[root@localhost ~]# redis-cli -h 192.168.140.20 -p 6379
192.168.140.20:6379> lpush list1 5
(integer) 1
192.168.140.20:6379> lpush list1 15
(integer) 2
192.168.140.20:6379> lpush list1 25
(integer) 3
  • 左出第一個列表
192.168.140.20:6379> lpop list1
"25"
//從左邊彈出值rpush,從右邊推入值rpop
  • 檢視列表長度
192.168.140.20:6379> llen list1
(integer) 2
  • 列出所有list1的值
192.168.140.20:6379> lrange list1 0 25
1) "15"
2) "5"
  • 從右邊彈出值
192.168.140.20:6379> rpop list1
"5"
  • 再次列出所有list1的值
192.168.140.20:6379> lrange list1 0 25
1) "15"

4.2.4 Set(集合)無序集合的應用

192.168.140.20:6379> sadd set1 10	//新增鍵值10,未存在新增成功時則輸出1
(integer) 1
192.168.140.20:6379> sadd set1 20	//新增鍵值20
(integer) 1
192.168.140.20:6379> sadd set1 20	//新增鍵值20,已存在,新增失敗輸出0
(integer) 0
192.168.140.20:6379> sadd set1 30	//新增鍵值30
(integer) 1
192.168.140.20:6379> scard set1	//檢視set資料中的鍵值個數為3個
(integer) 3
192.168.140.20:6379> sismember set1 40	//判斷鍵值40是否存在set資料中,不存在則輸出0
(integer) 0
192.168.140.20:6379> sismember set1 10	//判斷鍵值10是否存在set資料中,存在則輸出1
(integer) 1
192.168.140.20:6379> srem set1 10	//刪除鍵值10,成功輸出1
(integer) 1
192.168.140.20:6379> sismember set1 10
(integer) 0
192.168.140.20:6379> smembers set1	//列出set資料上的所有鍵值,數字從小到大列出(若新增的是字母則不會進行排序)
1) "20"
2) "30"

4.2.5 zset(無序集合)的應用

  • 新增元素到集合,元素在集合中存在則更新對應score
192.168.140.20:6379> zadd zset1 2 val1
(integer) 1
192.168.140.20:6379> zadd zset1 6 val2
(integer) 1
192.168.140.20:6379> zadd zset1 7.7 val3
(integer) 1
192.168.140.20:6379> zadd zset1 8 val4
(integer) 1
192.168.140.20:6379> zadd zset1 9 val5
(integer) 1
  • 檢視值
192.168.140.20:6379> zrangebyscore zset1 0 10
1) "val1"
2) "val2"
3) "val5"
4) "val3"
5) "val4"
  • zrang:資料排序,連帶成員和分數
192.168.140.20:6379> zrange zset1 0 10 withscores
 1) "val1"
 2) "2"
 3) "val2"
 4) "6"
 5) "val5"
 6) "9"
 7) "val3"
 8) "7.7000000000000002"
 9) "val4"
10) "8"

相關文章