Redis的安裝和部署

1、基礎知識

1.1 redis的數據類型mysql

字符串(string)、列表(lists)、集合(sets)、有序集合(sorts sets)、哈希表(hashs)redis

1.2 redis與memcachesql

  1) redis能夠用來作存儲(storge)、而memcache是來作緩存(cache)。這個特色主要是由於其有「持久化」功能數據庫

  2)存儲的數據有「結構」,對於memcache來講,存儲的數據,只有一種類型--->「字符串」,而redis則能夠存儲字符串、鏈表、集合、有序集合、哈序結構vim

1.3 持久化的兩種方式:緩存

  Redis將數據存儲於內存中,或被配置爲使用虛擬內存安全

  實現數據持久化的兩種方式:服務器

    1)使用截圖的方式,將內存中的數據不斷寫入磁盤(性能高,但可能會引發必定程度的數據丟失)app

    2)使用相似mysql的方式,記錄每次更新的日誌異步

2、安裝redis

2.1 redis各版本下載地址

http://download.redis.io/releases/

2.2 下載、解壓並安裝redis只須要執行make命令便可

 [root@db1 ~]# wget http://download.redis.io/releases/redis-3.2.12.tar.gz
 [root@db1 ~]# tar xf redis-3.2.12.tar.gz -C /usr/local/
 [root@db1 ~]# mv /usr/local/redis-3.2.12/ /usr/local/redis
 [root@db1 ~]# cd /usr/local/redis/
 [root@db1 /usr/local/redis]# make

2.3 將目錄配置到環境變量中

 [root@db1 ~]# vim /etc/profile
 PATH=/usr/local/redis/src:$PATH
 [root@db1 ~]# source /etc/profile

2.4 啓動和關閉redis命令

 [root@db1 ~]# redis-server &
 [root@db1 ~]# redis-cli shutdown

3、 redis經常使用命令及配置文件

3.1 經常使用命令

 [root@db1 ~]# redis-server /etc/redis.conf                       # 指定配置文件起動服務
 [root@db1 ~]# redis-cli shutdown                                   # 關閉redis服務器
 [root@db1 ~]# redis-cli -h 127.0.0.1 -p 6379 -a password          # 鏈接指定的redis服務 

3.2 鍵的經常使用用操做

# 通用操做
> SET name leon # 設置key值 > GET name # 獲取key值 > EXISTS name # 查詢key是否存在 > EXPIRE name 30 # 以秒爲單位設定生存時間,PTTL以毫秒爲單位 > TTL name # 以秒爲單位查看生命週期剩餘時間,PTTL是以毫秒爲單位 > DEL name # 刪除一個key > TYPE fans # 返回鍵所存儲值的類型 > KEYS * # 查詢全部的鍵的名字 > RENAME fans myfans # 修改鍵的名字

# string類型
> INCR zan # 數值型整數,每次加1,若key不存在,設置key初始值爲0,增長後結果爲1
> DECR zan # 每次減1
> decrby zan 3 # 直接n個數字

> MSET name leon id 1 age 30 # 生成多個鍵值對
> MGET name id age # 獲取多個鍵值

# hash類型(字典類型)相似於mysql的一種類型:hmset 表 列 值 列 值 ...
> HMSET student id 1001 name leon age 33 gender M
OK
> HGETALL student
1) "id"
2) "1001"
3) "name"
4) "leon\x9d"
5) "age"
6) "33"
7) "gender"
8) "M"

# list類型
127.0.0.1:6379> LPUSH mylist a b c 1 2 # 若key不存在,建立該鍵及與其關聯的list,依次a b c 1 2,若list類型的key存在,則插入value中
(integer) 5
127.0.0.1:6379> LPUSHX mylist2 xx # 若key不存在,此命令無效,若key存在則插入value中
(integer) 0
127.0.0.1:6379> LINSERT mylist before a a1 # 在a的前面插入新元素a1
(integer) 6
127.0.0.1:6379> LINSERT mylist after c p1 # 在c的後面插入新元素p1
(integer) 7
127.0.0.1:6379> RPUSH mylist y z # 在鏈表尾部先插入z,在插入y
(integer) 9
127.0.0.1:6379> RPUSHX mylist p2 # 若key存在,在尾部插入p2,若key不存在則無效
(integer) 10
127.0.0.1:6379> RPOPLPUSH mylist mylist2 # 將mylist的尾部無素彈出,再插入到mykey2的頭部(原子性操做)
"p2"
127.0.0.1:6379> del mylist2 # 刪除已有的鍵
(integer) 1

# SET集合類
127.0.0.1:6379> SADD mr yuwen shuxue yingyu gaoshu
(integer) 4
127.0.0.1:6379> SADD xs yingyu dili gaoshu jisuanji
(integer) 4
127.0.0.1:6379> SUNION mr xs # mr和xs的並集
1) "gaoshu"
2) "shuxue"
3) "jisuanji"
4) "dili"
5) "yingyu"
6) "yuwen"
127.0.0.1:6379> SINTER mr xs # mr的xs的交集
1) "gaoshu"
2) "yingyu"
127.0.0.1:6379> SDIFF mr xs # mr和xs的差集
1) "shuxue"
2) "yuwen"

# sortedset(有序集合)排行榜應用場景,取TOP N操做
127.0.0.1:6379> ZADD music 0 xxy 0 jmjmjh 0 xhn 0 qys
(integer) 4
127.0.0.1:6379> ZINCRBY music 999 xxy
"999"
127.0.0.1:6379> ZINCRBY music 888 jmjmjh
"888"
127.0.0.1:6379> ZINCRBY music 777 xhn
"777"
127.0.0.1:6379> ZINCRBY music 500 qys
"500"
127.0.0.1:6379> ZREVRANGE music 0 -1
1) "xxy"
2) "jmjmjh"
3) "xhn"
4) "qys"
127.0.0.1:6379> ZREVRANGE music 0 -1 withscores
1) "xxy"
2) "999"
3) "jmjmjh"
4) "888"
5) "xhn"
6) "777"
7) "qys"
8) "500"

# 生產者/消費者模型,發佈訂閱,不能進行消息堆積
127.0.0.1:6379> SUBSCRIBE fm1024 # 訂閱一個管道fm1024
127.0.0.1:6379> PUBLISH fm1024 yimiyangguang # 向1024管道發送內容

3.2 配置文件

[root@db1 ~]# cp /usr/local/redis/redis.conf /etc/
[root@db1 ~]# redis-server /etc/redis.conf
# redis默認不是以守護進程的方式運行,設置成yes爲守護進程 daemonize yes # 以守護方式運行時,指定pid的位置 pdifile /var/run/redis.pid # 配置綁定主機的IP地址 bind 192.168.7.80 127.0.0.1 # 默認監聽端口爲6379 port 6379 # 當客戶端閒置多長時間後關閉鏈接,若是指定爲0,表示關閉該功能 timeout 300 # 日誌等級分爲4級,debug,rerbose,notice和warning,默認爲verbose loglevel verbose # 日誌記錄方式,默認爲標準輸出,若是配置Redis爲守護進程方式運行,而這裏又配置爲日誌記錄方式爲標準輸出,則日誌將會發送給/dev/null logfile "/var/log/redis/redis.log" # 設置數據庫的數量,默認數據庫爲0,可使用SELECT <dbid>命令在鏈接上指定數據庫id database 16 # 指定在多長時間內,有多少次更新操做,就將數據同步到數據文件,能夠多個條件配合 save <seconds> <changes> Redis默認配置文件中提供了三個條件: save 900 1 save 300 10 save 60 10000 分別表示900秒(15分鐘)內有1個更改,300秒(5分鐘)內有10個更改以及60秒內有10000個更改。 # 指定存儲至本地數據庫時是否壓縮數據,默認爲yes,Redis採用LZF壓縮,若是爲了節省CPU時間,能夠關閉該選項,但會致使數據庫文件變的巨大 rdbcompression yes # 指定本地數據庫文件名,默認值爲dump.rdb dbfilename dump.rdb # 指定本地數據庫存放目錄 dir ./ # 設置當本機爲slave服務時,設置master服務的IP地址及端口,在Redis啓動時,它會自動從master進行數據同步 slaveof <masterip> <masterport> # 當master服務設置了密碼保護時,slave服務鏈接master的密碼 masterauth <master-password> # 設置redis鏈接密碼,若是設置了密碼,客戶端鏈接的時候須要使用-a參數,若未加-a參數,進後以後再auth 123 requirepass 123 # 設置同一時間最大客戶端鏈接數,默認無限制,Redis能夠同時打開的客戶端鏈接數爲Redis進程能夠打開的最大文件描述符數,若是設置 maxclients 0,表示不做限制。當客戶端鏈接數到達限制時,Redis會關閉新的鏈接並向客戶端返回max number of clients reached錯誤信息 maxclients 128 # 指定Redis最大內存限制,Redis在啓動時會把數據加載到內存中,達到最大內存後,Redis會先嚐試清除已到期或即將到期的Key,當此方法處理 後,仍然到達最大內存設置,將沒法再進行寫入操做,但仍然能夠進行讀取操做。Redis新的vm機制,會把Key存放內存,Value會存放在swap區 maxmemory 1024 # 指定是否在每次更新操做後進行日誌記錄,Redis在默認狀況下是異步的把數據寫入磁盤,若是不開啓,可能會在斷電時致使一段時間內的數據丟失。由於redis自己同步數據文件是按上面save條件來同步的,因此有的數據會在一段時間內只存在於內存中。默認爲no appendonly no # 指定更新日誌條件,共有3個可選值 no:表示等操做系統進行數據緩存同步到磁盤(快) always:表示每次更新操做後手動調用fsync()將數據寫到磁盤(慢,安全) everysec:表示每秒同步一次(折衷,默認值) appendfsync no # 指定是否啓用虛擬內存機制,默認值爲no,簡單的介紹一下,VM機制將數據分頁存放,由Redis將訪問量較少的頁即冷數據swap到磁盤上,訪問多的頁面由磁盤自動換出到內存中 vm_enabled no # 虛擬內存文件路徑,默認值爲/tmp/redis.swap,不可多個Redis實例共享 vm_swap_file /tmp/redis.swap # 將全部大於vm-max-memory的數據存入虛擬內存,不管vm-max-memory設置多小,全部索引數據都是內存存儲的(Redis的索引數據 就是keys),也就是說,當vm-max-memory設置爲0的時候,實際上是全部value都存在於磁盤。默認值爲0 vm_max_momery 0 # Redis swap文件分紅了不少的page,一個對象能夠保存在多個page上面,但一個page上不能被多個對象共享,vm-page-size是要根據存儲的 數據大小來設定的,做者建議若是存儲不少小對象,page大小最好設置爲32或者64bytes;若是存儲很大大對象,則可使用更大的page,若是不 肯定,就使用默認值 vm_page_size 32 # 設置swap文件中的page數量,因爲頁表(一種表示頁面空閒或使用的bitmap)是在放在內存中的,,在磁盤上每8個pages將消耗1byte的內存。 vm_pages 134217728 # 設置訪問swap文件的線程數,最好不要超過機器的核數,若是設置爲0,那麼全部對swap文件的操做都是串行的,可能會形成比較長時間的延遲。默認值爲4 vm_max_thrrads 4 # 指定包含其它的配置文件,能夠在同一主機上多個Redis實例之間使用同一份配置文件,而同時各個實例又擁有本身的特定配置文件 include /data/redis/redis.conf

 4、redis主從複製搭建

4.1 原理

1. 從服務器向主服務器發送SYNC命令。

2. 接到SYNC命令的主服務器會調用BGSAVE命令,建立一個RDB文件,並使用緩衝區記錄接下來執行的全部寫命令。

3. 當主服務器執行完BGSAVE命令時,它會向服務器發送RDB文件,而從服務器則會接收並載入這個文件。

4. 主服務器將緩衝區儲存的全部寫命令發送給從服務器執行。

4.2 命令傳播

在主從服務器完成同步以後,主服務器每執行一個寫命令,它都會將被執行的寫命令發送給從服務器執行,這個操做被稱爲「命令傳播」

命令傳播是一個持續的過程,只要複製仍在繼續,命令傳播就會一直進行,使用主從服務器的狀態能夠一直保持一致

4.3 PSYNC

在Redis2.8+版本,Redis的slave在與master斷開鏈接重連的時候,默認是使用新的PSYNC同步方法,而不是原來的SYNC,由於斷線重連時,slave是包含有數據的,只是可能落後於master,因此不必又進行一次全量同步。

4.4 使用多實例的方法搭建主從複製

主節點6380端口,從節點6381和6382端口

A. 建立目錄及配置文件

[root@db1 ~]# mkdir -p /redis/638{0..2}

[root@db1 ~]# cat /redis/6380/redis.conf 
port 6380
daemonize yes
pidfile /redis/6380/redis.pid
loglevel notice
logfile /var/log/redis.log
dir /redis/6380
dbfilename dump.rdb
protected-mode no
[root@db1
~]# cat /redis/6381/redis.conf port 6381 daemonize yes pidfile /redis/6381/redis.pid loglevel notice logfile /var/log/redis.log dir /redis/6381 dbfilename dump.rdb protected-mode no
[root@db1
~]# cat /redis/6382/redis.conf port 6382 daemonize yes pidfile /redis/6382/redis.pid loglevel notice logfile /var/log/redis.log dir /redis/6382 dbfilename dump.rdb protected-mode no

B. 啓動三個redis服務

[root@db1 ~]# redis-server /redis/6380/redis.conf 
[root@db1 ~]# redis-server /redis/6381/redis.conf 
[root@db1 ~]# redis-server /redis/6382/redis.conf

C.登陸從庫,設置主從複製,並查看複製詳情

 

[root@db1 ~]# redis-cli -p 6381
127.0.0.1:6381> SLAVEOF 127.0.0.1 6380
OK
127.0.0.1:6381> INFO replication

[root@db1 ~]# redis-cli -p 6382
127.0.0.1:6382> SLAVEOF 127.0.0.1 6380
OK
127.0.0.1:6382> INFO replication

D. 關閉主庫模擬故障,主從切換

[root@db1 ~]# redis-cli -p 6380 shutdown           # 關閉主庫
[root@db1 ~]# redis-cli -p 6381                    # 登陸從庫
127.0.0.1:6381> SLAVEOF no one                     # 關閉從庫主從複製,則從庫自動變爲主庫
OK 
127.0.0.1:6381> INFO replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

# 登陸6382將6381設置爲主庫
[root@db1 ~]# redis-cli -p 6382
127.0.0.1:6382> SLAVEOF 127.0.0.1 6381
127.0.0.1:6382> INFO replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6381
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:1
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

5、Redis-Sentinel(哨兵)

Sentinel(哨崗、哨兵)是redis的高可用性解決方案:由一個或多個Sentinel實例組成的Sntinel系統。
其主要做用是能夠監視任意多個主服務器,以及這些主服務器樹下的全部從服務器,並在被監視的主服務器進入下線的狀態時,自動將下線主服務器屬下的某個從服務器升級爲新的主服務器,而後又新的主服務器代替已經下線的主服務器繼續處理命令請求。

其實哨兵模式存在的意義就是使redis高可用,當redis出現問題的時間可讓redis實現熱切換

A. 建立目錄及配置文件

mkdir /redis/26380
[root@db1 ~]# cd /redis/26380/
[root@db1 /redis/26380]# vim sentinel.conf
port 26380
dir /redis/26380
sentinel monitor mymaster 127.0.0.1 6380 1           # mymaster自已定義的名字,1表示有多少個sentinel認爲主庫down了,就是真的down了
sentinel down-after-milliseconds mymaster 5000       # 若是sentinel 5秒內聯繫不到主庫,則認爲主庫down了    

B. 啓動redis-sentinel服務

 [root@db1 ~]# redis-sentinel /redis/26380/sentinel.conf &
[1] 15517
 [root@db1 ~]#                 _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 3.2.12 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in sentinel mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26380
 |    `-._   `._    /     _.-'    |     PID: 15517
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

15517:X 27 May 17:21:02.962 # Sentinel ID is 3db4dd02a815226e6cbdbe6ac674103a733840bd
15517:X 27 May 17:21:02.962 # +monitor master mymaster 127.0.0.1 6380 quorum 1
15517:X 27 May 17:21:02.963 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
15517:X 27 May 17:21:02.964 * +slave slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
redis-sentinel /redis/26380/sentinel.conf &

C. 測試DOWN掉6380的主庫

 [root@db1 ~]# redis-cli -p 6380 shutdown
# 在主窗口能看到redis-sentinel打印的信息
15517:X 27 May 17:27:22.296 # +sdown master mymaster 127.0.0.1 6380
15517:X 27 May 17:27:22.296 # +odown master mymaster 127.0.0.1 6380 #quorum 1/1
15517:X 27 May 17:27:22.296 # +new-epoch 1
15517:X 27 May 17:27:22.296 # +try-failover master mymaster 127.0.0.1 6380
15517:X 27 May 17:27:22.299 # +vote-for-leader 3db4dd02a815226e6cbdbe6ac674103a733840bd 1
15517:X 27 May 17:27:22.299 # +elected-leader master mymaster 127.0.0.1 6380
15517:X 27 May 17:27:22.299 # +failover-state-select-slave master mymaster 127.0.0.1 6380
15517:X 27 May 17:27:22.389 # +selected-slave slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
15517:X 27 May 17:27:22.389 * +failover-state-send-slaveof-noone slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
15517:X 27 May 17:27:22.465 * +failover-state-wait-promotion slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
15517:X 27 May 17:27:23.320 # +promoted-slave slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
15517:X 27 May 17:27:23.320 # +failover-state-reconf-slaves master mymaster 127.0.0.1 6380
15517:X 27 May 17:27:23.374 * +slave-reconf-sent slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
15517:X 27 May 17:27:24.327 * +slave-reconf-inprog slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
15517:X 27 May 17:27:24.327 * +slave-reconf-done slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
15517:X 27 May 17:27:24.428 # +failover-end master mymaster 127.0.0.1 6380
15517:X 27 May 17:27:24.428 # +switch-master mymaster 127.0.0.1 6380 127.0.0.1 6382
15517:X 27 May 17:27:24.428 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6382
15517:X 27 May 17:27:24.428 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6382
15517:X 27 May 17:27:29.469 # +sdown slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6382
redis-cli -p 6380 shutdown

D. 當把6380啓動後,會自動加入集羣中

[root@db1 ~]# redis-server /redis/6380/redis.conf 
# 屏幕端打印信息
15517:X 27 May 17:30:54.393 # -sdown slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6382
相關文章
相關標籤/搜索