NoSQL——Redis

NoSQL——Redis

1、Redis介紹

  • Redis和Memcached相似,也屬於k-v數據存儲,可是功能和操做性要比Memcached好不少。
  • Redis官網redis.io, 當前最新穩定版4.0.1 支持更多value類型,除了和string外,還支持hash、lists(鏈表)、sets(集合)和sorted sets(有序集合)
  • redis使用了兩種文件格式:全量數據(RDB)增量請求(aof)
    • 全量數據格式是把內存中的數據寫入磁盤,便於下次讀取文件進行加載。
    • 增量請求文件則是把內存中的數據序列化爲操做請求,用於讀取文件進行replay獲得數據,這種相似於mysql binlog。爲了節省資源,當咱們手動保存一次全量數據,就能夠刪除當前的全部增量數據了,有些增量數據其實早就過時了,也可按期利用腳本作一些優化。
  • redis的存儲分爲內存存儲、磁盤存儲和log文件三部分
  • Redis最大的用戶就是新浪微博,它的部署場景大體分爲兩種:
    • 應用程序直接訪問Redis數據庫。
    • 應用程序直接訪問Redis,只有當Redis訪問失敗時,才訪問Mysql。

Redis適用場景:php

  • 取出最新N個數據的操做
  • 排行榜應用,取出Top N操做
  • 須要精確設定過時時間的應用
  • 計數器應用
  • uniq操做,獲取某段時間全部數據排除重複值
  • 實時系統,反垃圾系統
  • Pub/Sub構建實時消息系統。Redis獨有功能,發佈/訂閱
  • 構建隊列系統
  • 緩存

2、redis的安裝與配置

[root@ying01 ~]# cd /usr/local/src/
[root@ying01 src]# wget http://download.redis.io/releases/redis-4.0.9.tar.gz

[root@ying01 src]# tar zxf redis-4.0.9.tar.gz 
[root@ying01 src]# cd redis-4.0.9/
[root@ying01 redis-4.0.9]# 


[root@ying01 redis-4.0.9]# make && make install


[root@ying01 redis-4.0.9]# echo $?
0
[root@ying01 redis-4.0.9]# vim /etc/redis.conf


如下爲redis.conf配置內容的一些設置:


# Examples:
#
# bind 192.168.1.100 10.0.0.1     //此處配置監聽IP
# bind 127.0.0.1 ::1



protected-mode yes          //定義保護模式           

# Accept connections on the specified port, default is 6379 (IANA #815344).
# If port 0 is specified Redis will not listen on a TCP socket.
port 6379                   //監聽端口


daemonize no      //默認值爲no,表明前臺啓動,yes表示後臺啓動


pidfile /var/run/redis_6379.pid   //定義redis的PID

  
logfile ""            //此處定義redis的log存放路徑,默認爲空


dir ./                //定義rdb的存放位置(aof也是存在這個位置),默認爲根下            


slave-priority 100    //此爲設置權重,相似於負責均衡


appendonly no         //只增文件的名稱,默認爲 no ,不指定

# The name of the append only file (default: "appendonly.aof")

appendfilename "appendonly.aof"  //只增文件的名稱爲 appendonly.aof


# appendfsync always    // 每次更新數據都寫入僅增日誌文件。慢,可是最安全。   
appendfsync everysec    //每秒調用一次。折中。(默認狀況)
# appendfsync no       ///不調用,等待操做系統來清空緩衝區當操做系統要輸出數據時。很快。

大概瞭解以上設置含義,如今把配置文件中部份內容按下面設置;html

[root@ying01 ~]# vim /etc/redis.conf


daemonize yes                         //默認爲no,現設置爲yes


logfile "/var/log/redis.log"         //默認爲空

dir /data/redis                      //從新設置目錄,原來爲根下,等下須要建立定義的目錄

appendonly yes                       //原爲no
[root@ying01 redis-4.0.9]# mkdir /data/redis

[root@ying01 redis-4.0.9]# redis-server /etc/redis.conf 
[root@ying01 redis-4.0.9]# netstat -lntp |grep redis
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      1285/redis-server 1

查看redis.log,發現有記下警告信息:node

[root@ying01 redis-4.0.9]# less /var/log/redis.log

第一條 警告信息mysql

WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
#警告:沒法強制執行TCP的積壓設置511,由於/ proc / sys / net / core / somaxconn設置爲較低的值128。

第二條 警告信息linux

WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

#overcommit_memory設置爲0!在低內存條件下,後臺保存可能會失敗。要解決此問題,請將「vm.overcommit_memory = 1」添加到/etc/sysctl.conf,而後從新啓動或運行命令「sysctl vm.overcommit_memory = 1」以使其生效。

第三條警告信息git

WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

# 警告您在內核中啓用了透明大頁面(THP)支持。這將致使Redis的延遲和內存使用問題。要解決此問題,請以root身份運行命令「echo never> / sys / kernel / mm / transparent_hugepage / enabled」,並將其添加到/etc/rc.local中,以便在從新啓動後保留設置。禁用THP後必須從新啓動Redis。

解決方法:(安裝日誌說明來解決)github

在此文件中,先添加如下語句redis

[root@ying01 redis-4.0.9]# vim /etc/rc.local           


sysctl vm.overcommit_memory=1

echo never > /sys/kernel/mm/transparent_hugepage/enable

使用命令行,讓其生效;算法

[root@ying01 redis-4.0.9]# sysctl vm.overcommit_memory=1
vm.overcommit_memory = 1
[root@ying01 redis-4.0.9]# echo never > /sys/kernel/mm/transparent_hugepage/enabled

重啓redis服務sql

[root@ying01 redis-4.0.9]# redis-cli -h 127.0.0.1 -p 6379 shutdown     //中止服務
[root@ying01 redis-4.0.9]# netstat -lntp |grep redis
[root@ying01 redis-4.0.9]# redis-server /etc/redis.conf               //開啓服務
[root@ying01 redis-4.0.9]# netstat -lntp |grep redis
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      1285/redis-server 1

再次查看redis.log,發現2個警告已經解除

[root@ying01 redis-4.0.9]# less /var/log/redis.log




               _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 4.0.9 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 1394
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

1394:M 24 Aug 01:35:48.787 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is s
et to the lower value of 128.
1394:M 24 Aug 01:35:48.787 # Server initialized
1394:M 24 Aug 01:35:48.787 * Ready to accept connections
(END)

https://www.cnblogs.com/GoQC/p/5764201.html

https://www.cnblogs.com/pqchao/p/6549510.html

3、Redis 持久化

和Memcached服務同樣,若是關閉RDB和aof數據就會存儲在內存中,當重啓服務或者重啓機器 存儲的數據就會丟失。若是數據很重要,咱們就須要作持久化。

Redis的兩種持久化方式:RDB(Redis DataBase)和AOF(Append Only File)。

RDB:在不一樣的時間點,將redis存儲的數據生成快照並保存到磁盤等介質上。默認狀況下,RDB是開啓的。

AOF:將Redis執行過的全部指令記錄下來,下次Redis從新啓動時,只要把這些指令從前到後再重複執行一遍,就能夠實現數據恢復了。默認狀況,AOF是關閉的。

這兩種方式能夠同時使用。

若是你沒有數據持久化的需求,就能夠關閉RDB、AOF,這樣就跟memcache同樣,變成了一個純內存數據庫。

再次進入redis.conf配置文件

[root@ying01 redis-4.0.9]# vim /etc/redis.conf

#注意下面的演示:

#   In the example below the behaviour will be to save:
#   after 900 sec (15 min) if at least 1 key changed
#   after 300 sec (5 min) if at least 10 keys changed
#   after 60 sec if at least 10000 keys changed
#
#   Note: you can disable saving completely by commenting out all "save" lines.
#
#   It is also possible to remove all the previously configured save
#   points by adding a save directive with a single empty string argument
#   like in the following example:
#
#   save ""         //開啓持久化

save 900 1          //表示每(900s)15分鐘且至少有1個key改變,就觸發一次持久化
save 300 10         //表示每(300s)5分鐘且至少有10個key改變,就觸發一次持久化
save 60 10000       //表示每(60s)5分鐘且至少有10個key改變,就觸發一次持久化

關閉持久化:把#去掉則關閉持久化

save ""           //關閉持久化

#save 900 1          //表示每(900s)15分鐘且至少有1個key改變,就觸發一次持久化
#save 300 10         //表示每(300s)5分鐘且至少有10個key改變,就觸發一次持久化
#save 60 10000

AOF格式中appendfsync三種形式解析:

# appendfsync always            //一直寫,每次有變動就寫進去
appendfsync everysec            //安全高效,每一秒記錄一次,把數據從內存刷新到磁盤中去
# appendfsync no               //每隔一段時間,根據系統的算法,Linux系統不按期把內存的數據同步到磁盤上去,根據這個頻率走,容易丟數據

開啓AOF:appendonly yes,默認是appendonly no。

4、 redis數據類型

4.一、string類型

string爲最簡單的類型,與Memcached同樣的類型,一個key對應一個value,其支持的操做與Memcached的操做相似,它的功能更豐富。設置能夠存二進制的對象。

[root@ying01 redis-4.0.9]# redis-cli
127.0.0.1:6379> set mykey "abc"              //s設置單個鍵值 
OK
127.0.0.1:6379> get mykey                    //獲取鍵值
"abc"
127.0.0.1:6379> mset k1 a k2 b k3 c k4 d     //設置多個鍵值
OK
127.0.0.1:6379> mget k2 mykey                //獲取多個鍵值
1) "b"
2) "abc"
127.0.0.1:6379>

4.2 Redis數據類型-list 鏈表

list是一個鏈表結構,主要功能是push、pop、獲取一個範圍的全部值等等。操做中key理解爲鏈表的名字。

應用場景:

使用 list 結構,咱們能夠輕鬆地實現最新消息排行等功能(好比新浪微博的 TimeLine )。list 的另外一個應用就是消息隊列,能夠利用 list 的 push操做,將任務存在 list 中,而後工做線程再用pop操做將任務取出進行執行。

127.0.0.1:6379> LPUSH list1 "8"
(integer) 1
127.0.0.1:6379> LPUSH list1 "18"
(integer) 2
127.0.0.1:6379> LPUSH list1 "28"
(integer) 3
127.0.0.1:6379> LRANGE list1 0 -1
1) "28"
2) "18"
3) "8"
127.0.0.1:6379> LPOP list1
"28"
127.0.0.1:6379> LRANGE list1 0 -1
1) "18"
2) "8"
127.0.0.1:6379>

4.3 Redis數據類型-set 集合

set是集合,和咱們數學中的集合概念類似,對集合的操做有添加刪除元素,有對多個集合求交併差等操做。操做中key理解爲集合的名字。

應用場景:

好比在微博應用中,能夠將一個用戶全部的關注人存在一個集合中,將其全部粉絲存在一個集合。由於 Redis 很是人性化的爲集合提供了求交集、並集、差集等操做,那麼就能夠很是方便的實現如共同關注、共同喜愛、二度好友等功能,對上面的全部集合操做,你還可使用不一樣的命令選擇將結果返回給客戶端仍是存集到一個新的集合中。

創建set一、set2集合元素

127.0.0.1:6379> SADD set1 8
(integer) 0
127.0.0.1:6379> SADD set1 28
(integer) 0
127.0.0.1:6379> SADD set1 58
(integer) 1
127.0.0.1:6379> SADD set2 28
(integer) 1
127.0.0.1:6379> SADD set2 58
(integer) 1
127.0.0.1:6379> SADD set2 88
(integer) 1

查看set一、set2集合

127.0.0.1:6379> SMEMBERS set1
1) "8"
2) "28"
3) "58"
127.0.0.1:6379> SMEMBERS set2
1) "28"
2) "58"
3) "88"

集合並集

127.0.0.1:6379>  SUNION set1 set2
1) "8"
2) "28"
3) "58"
4) "88"

集合交集

127.0.0.1:6379> SINTER set1 set2
1) "28"
2) "58"

集合差集

127.0.0.1:6379> SDIFF set1 set2
1) "8"

刪除元素

127.0.0.1:6379> SREM set1 8 28
(integer) 2
127.0.0.1:6379> SMEMBERS set1
1) "58"

4.4 Redis數據類型-sort set 有序集合

sorted set是有序集合,它比set多了一個權重參數score,使得集合中的元素可以按 score 進行有序排列。

應用場景:

好比一個存儲全班同窗成績的 Sorted Sets,其集合 value 能夠是同窗的學號,而 score 就能夠是其考試得分,這樣在數據插入集合的時候,就已經進行了自然的排序。

127.0.0.1:6379> ZADD score 18 A
(integer) 1
127.0.0.1:6379> ZADD score 8  B
(integer) 1
127.0.0.1:6379> ZADD score 58 ZQ
(integer) 1
127.0.0.1:6379> ZADD score 88 Q
(integer) 1
127.0.0.1:6379> ZRANGE score 0 -1         //正序
1) "B"
2) "A"
3) "ZQ"
4) "Q"
127.0.0.1:6379> ZREVRANGE score 0 -1     //倒序
1) "Q"
2) "ZQ"
3) "A"
4) "B"
127.0.0.1:6379>

4.5 Redis數據類型-hash

在 Memcached 中,咱們常常將一些結構化的信息打包成 hashmap,在客戶端序列化後存儲爲一個字符串的值(通常是 JSON 格式),好比用戶的暱稱、年齡、性別、積分等

127.0.0.1:6379> HSET hash1 name zq      //定義
(integer) 1
127.0.0.1:6379> HSET hash1 age 18
(integer) 1
127.0.0.1:6379> HSET hash1 job sing
(integer) 1
127.0.0.1:6379> HSET hash1 home shanghai
(integer) 1
127.0.0.1:6379> Hget hash1 job         //查看
"sing"
127.0.0.1:6379> Hget hash1 name
"zq"
127.0.0.1:6379> Hget hash1 home
"shanghai"
127.0.0.1:6379> Hget hash1 age
"18"
127.0.0.1:6379>

5、Redis經常使用操做

5.1 string操做

  • 若是一個key設置兩個不一樣的值,第二個值會覆蓋第一個值。
127.0.0.1:6379> set key1 18
OK
127.0.0.1:6379> set key2 58
OK
127.0.0.1:6379> set key1 88
OK
127.0.0.1:6379> get key1
"88"
127.0.0.1:6379>
  • SETNX 檢測鍵值是否有value 若是有直接返回一個 0 若是沒有直接返回一個 1 而且建立此 value
127.0.0.1:6379> SETNX key1 zq
(integer) 0
127.0.0.1:6379> get key1
"88"
127.0.0.1:6379> SETNX key3 zq
(integer) 1
127.0.0.1:6379> get key3
"zq"
127.0.0.1:6379>
  • setex 針對某個key設置一個過時時間。
127.0.0.1:6379> set key3 zq01 ex 5
OK
127.0.0.1:6379> get key3
(nil)
127.0.0.1:6379> set key3 zq01 ex 50
OK
127.0.0.1:6379> get key3
"zq01"
127.0.0.1:6379> 

127.0.0.1:6379> setex key3 10 zq02  //給key3設置過時時間爲10s,值爲zq02,若key已經存在,會覆蓋新的值
OK
127.0.0.1:6379> get key3            
"zq02"
127.0.0.1:6379> get key3
(nil)

5.二、list操做

  • LPUSH 取值,RPOP 或者 LPOP只要把值取出來 其中的值就會被刪除掉。

lpush lista a //從左側加入一個元素 lrange lista 0 -1 //取出從0開始到倒數第一個之間的元素 lpop lista //從左側取出第一個元素 rpush lista 1 //從右側加入一個元素 rpop lista //從右側取出第一個元素

127.0.0.1:6379> LPUSH lista 111
(integer) 1
127.0.0.1:6379> LPUSH lista 222
(integer) 2
127.0.0.1:6379> LPUSH lista 333
(integer) 3
127.0.0.1:6379> LPUSH lista 555
(integer) 4
127.0.0.1:6379> LRANGE lista 0 -1
1) "555"
2) "333"
3) "222"
4) "111"
127.0.0.1:6379> LPOP lista
"555"
127.0.0.1:6379> LPOP lista
"333"
127.0.0.1:6379> LRANGE lista 0 -1
1) "222"
2) "111"
127.0.0.1:6379>  RPOP lista
"111"
127.0.0.1:6379> LRANGE lista 0 -1
1) "222"
127.0.0.1:6379>

元素的修改:先在xxx清單增長 A B C D E ,而後更換第二位的數值

127.0.0.1:6379> LPUSH xxx A
(integer) 1
127.0.0.1:6379> LPUSH xxx B
(integer) 2
127.0.0.1:6379> LPUSH xxx C
(integer) 3
127.0.0.1:6379> LPUSH xxx D
(integer) 4
127.0.0.1:6379> LPUSH xxx E
(integer) 5
127.0.0.1:6379> LSET xxx 2 W
OK
127.0.0.1:6379> LINDEX xxx 2
"W"
127.0.0.1:6379> LINDEX xxx 3
"B"
127.0.0.1:6379> LINDEX xxx 4
"A"
127.0.0.1:6379> LINDEX xxx 5
(nil)
127.0.0.1:6379> LINDEX xxx 1
"D"
127.0.0.1:6379> LINDEX xxx 0
"E"

查看清單中元素的數量

127.0.0.1:6379> LLEN xxx
(integer) 5

在某個元素前面(後面)插入一個元素:

127.0.0.1:6379> LINSERT xxx  before D S
(integer) 6
127.0.0.1:6379> LRANGE xxx 0 -1
1) "E"
2) "S"
3) "D"
4) "W"
5) "B"
6) "A"
127.0.0.1:6379>

5.三、set操做

前面已經演示過,下面set操做整理起來;

命令格式 釋義
sadd 集合名 元素 向集合添加元素
smembers 集合名 查看集合中的所有元素
srem 集合名 元素 刪除元素
spop 集合名 取出一個元素,刪除
sdiff 集合1 集合2 以集合1爲標準,求差集
sdiffstore 集合1 集合2 集合3 求差集並儲存到集合1
sinter 集合1 集合2 求交集
sinterstore 集合1 集合2 集合3 求交集,並存儲到集合1
sunion 集合1 集合2 求並集
sunion 集合1 集合2 集合3 求並集並存儲到集合1
sismembaer 集合 元素 判斷一個元素是否屬於一個集合,是則返回1。
srandmember 集合 取出一個元素,但不刪除
zadd 集合 建立有序集合
zrange 集合 0 -1 顯示全部元素,按順序顯示
zrange 集合 0 -1 withscores 帶上分值
zrem 集合 元素 刪除指定元素
zrank 集合 元素 返回元素的索引值
zrevrank 集合 元素 按score反向排列
zrevrange 集合 0 -1 反向顯示,並帶分值
zcard 集合 返回集合中的元素的個數
zrangebyscore 集合 1 10 返回1-10的元素個數
zremrangebyrank 集合 0 2 刪除索引0-2的元素,按分值正向排序
zremrangebyscore 集合 0 2 刪除分值0-2的元素

5.3 hash操做

  • HMSET 批量創建鍵值對
127.0.0.1:6379> HMSET hash2 a 1 b 2 c 3 d 4 e 5
OK
127.0.0.1:6379> Hgetall hash2
 1) "a"
 2) "1"
 3) "b"
 4) "2"
 5) "c"
 6) "3"
 7) "d"
 8) "4"
 9) "e"
10) "5"
  • HMGET 查詢一個鍵值
127.0.0.1:6379> hmget hash2 b c
1) "2"
2) "3"

HMGET 查詢一個鍵值

127.0.0.1:6379> hdel hash2 b
(integer) 1
127.0.0.1:6379>  Hgetall hash2
1) "a"
2) "1"
3) "c"
4) "3"
5) "d"
6) "4"
7) "e"
8) "5"
  • HKEYS 打印全部的鍵值
127.0.0.1:6379> hkeys hash2
1) "a"
2) "c"
3) "d"
4) "e"
  • HVALS 打印全部的values
127.0.0.1:6379> hvals hash2
1) "1"
2) "3"
3) "4"
4) "5"
  • hlen 查看有幾個filed
127.0.0.1:6379> hlen hash2
(integer) 4
127.0.0.1:6379>

6、Redis操做鍵值

經常使用如下鍵值

  • keys * :取出全部鍵
  • exists 鍵名:存在返回1
  • del 鍵:刪除鍵
  • expire 鍵 100:設置鍵100秒後過時
  • ttl 鍵:查看鍵的過時時間,單位是秒,當鍵不存在返回-2,鍵存在但沒設置過時時間返回-1
  • select 0 :表明選擇當前數據庫,默認進入0數據庫
  • move age 1 :把age移動到1數據庫
  • persist 鍵:取消鍵的過時時間
  • randomkey:返回一個鍵
  • rename oldname newname:重命名
  • type 鍵:返回鍵的類型

查看全部鍵值:

127.0.0.1:6379> keys *
 1) "score"
 2) "key1"
 3) "set2"
 4) "key2"
 5) "xxx"
 6) "k4"
 7) "lista"
 8) "list1"
 9) "hash1"
10) "set1"
11) "k2"
12) "k1"
13) "k3"
14) "mykey"
15) "hash2"

模糊匹配鍵:

127.0.0.1:6379> keys ke*
1) "key1"
2) "key2"

判斷鍵是否存在:

127.0.0.1:6379> exists key1
(integer) 1
127.0.0.1:6379> exists key
(integer) 0

刪除鍵

127.0.0.1:6379> get key1
"88"
127.0.0.1:6379> del key1
(integer) 1
127.0.0.1:6379> get key1
(nil)

設置過時時間:

127.0.0.1:6379> expire key2 50
(integer) 1

查看鍵的過時時間:

127.0.0.1:6379> ttl key2
(integer) 42

選擇當前數據庫:

127.0.0.1:6379> select 0
OK
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> keys *
(empty list or set)
127.0.0.1:6379[1]> select 0   //表明選擇當前數據庫,默認進入0 數據庫
OK

將某個鍵移動到其餘數據庫:

127.0.0.1:6379> keys *
 1) "score"
 2) "set2"
 3) "xxx"
 4) "k4"
 5) "lista"
 6) "list1"
 7) "hash1"
 8) "set1"
 9) "k2"
10) "k1"
11) "k3"
12) "mykey"
13) "hash2"
127.0.0.1:6379> move k1 3
(integer) 1

隨機返回一個鍵:

127.0.0.1:6379> randomkey
"k2"
127.0.0.1:6379> randomkey
"set2"
127.0.0.1:6379> randomkey
"set2"

鍵重命名:

127.0.0.1:6379> rename k1 kx   //k1不存在
(error) ERR no such key

127.0.0.1:6379> keys *
 1) "score"
 2) "set2"
 3) "xxx"
 4) "k4"
 5) "lista"
 6) "list1"
 7) "hash1"
 8) "set1"
 9) "k2"
10) "k3"
11) "mykey"
12) "hash2"
127.0.0.1:6379> rename k2 k8
OK

鍵的類型:

127.0.0.1:6379> type score
zset
127.0.0.1:6379> type k8
string
127.0.0.1

dbsize:返回當前數據的key數量

:6379> dbsize
(integer) 12

7、Redis安全設置

如何解決redis漏洞

  • 設置密碼
  • 更改默認端口
  • 監聽內網IP
  • 設定專用帳戶
  • 修改configure命令
root@ying01 redis-4.0.9]# vim /etc/redis.conf


port 18000                     //更改端口
 
requirepass www123             //設置密碼


rename-command CONFIG ying    //改成ying,自定義


# rename-command CONFIG ""   //禁用

先不重啓服務,查看k8的值

[root@ying01 redis-4.0.9]# redis-cli
127.0.0.1:6379> get k6
(nil)
127.0.0.1:6379> get k8
"b"
127.0.0.1:6379> quit

重啓服務

[root@ying01 redis-4.0.9]# killall redis-server
[root@ying01 redis-4.0.9]# redis-server /etc/redis.conf

嘗試登陸redis

[root@ying01 redis-4.0.9]# redis-cli                                       //直接登陸不上
Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected> quit

[root@ying01 redis-4.0.9]# netstat -lntp |grep redis                       //端口變爲18000
tcp        0      0 127.0.0.1:18000         0.0.0.0:*               LISTEN      1832/redis-server 1 

[root@ying01 redis-4.0.9]# redis-cli -p 18000                              //指定端口18000 仍是登陸不上
127.0.0.1:18000> get k8
(error) NOAUTH Authentication required.
127.0.0.1:18000> quit

[root@ying01 redis-4.0.9]# redis-cli -p 18000 -a 'www123'               //端口、密碼都指定,才能登陸
127.0.0.1:18000> get k8
"b"
127.0.0.1:18000>

8、redis慢查詢日誌

慢查詢日誌,兩個參數:一個是執行時長,單位是微妙,另外一個是慢查詢日誌的長度。當一個新的命令被寫入日誌時,最老的一條會從命令日誌隊列中被移除。

在配置文件redis.conf中,查看慢日誌的定義:

[root@ying01 ~]# vim /etc/redis.conf
 
 slowlog-log-slower-than 1000:表示慢於1000ms則記錄日誌
 slowlog-max-len 128:定義長度,最多存128條

使用命令行,查詢慢日誌

  • slowlog get:列出 所有慢查詢日誌
  • slowlog len:查看慢查詢日誌條數

先在配置文件中,定義慢於10ms,則記錄日誌,(爲了方便試驗,由於任何操做都會大於10ms)

[root@ying01 ~]# vim /etc/redis.conf

 slowlog-log-slower-than 10

啓動redis服務,開始作測試

[root@ying01 ~]# redis-server /etc/redis.conf 
[root@ying01 ~]# ps aux |grep redis
root      1385  4.3  0.7 145304  7692 ?        Ssl  23:36   0:00 redis-server 127.0.0.1:6379
root      1390  0.0  0.0 112720   984 pts/0    R+   23:36   0:00 grep --color=auto redis
[root@ying01 ~]# redis-cli -a 'www123'
127.0.0.1:6379> slowlog get      //此時剛進入了,沒有
1) 1) (integer) 0
   2) (integer) 1535125047
   3) (integer) 283
   4) 1) "COMMAND"
   5) "127.0.0.1:34834"
   6) ""
127.0.0.1:6379> keys *        //試着執行一個命令
 1) "set2"
 2) "score"
 3) "k8"
 4) "xxx"
 5) "lista"
 6) "k4"
 7) "k3"
 8) "hash2"
 9) "hash1"
10) "list1"
11) "set1"
12) "mykey"
127.0.0.1:6379> get k3       //再執行第二個命令
"c"
127.0.0.1:6379> SLOWLOG get    //此時列出所有查詢日誌
1) 1) (integer) 2
   2) (integer) 1535125090
   3) (integer) 30
   4) 1) "keys"
      2) "*"
   5) "127.0.0.1:34834"
   6) ""
2) 1) (integer) 1
   2) (integer) 1535125066
   3) (integer) 34
   4) 1) "slowlog"
      2) "get"
   5) "127.0.0.1:34834"
   6) ""
3) 1) (integer) 0
   2) (integer) 1535125047
   3) (integer) 283
   4) 1) "COMMAND"
   5) "127.0.0.1:34834"
   6) ""
127.0.0.1:6379> SLOWLOG get 1    //得到當前的日誌
1) 1) (integer) 3
   2) (integer) 1535125141
   3) (integer) 68
   4) 1) "SLOWLOG"
      2) "get"
   5) "127.0.0.1:34834"
   6) ""
127.0.0.1:6379> SLOWLOG get 2     //得到前二個日誌
1) 1) (integer) 4
   2) (integer) 1535125219
   3) (integer) 15
   4) 1) "SLOWLOG"
      2) "get"
      3) "1"
   5) "127.0.0.1:34834"
   6) ""
2) 1) (integer) 3
   2) (integer) 1535125141
   3) (integer) 68
   4) 1) "SLOWLOG"
      2) "get"
   5) "127.0.0.1:34834"
   6) ""
127.0.0.1:6379> SLOWLOG len       //得到慢日誌條數
(integer) 6
127.0.0.1:6379>

9、php安裝redis擴展模塊

下載phpredis模塊源碼包,解壓

[root@ying01]# cd /usr/local/src/
[root@ying01 src]# wget https://codeload.github.com/phpredis/phpredis/zip/develop

[root@ying01 src]# mv develop phpredis-develop.zip
[root@ying01 src]# unzip phpredis-develop.zip

編譯,安裝php的redis模塊

[root@ying01 phpredis-develop]# cd phpredis-develop/
[root@ying01 phpredis-develop]# /usr/local/php-fpm/bin/phpize   
Configuring for:
PHP Api Version:         20131106
Zend Module Api No:      20131226
Zend Extension Api No:   220131226
[root@ying01 phpredis-develop]#  ./configure --with-php-config=/usr/local/php-fpm/bin/php-config


[root@ying01 phpredis-develop]# make


[root@ying01 phpredis-develop]# make install

在php.ini配置文件中添加 extension=redis.so

[root@ying01 phpredis-develop]# vim /usr/local/php-fpm/etc/php.ini


extension=memcache.so     //memcache模塊以前添加的  
extension=redis.so       //添加

查看php-fpm模塊中,是否有redis模塊;

[root@ying01 phpredis-develop]# /usr/local/php-fpm/bin/php -m|grep redis
redis

[root@ying01 phpredis-develop]# /etc/init.d/php-fpm restart 
Gracefully shutting down php-fpm . done
Starting php-fpm  done

10、redis存儲session

** redis存儲session,有三種配置方法**:

一、/usr/local/php-fpm/etc/php.ini中添加:

session.save_handler = "redis"

session.save_path = "tcp://127.0.0.1:6379"

二、lamp中在Apache虛擬主機配置文件中添加:

php_value session.save_handler = "redis"

php_value session.save_path = "tcp://127.0.0.1:6379"

三、在php-fpm配置文件對應的pool:/usr/local/php-fpm/etc/php-fpm.d/ying.com.conf 中添加:

php_value[session.save_handler] = "redis"

php_value[session.save_path] = "tcp://127.0.0.1:6379"

把下面語句添加在 ying.com pool下

[root@ying01 ~]# vim /usr/local/php-fpm/etc/php-fpm.d/ying.com.conf 


添加如下語句:

php_value[session.save_handler] = redis
php_value[session.save_path] = " tcp://127.0.0.1:6379 "

在redis配置文件中,取消密碼,方便試驗

[root@ying01 ~]# vim /etc/redis.conf 


#requirepass www123         //加上#,就表明此命令不執行

更改配置文件後,須要重啓redis服務

[root@ying01 ~]# killall redis-server
[root@ying01 ~]# redis-server /etc/redis.conf

測試中,能夠看出來redis是能夠存儲ssion

[root@ying01 ~]# curl localhost/1.php
1535202678<br><br>1535202678<br><br>fb0tk0r5nnvgs1fhngten6kvf4 
[root@ying01 ~]# curl localhost/1.php
1535202680<br><br>1535202680<br><br>d9u8oi1d0o1l2m6blm0gneb9p5 //注意
[root@ying01 ~]# curl localhost/1.php
1535202681<br><br>1535202681<br><br>ks2a20t9gikjbvhpevcrrts5r0 
[root@ying01 ~]# curl localhost/1.php
1535202681<br><br>1535202681<br><br>26ff1ifkdi6s6vje10kl1ane36 
[root@ying01 ~]# curl localhost/1.php
1535202682<br><br>1535202682<br><br>5setf9nc5ih8de5a8p6dda01r3 
[root@ying01 ~]# curl localhost/1.php
1535202682<br><br>1535202682<br><br>phh916fl6s4fcl08agee13cqe6 
[root@ying01 ~]# curl localhost/1.php
1535202683<br><br>1535202683<br><br>2467qf64g4j4rk4ac2o2ms4mm6 
[root@ying01 ~]# curl localhost/1.php
1535202684<br><br>1535202684<br><br>cl3m6hpshf55unro62ccq4q5h6 
[root@ying01 ~]# redis-cli 
127.0.0.1:6379> keys *
 1) "PHPREDIS_SESSION:d9u8oi1d0o1l2m6blm0gneb9p5"            //注意     
 2) "score"
 3) "PHPREDIS_SESSION:cl3m6hpshf55unro62ccq4q5h6"
 4) "list1"
 5) "k8"
 6) "set1"
 7) "PHPREDIS_SESSION:2467qf64g4j4rk4ac2o2ms4mm6"
 8) "k3"
 9) "PHPREDIS_SESSION:26ff1ifkdi6s6vje10kl1ane36"
10) "PHPREDIS_SESSION:phh916fl6s4fcl08agee13cqe6"
11) "mykey"
12) "PHPREDIS_SESSION:fb0tk0r5nnvgs1fhngten6kvf4"
13) "set2"
14) "hash1"
15) "lista"
16) "hash2"
17) "PHPREDIS_SESSION:ks2a20t9gikjbvhpevcrrts5r0"
18) "k4"
19) "PHPREDIS_SESSION:5setf9nc5ih8de5a8p6dda01r3"
20) "xxx"
127.0.0.1:6379> get PHPREDIS_SESSION:d9u8oi1d0o1l2m6blm0gneb9p5    //注意
"TEST|i:1535202680;TEST3|i:1535202680;"
127.0.0.1:6379> get PHPREDIS_SESSION:5setf9nc5ih8de5a8p6dda01r3
"TEST|i:1535202682;TEST3|i:1535202682;"
127.0.0.1:6379>

11、redis主從配置

在master(ying01)上修改redis的配置文件,master上改動不大

[root@ying01 ~]# vim /etc/redis.conf


bind 192.168.112.136 127.0.0.1

port 6379

pidfile /var/run/redis_6379.pid

appendonly yes

在slave(ying02)上修改redis的配置文件

[root@ying02 ~]# vim /etc/redis.conf

bind  127.0.0.1 192.168.112.138

port 6380

pidfile /var/run/redis_6380.pid

slaveof 192.168.112.136 6379

appendonly yes

分別在master、slave機器上重啓redis服務

[root@ying01 ~]# killall redis-server
[root@ying01 ~]# redis-server /etc/redis.conf
[root@ying02 ~]#  killall redis-server
[root@ying02 ~]# redis-server /etc/redis.conf

分別在master、slave機器上登陸redis,使用命令"info Replication"

[root@ying01 ~]# redis-cli -p 6379
127.0.0.1:6379> info Replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.112.138,port=6380,state=online,offset=14,lag=1
master_replid:87fc3ee31a10a84b042f74e896e060d3acbd9de2
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14
127.0.0.1:6379>

slave上的信息

[root@ying02 ~]# redis-cli -p 6380
127.0.0.1:6380>  info Replication 
# Replication
role:slave
master_host:192.168.112.136
master_port:6379
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
slave_repl_offset:28
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:87fc3ee31a10a84b042f74e896e060d3acbd9de2
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:28
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:28
127.0.0.1:6380>

上面的信息代表:主從啓動成功

12、redis集羣

12.1 、redis集羣介紹

先看redis的集羣架構圖

在這個圖中,每個藍色的圈都表明着一個redis的服務器節點。它們任何兩個節點之間都是相互連通的。客戶端能夠與任何一個節點相鏈接,而後就能夠訪問集羣中的任何一個節點。對其進行存取和其餘操做。

redis集羣特色

  • 多個redis節點網絡互聯,數據共享
  • 全部的節點都是一主一從(能夠是多個從),其中從不提供服務,僅做爲備用
  • 不支持同時處理多個鍵(如mset/mget),由於redis須要把鍵均勻分佈在各個節點上,併發量很高的狀況下同時建立鍵值會下降性能並致使不可預測的行爲。
  • 支持在線增長、刪除節點
  • 客戶端能夠連任何一個主節點進行讀寫

參考資料

三張圖秒懂Redis集羣設計原理

12.2 redis集羣搭建配置

ying01機器上

新建redis_7000.conf配置文件

[root@ying01 ~]# cd /etc/
[root@ying01 etc]# vim redis_7000.conf

port 7000
bind 192.168.112.136
daemonize yes
pidfile /var/run/redis_7000.pid
dir /data/redis_data/7000
cluster-enabled yes
cluster-config-file nodes_7000.conf
cluster-node-timeout 10100
appendonly yes

新建redis_7002.conf配置文件

[root@ying01 etc]# vim redis_7002.conf

port 7002
bind 192.168.112.136
daemonize yes
pidfile /var/run/redis_7002.pid
dir /data/redis_data/7002
cluster-enabled yes
cluster-config-file nodes_7002.conf
cluster-node-timeout 10100
appendonly yes

新建redis_7004.conf配置文件

[root@ying01 etc]# vim redis_7004.conf

port 7004
bind 192.168.112.136
daemonize yes
pidfile /var/run/redis_7004.pid
dir /data/redis_data/7004
cluster-enabled yes
cluster-config-file nodes_7004.conf
cluster-node-timeout 10100
appendonly yes

建立目錄

[root@ying01 etc]# mkdir /data/redis_data
[root@ying01 etc]# mkdir /data/redis_data/{7000,7002,7004}

分別開啓7000、700二、7004的redis服務

[root@ying01 etc]# redis-server /etc/redis_7000.conf 
13835:C 27 Aug 00:20:59.978 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
13835:C 27 Aug 00:20:59.978 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=13835, just started
13835:C 27 Aug 00:20:59.978 # Configuration loaded
[root@ying01 etc]# redis-server /etc/redis_7002.conf 
13840:C 27 Aug 00:21:08.133 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
13840:C 27 Aug 00:21:08.133 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=13840, just started
13840:C 27 Aug 00:21:08.133 # Configuration loaded
[root@ying01 etc]# redis-server /etc/redis_7004.conf 
13845:C 27 Aug 00:21:13.131 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
13845:C 27 Aug 00:21:13.131 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=13845, just started
13845:C 27 Aug 00:21:13.131 # Configuration loaded
[root@ying01 etc]# netstat -lntp |grep redis
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      1741/redis-server 1 
tcp        0      0 192.168.112.136:6379    0.0.0.0:*               LISTEN      1741/redis-server 1 
tcp        0      0 192.168.112.136:17004   0.0.0.0:*               LISTEN      13846/redis-server  
tcp        0      0 192.168.112.136:7000    0.0.0.0:*               LISTEN      13836/redis-server  
tcp        0      0 192.168.112.136:7002    0.0.0.0:*               LISTEN      13841/redis-server  
tcp        0      0 192.168.112.136:7004    0.0.0.0:*               LISTEN      13846/redis-server  
tcp        0      0 192.168.112.136:17000   0.0.0.0:*               LISTEN      13836/redis-server  
tcp        0      0 192.168.112.136:17002   0.0.0.0:*               LISTEN      13841/redis-server  
[root@ying01 etc]# ps aux |grep redis
root      1741  0.1  0.5 147352  9840 ?        Ssl  8月26   0:05 redis-server 192.168.112.136:6379
root     13836  0.0  0.4 145308  7580 ?        Ssl  00:20   0:00 redis-server 192.168.112.136:7000 [cluster]
root     13841  0.1  0.4 145308  7576 ?        Ssl  00:21   0:00 redis-server 192.168.112.136:7002 [cluster]
root     13846  0.0  0.4 145308  7576 ?        Ssl  00:21   0:00 redis-server 192.168.112.136:7004 [cluster]
root     13853  0.0  0.0 112720   984 pts/0    S+   00:21   0:00 grep --color=auto redis

ying02 機器上

新建redis_7001.conf配置文件

[root@ying02 etc]# vim redis_7001.conf

port 7001
bind 192.168.112.138
daemonize yes
pidfile /var/run/redis_7001.pid
dir /data/redis_data/7001
cluster-enabled yes
cluster-config-file nodes_7001.conf
cluster-node-timeout 10100
appendonly yes

新建redis_7003.conf配置文件

[root@ying02 etc]# vim redis_7003.conf

port 7003
bind 192.168.112.138
daemonize yes
pidfile /var/run/redis_7003.pid
dir /data/redis_data/7003
cluster-enabled yes
cluster-config-file nodes_7003.conf
cluster-node-timeout 10100
appendonly yes

新建redis_7005.conf配置文件

[root@ying02 etc]# vim redis_7005.conf

port 7005
bind 192.168.112.138
daemonize yes
pidfile /var/run/redis_7005.pid
dir /data/redis_data/7005
cluster-enabled yes
cluster-config-file nodes_7005.conf
cluster-node-timeout 10100
appendonly yes

建立目錄

[root@ying02 etc]# mkdir /data/redis_data
[root@ying02 etc]# mkdir /data/redis_data/{7001,7003,7005}

分別開啓700一、700三、7005的redis服務

[root@ying02 etc]# redis-server /etc/redis_7001.conf
4535:C 27 Aug 00:22:55.023 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
4535:C 27 Aug 00:22:55.023 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=4535, just started
4535:C 27 Aug 00:22:55.023 # Configuration loaded
[root@ying02 etc]# redis-server /etc/redis_7003.conf
4544:C 27 Aug 00:22:59.103 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
4544:C 27 Aug 00:22:59.103 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=4544, just started
4544:C 27 Aug 00:22:59.103 # Configuration loaded
[root@ying02 etc]# redis-server /etc/redis_7005.conf
4552:C 27 Aug 00:23:03.193 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
4552:C 27 Aug 00:23:03.193 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=4552, just started
4552:C 27 Aug 00:23:03.193 # Configuration loaded
[root@ying02 etc]# netstat -lntp |grep redis
tcp        0      0 192.168.112.138:17003   0.0.0.0:*               LISTEN      4545/redis-server 1 
tcp        0      0 192.168.112.138:6380    0.0.0.0:*               LISTEN      2974/redis-server 1 
tcp        0      0 127.0.0.1:6380          0.0.0.0:*               LISTEN      2974/redis-server 1 
tcp        0      0 192.168.112.138:17005   0.0.0.0:*               LISTEN      4553/redis-server 1 
tcp        0      0 192.168.112.138:7001    0.0.0.0:*               LISTEN      4536/redis-server 1 
tcp        0      0 192.168.112.138:7003    0.0.0.0:*               LISTEN      4545/redis-server 1 
tcp        0      0 192.168.112.138:7005    0.0.0.0:*               LISTEN      4553/redis-server 1 
tcp        0      0 192.168.112.138:17001   0.0.0.0:*               LISTEN      4536/redis-server 1 
[root@ying02 etc]# ps aux |grep redis
root      2974  0.1  0.1 147352  2516 ?        Ssl  8月26   0:05 redis-server 127.0.0.1:6380
root      4536  0.0  0.1 145308  2648 ?        Ssl  00:22   0:00 redis-server 192.168.112.138:7001 [cluster]
root      4545  0.1  0.1 145308  2652 ?        Ssl  00:22   0:00 redis-server 192.168.112.138:7003 [cluster]
root      4553  0.0  0.1 145308  2648 ?        Ssl  00:23   0:00 redis-server 192.168.112.138:7005 [cluster]
root      4565  0.0  0.0 112720   984 pts/0    R+   00:23   0:00 grep --color=auto redis

在ying01機器上安裝ruby2.2(只須要在ying01上安裝)

[root@ying01 ~]# yum -y groupinstall "Development Tools"

[root@ying01 ~]# yum -y install gdbm-devel libdb4-devel libffi-devel libyaml libyaml-devel ncurses-devel openssl-devel readline-devel tcl-deve

建立rpmbuild目錄及其子目錄

[root@ying01 ~]# mkdir -p rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
[root@ying01 ~]# ls rpmbuild/
BUILD  BUILDROOT  RPMS  SOURCES  SPECS  SRPMS

下載ruby的源碼包,存放在rpmbuild/SOURCES目錄下

[root@ying01 ~]# wget http://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.3.tar.gz -P rpmbuild/SOURCES

下載ruby的spec的文件,目的rpmbuild把其生成rpm文件

[root@ying01 ~]# wget https://raw.githubusercontent.com/tjinjin/automate-ruby-rpm/master/ruby22x.spec -P rpmbuild/SPECS


[root@ying01 ~]# rpmbuild -bb rpmbuild/SPECS/ruby22x.spec

安裝 ruby-2.2.3-1.el7.centos.x86_64.rpm ,並查看其版本號

[root@ying01 ~]# ls rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm 
rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm
[root@ying01 ~]# du -sh !$
du -sh rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm
10M	rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm
[root@ying01 ~]# rpm -ivh rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm
準備中...                          ################################# [100%]
正在升級/安裝...
   1:ruby-2.2.3-1.el7.centos          ################################# [100%]

[root@ying01 ~]# ruby -v                          //查看版本號
ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-linux]

用gem安與redis中與ruby相關的文件 redis-trib.rb

[root@ying01 ~]# gem install redis
Fetching: redis-4.0.2.gem (100%)
Successfully installed redis-4.0.2
Parsing documentation for redis-4.0.2
Installing ri documentation for redis-4.0.2
Done installing documentation for redis after 1 seconds
1 gem installed

如今把redis-trib.rb 複製到/usr/bin/下,能夠直接使用這個命令

[root@ying01 ~]#  cp /usr/local/src/redis-4.0.9/src/redis-trib.rb /usr/bin/

用redis-trib.rb 命令分配主、從端口

[root@ying01 ~]#  redis-trib.rb create --replicas 1 192.168.112.136:7000 192.168.112.136:7002 192.168.112.136:7004 192.168.112.138:7001 192.168.112.138:7003 192.168.112.138:7005
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.112.136:7000
192.168.112.138:7001
192.168.112.136:7002
Adding replica 192.168.112.138:7005 to 192.168.112.136:7000
Adding replica 192.168.112.136:7004 to 192.168.112.138:7001
Adding replica 192.168.112.138:7003 to 192.168.112.136:7002
M: 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 192.168.112.136:7000
   slots:0-5460 (5461 slots) master
M: f2690645620ad4c4042536108e576158dec751b3 192.168.112.136:7002
   slots:10923-16383 (5461 slots) master
S: 022afc487ced1c543ee85c4f9ba591b377d5e9e1 192.168.112.136:7004
   replicates 0ff8984070960a56f204d992d176ca7275e06c1d
M: 0ff8984070960a56f204d992d176ca7275e06c1d 192.168.112.138:7001
   slots:5461-10922 (5462 slots) master
S: 578367da301f9d795854ce2ee3daf56d5971e7de 192.168.112.138:7003
   replicates f2690645620ad4c4042536108e576158dec751b3
S: 0e107e02f89ef282470174bfa6bcf6cdfebc8271 192.168.112.138:7005
   replicates 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c
Can I set the above configuration? (type 'yes' to accept): yes   //滿意就 yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join....
>>> Performing Cluster Check (using node 192.168.112.136:7000)
M: 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 192.168.112.136:7000
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: 578367da301f9d795854ce2ee3daf56d5971e7de 192.168.112.138:7003
   slots: (0 slots) slave
   replicates f2690645620ad4c4042536108e576158dec751b3
M: 0ff8984070960a56f204d992d176ca7275e06c1d 192.168.112.138:7001
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
S: 0e107e02f89ef282470174bfa6bcf6cdfebc8271 192.168.112.138:7005
   slots: (0 slots) slave
   replicates 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c
S: 022afc487ced1c543ee85c4f9ba591b377d5e9e1 192.168.112.136:7004
   slots: (0 slots) slave
   replicates 0ff8984070960a56f204d992d176ca7275e06c1d
M: f2690645620ad4c4042536108e576158dec751b3 192.168.112.136:7002
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.          //成功的標誌
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.                            //成功的標誌
[root@ying01 ~]# echo $?
0

12.3 、redis集羣操做

開始以集羣的方式登陸,建立不一樣的值,觀察存在哪一個服務器(端口)

[root@ying01 ~]# redis-cli -c -h 192.168.112.136 -p 7000     //-c 表示以集羣的方式登陸,不然就是單機登陸
192.168.112.136:7000> set key1 aaa
-> Redirected to slot [9189] located at 192.168.112.138:7001
OK
192.168.112.138:7001> set key2 bbb
-> Redirected to slot [4998] located at 192.168.112.136:7000
OK
192.168.112.136:7000> set key3 ccc
OK
192.168.112.136:7000> set key4 ddd
-> Redirected to slot [13120] located at 192.168.112.136:7002
OK
192.168.112.136:7002> set key5 eee
-> Redirected to slot [9057] located at 192.168.112.138:7001
OK
192.168.112.138:7001> get key3
-> Redirected to slot [935] located at 192.168.112.136:7000
"ccc"
192.168.112.136:7000> get key4
-> Redirected to slot [13120] located at 192.168.112.136:7002
"ddd"
192.168.112.136:7002>

檢測集羣狀態 redis-trib.rb IP:port

[root@ying01 ~]# redis-trib.rb check 192.168.112.136:7000   //能夠跟任何端口
>>> Performing Cluster Check (using node 192.168.112.136:7000)
M: 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 192.168.112.136:7000
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: 578367da301f9d795854ce2ee3daf56d5971e7de 192.168.112.138:7003
   slots: (0 slots) slave
   replicates f2690645620ad4c4042536108e576158dec751b3
M: 0ff8984070960a56f204d992d176ca7275e06c1d 192.168.112.138:7001
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
S: 0e107e02f89ef282470174bfa6bcf6cdfebc8271 192.168.112.138:7005
   slots: (0 slots) slave
   replicates 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c
S: 022afc487ced1c543ee85c4f9ba591b377d5e9e1 192.168.112.136:7004
   slots: (0 slots) slave
   replicates 0ff8984070960a56f204d992d176ca7275e06c1d
M: f2690645620ad4c4042536108e576158dec751b3 192.168.112.136:7002
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

以集羣的方式登陸到redis下,一些重用操做:

  • 列出節點 cluster nodes
192.168.112.136:7000> CLUSTER NODES
578367da301f9d795854ce2ee3daf56d5971e7de 192.168.112.138:7003@17003 slave f2690645620ad4c4042536108e576158dec751b3 0 1535304518521 5 connected
0ff8984070960a56f204d992d176ca7275e06c1d 192.168.112.138:7001@17001 master - 0 1535304516000 4 connected 5461-10922
25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 192.168.112.136:7000@17000 myself,master - 0 1535304516000 1 connected 0-5460
0e107e02f89ef282470174bfa6bcf6cdfebc8271 192.168.112.138:7005@17005 slave 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 0 1535304518000 6 connected
022afc487ced1c543ee85c4f9ba591b377d5e9e1 192.168.112.136:7004@17004 slave 0ff8984070960a56f204d992d176ca7275e06c1d 0 1535304517513 4 connected
f2690645620ad4c4042536108e576158dec751b3 192.168.112.136:7002@17002 master - 0 1535304519527 2 connected 10923-16383
  • 查看集羣的信息 cluster info
192.168.112.136:7000> CLUSTER INFO
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:1135
cluster_stats_messages_pong_sent:1094
cluster_stats_messages_sent:2229
cluster_stats_messages_ping_received:1089
cluster_stats_messages_pong_received:1135
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:2229
  • 添加節點 cluster meet ip port

在ying02機器上,新建一個7007的配置文件

[root@ying02 etc]# vim redis_7007.conf 

port 7007
bind 192.168.133.132
daemonize yes
pidfile /var/run/redis_7007.pid
dir /data/redis_data/7007
cluster-enabled yes
cluster-config-file nodes_7007.conf
cluster-node-timeout 10100
appendonly yes

建立目錄,並啓動

[root@ying02 etc]# mkdir /data/redis_data/7007
[root@ying02 etc]# redis-server /etc/redis_7007.conf
6060:C 27 Aug 01:37:20.129 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
6060:C 27 Aug 01:37:20.129 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=6060, just started
6060:C 27 Aug 01:37:20.129 # Configuration loaded
[root@ying02 etc]# ps aux |grep redis
root      2974  0.1  0.1 147352  2516 ?        Ssl  8月26   0:09 redis-server 127.0.0.1:6380
root      4536  0.0  0.1 147356  3184 ?        Ssl  00:22   0:04 redis-server 192.168.112.138:7001 [cluster]
root      4545  0.0  0.1 147356  3068 ?        Ssl  00:22   0:04 redis-server 192.168.112.138:7003 [cluster]
root      4553  0.0  0.1 147356  3064 ?        Ssl  00:23   0:04 redis-server 192.168.112.138:7005 [cluster]
root      6061  0.2  0.1 145308  2648 ?        Ssl  01:37   0:00 redis-server 192.168.112.138:7007 [cluster]
root      6071  0.0  0.0 112720   984 pts/0    S+   01:37   0:00 grep --color=auto redis

再回到ying01上,添加這個節點

192.168.112.136:7000> CLUSTER MEET 192.168.112.138 7007
OK
192.168.112.136:7000> CLUSTER NODES  //發現7007爲master
7bacdb18381ac0101abad973180a890cd2da2d39 192.168.112.138:7007@17007 master - 0 1535305180270 0 connected
578367da301f9d795854ce2ee3daf56d5971e7de 192.168.112.138:7003@17003 slave f2690645620ad4c4042536108e576158dec751b3 0 1535305182000 5 connected
0ff8984070960a56f204d992d176ca7275e06c1d 192.168.112.138:7001@17001 master - 0 1535305179263 4 connected 5461-10922
25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 192.168.112.136:7000@17000 myself,master - 0 1535305179000 1 connected 0-5460
0e107e02f89ef282470174bfa6bcf6cdfebc8271 192.168.112.138:7005@17005 slave 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 0 1535305183291 6 connected
022afc487ced1c543ee85c4f9ba591b377d5e9e1 192.168.112.136:7004@17004 slave 0ff8984070960a56f204d992d176ca7275e06c1d 0 1535305182285 4 connected
f2690645620ad4c4042536108e576158dec751b3 192.168.112.136:7002@17002 master - 0 1535305182000 2 connected 10923-16383
192.168.112.136:7000>

在ying01上新建7006配置文件

[root@ying01 etc]# vim redis_7006.conf

port 7006
bind 192.168.112.136
daemonize yes
pidfile /var/run/redis_7006.pid
dir /data/redis_data/7006
cluster-enabled yes
cluster-config-file nodes_7006.conf
cluster-node-timeout 10100
appendonly yes

建立相應的數據目錄,並開啓7006的redis服務

[root@ying01 etc]# mkdir /data/redis_data/7006
[root@ying01 etc]# redis-server /etc/redis_7006.conf
29220:C 27 Aug 01:52:30.488 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
29220:C 27 Aug 01:52:30.488 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=29220, just started
29220:C 27 Aug 01:52:30.488 # Configuration loaded

再次登陸到集羣下,增長7006的節點,此時7006也爲master

[root@ying01 etc]# redis-cli -c -h 192.168.112.136 -p 7000
192.168.112.136:7000> CLUSTER MEET 192.168.112.136 7006
OK
192.168.112.136:7000> CLUSTER NODES
7bacdb18381ac0101abad973180a890cd2da2d39 192.168.112.138:7007@17007 master - 0 1535306149035 0 connected
578367da301f9d795854ce2ee3daf56d5971e7de 192.168.112.138:7003@17003 slave f2690645620ad4c4042536108e576158dec751b3 0 1535306148026 5 connected
0ff8984070960a56f204d992d176ca7275e06c1d 192.168.112.138:7001@17001 master - 0 1535306147000 4 connected 5461-10922
25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 192.168.112.136:7000@17000 myself,master - 0 1535306142000 1 connected 0-5460
0e107e02f89ef282470174bfa6bcf6cdfebc8271 192.168.112.138:7005@17005 slave 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 0 1535306147000 6 connected
022afc487ced1c543ee85c4f9ba591b377d5e9e1 192.168.112.136:7004@17004 slave 0ff8984070960a56f204d992d176ca7275e06c1d 0 1535306146000 4 connected
288a9bcba1d561ae4bdb016794b46b098c52ebb5 192.168.112.136:7006@17006 master - 0 1535306147000 0 connected
f2690645620ad4c4042536108e576158dec751b3 192.168.112.136:7002@17002 master - 0 1535306147018 2 connected 10923-16383
192.168.112.136:7000>
  • 將當前節點設置爲指定節點的從: cluster replicate node_id
[root@ying01 etc]# redis-cli -c -h 192.168.112.136 -p 7006 //以7006端口登陸到集羣
192.168.112.136:7006> CLUSTER REPLICATE 7bacdb18381ac0101abad973180a890cd2da2d39  //把7006設置7007的從,此id是7007的
OK
192.168.112.136:7006> CLUSTER NODES
25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 192.168.112.136:7000@17000 master - 0 1535306375000 1 connected 0-5460
0e107e02f89ef282470174bfa6bcf6cdfebc8271 192.168.112.138:7005@17005 slave 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 0 1535306374000 1 connected
578367da301f9d795854ce2ee3daf56d5971e7de 192.168.112.138:7003@17003 slave f2690645620ad4c4042536108e576158dec751b3 0 1535306376198 2 connected
f2690645620ad4c4042536108e576158dec751b3 192.168.112.136:7002@17002 master - 0 1535306377505 2 connected 10923-16383
288a9bcba1d561ae4bdb016794b46b098c52ebb5 192.168.112.136:7006@17006 myself,slave 7bacdb18381ac0101abad973180a890cd2da2d39 0 1535306372000 7 connected
0ff8984070960a56f204d992d176ca7275e06c1d 192.168.112.138:7001@17001 master - 0 1535306376500 4 connected 5461-10922
7bacdb18381ac0101abad973180a890cd2da2d39 192.168.112.138:7007@17007 master - 0 1535306374484 0 connected
022afc487ced1c543ee85c4f9ba591b377d5e9e1 192.168.112.136:7004@17004 slave 0ff8984070960a56f204d992d176ca7275e06c1d 0 1535306375492 4 connected
192.168.112.136:7006>
  • 移除某個節點:cluster forget node_id

不能移走master,也不能移走當前節點的

192.168.112.136:7006> CLUSTER FORGET 288a9bcba1d561ae4bdb016794b46b098c52ebb5    //不可以在7006下移走7006
(error) ERR I tried hard but I can't forget myself...
192.168.112.136:7006> 
[root@ying01 etc]# redis-cli -c -h 192.168.112.136 -p 7000      //換一個節點登陸集羣
192.168.112.136:7000> CLUSTER FORGET 288a9bcba1d561ae4bdb016794b46b098c52ebb5
OK
192.168.112.136:7000> CLUSTER NODES            //此時就能移動7006
7bacdb18381ac0101abad973180a890cd2da2d39 192.168.112.138:7007@17007 master - 0 1535306852959 0 connected
578367da301f9d795854ce2ee3daf56d5971e7de 192.168.112.138:7003@17003 slave f2690645620ad4c4042536108e576158dec751b3 0 1535306851954 5 connected
0ff8984070960a56f204d992d176ca7275e06c1d 192.168.112.138:7001@17001 master - 0 1535306851000 4 connected 5461-10922
25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 192.168.112.136:7000@17000 myself,master - 0 1535306847000 1 connected 0-5460
0e107e02f89ef282470174bfa6bcf6cdfebc8271 192.168.112.138:7005@17005 slave 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 0 1535306850000 6 connected
022afc487ced1c543ee85c4f9ba591b377d5e9e1 192.168.112.136:7004@17004 slave 0ff8984070960a56f204d992d176ca7275e06c1d 0 1535306850000 4 connected
f2690645620ad4c4042536108e576158dec751b3 192.168.112.136:7002@17002 master - 0 1535306850947 2 connected 10923-16383
192.168.112.136:7000>
  • 保存配置文件: cluster saveconfig
192.168.112.136:7000> CLUSTER SAVECONFIG
OK
192.168.112.136:7000>

在ying02機器上,在端口下的nodes_700x的文件下,都保存了以前的設置

[root@ying02 etc]# vim /data/redis_data/7003/nodes_7003.conf 

022afc487ced1c543ee85c4f9ba591b377d5e9e1 192.168.112.136:7004@17004 slave 0ff8984070960a56f204d992d176ca7275e06c1d 0 1535306360718 4 connected
7bacdb18381ac0101abad973180a890cd2da2d39 192.168.112.138:7007@17007 master - 0 1535306359000 0 connected
0e107e02f89ef282470174bfa6bcf6cdfebc8271 192.168.112.138:7005@17005 slave 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 0 1535306359710 6 connected
578367da301f9d795854ce2ee3daf56d5971e7de 192.168.112.138:7003@17003 myself,slave f2690645620ad4c4042536108e576158dec751b3 0 1535306358000 5 connected
288a9bcba1d561ae4bdb016794b46b098c52ebb5 192.168.112.136:7006@17006 slave 7bacdb18381ac0101abad973180a890cd2da2d39 0 1535306361121 7 connected
f2690645620ad4c4042536108e576158dec751b3 192.168.112.136:7002@17002 master - 0 1535306361120 2 connected 10923-16383
25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 192.168.112.136:7000@17000 master - 0 1535306358100 1 connected 0-5460
0ff8984070960a56f204d992d176ca7275e06c1d 192.168.112.138:7001@17001 master - 0 1535306360000 4 connected 5461-10922
vars currentEpoch 7 lastVoteEpoch 0
相關文章
相關標籤/搜索