Redis學習記錄及Jedis代碼示例

文章目錄

Redis

# 一、從NoSQL說起

NoSQL是Not only SQL的縮寫,大意爲“不只是SQL”,說明這項技術是傳統關係型數據庫的補充而非替代。在整個NoSQL技術棧中MemCacheRedisMongoDB被稱爲NoSQL三劍客。那麼時代爲什麼需要NoSQL數據庫呢?我們來做個對比:

對比 關係型數據庫 NoSQL數據庫
數據存儲位置 硬盤 內存
數據結構 高度組織化結構化數據 沒有預定義的模式
數據操作方式 SQL 所有數據都是鍵值對,沒有聲明性查詢語言
事務控制 嚴格的基礎事務ACID原則 CAP定理

所以NoSQL數據庫的最大優勢體現爲:高性能、高可用性和可伸縮性。

二、Redis簡介

Redis英文官網介紹:

Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker. It supports data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs and geospatial indexes with radius queries. Redis has built-in replication, Lua scripting, LRU eviction, transactions and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster.

Redis中文官網介紹:

Redis 是一個開源(BSD許可)的,內存中的數據結構存儲系統,它可以用作數據庫、緩存和消息中間件。 它支持多種類型的數據結構,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 與範圍查詢, bitmaps, hyperloglogs 和 地理空間(geospatial) 索引半徑查詢。 Redis 內置了 複製(replication),LUA腳本(Lua scripting), LRU驅動事件(LRU eviction),事務(transactions) 和不同級別的 磁盤持久化(persistence), 並通過 Redis哨兵(Sentinel)和自動 分區(Cluster)提供高可用性(high availability)。

Redis命令參考文檔網址:http://redisdoc.com

三、Redis安裝

1. 下載並解壓安裝

  1. 下載redis-4.0.2.tar.gz/opt目錄下

  2. 解壓到當前目錄下

    tar -zxvf redis-4.0.2.tar.gz
    

2. 安裝C語言編譯環境

yum intall -y gcc-c++

3. 修改安裝位置

vim opt/src/Makefile
#修改第27行
PREFIX?=/user/local/redis

4. 編譯安裝

make #編譯
make install #安裝 建議先拍快照

5.啓動Redis服務器

①默認啓動

[root@localhost ~]# /usr/local/redis/bin/redis-server
7239:C 07 Oct 18:59:12.144 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
7239:C 07 Oct 18:59:12.144 # Redis version=4.0.2, bits=64, commit=00000000, modified=0, pid=7239, just started
7239:C 07 Oct 18:59:12.144 # Warning: no config file specified, using the default config. In order to specify a config file use /usr/local/redis/bin/redis-server /path/to/redis.conf
7239:M 07 Oct 18:59:12.145 * Increased maximum number of open files to 10032 (it was originally set to 1024).
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 4.0.2 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 7239
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

7239:M 07 Oct 18:59:12.148 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
7239:M 07 Oct 18:59:12.148 # Server initialized
7239:M 07 Oct 18:59:12.148 # 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.
7239:M 07 Oct 18:59:12.148 # 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.
7239:M 07 Oct 18:59:12.148 * Ready to accept connections

停止Redis服務器

/usr/local/redis/bin/redis-cli shutdown
7239:M 07 Oct 19:00:53.208 # User requested shutdown...
7239:M 07 Oct 19:00:53.208 * Saving the final RDB snapshot before exiting.
7239:M 07 Oct 19:00:53.214 * DB saved on disk
7239:M 07 Oct 19:00:53.214 # Redis is now ready to exit, bye bye...

②定製配置項啓動

[1]準備配置文件

cp /opt/redis-4.0.2/redis.conf /usr/local/redis/

[2]修改配置項

配置項名稱 作用 取值
daemonize 控制是否以守護進程形式運行Redis服務器 yes
logfile 指定日誌文件位置 “/usr/local/redis/redis.log”
dir Redis工作目錄 /usr/local/redis

注意:/var/logs目錄需要我們提前創建好

[3]讓Redis根據指定的配置文件啓動

格式

redis-server文件路徑 redis.conf文件路徑

舉例

/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf

6.客戶端登錄

/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379

127.0.0.1:6379> ping
PONG
127.0.0.1:6379> exit

關閉redis服務:/usr/local/bin/redis-cli -h IP地址 -p 端口號 shutdown

四、Redis五種常用數據結構

1.總體結構

KEY VALUE
string string
list
set
hash
zset

Redis中的數據,總體上是鍵值對,不同數據類型指的是鍵值對中值的類型。

2.string類型

Redis中最基本的類型,它是key對應的一個單一值。二進制安全,不必擔心由於編碼等問題導致二進制數據變化。所以redis的string可以包含任何數據,比如jpg圖片或者序列化的對象。Redis中一個字符串值的最大容量是512M。

3.list類型

Redis 列表是簡單的字符串列表,按照插入順序排序。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)。說明它的底層是基於鏈表實現的,所以它操作時頭尾效率高,中間效率低。

list

2.set類型

Redis的set是string類型的無序集合。它是基於哈希表實現的。

3.hash類型

本身就是一個鍵值對集合。可以當做Java中的Map<String,Object>對待。

4.zset類型

Redis zset 和 set 一樣也是string類型元素的集合,且不允許重複的成員。不同的是每個元素都會關聯一個double類型的分數。redis正是通過分數來爲集合中的成員進行從小到大的排序。zset的成員是唯一的,但分數(score)卻可以重複。

五、Redis命令行操作

1.基本操作

①切換數據庫

Redis默認有16個數據庫。
115 # Set the number of databases. The default database is DB 0, you can select
116 # a different one on a per-connection basis using SELECT <dbid> where
117 # dbid is a number between 0 and 'databases'-1
118 databases 16
使用select進行切換,數據庫索引從0開始
127.0.0.1:6379> select 2
OK
127.0.0.1:6379[2]> select 0
OK
127.0.0.1:6379> 

②查看數據庫長度

127.0.0.1:6379> dbsize
(integer) 3

2.KEY操作

●KEYS PATTERN
●TYPE KEY
	返回KEY對應的值的類型
●MOVE KEY DB
	把一組鍵值對數據移動到另一個數據庫中
●DEL KEY [KEY ...]
	根據KEY進行刪除,至少要指定一個KEY
●EXISTS KEY
	檢查指定的KEY是否存在。指定一個KEY時,存在返回1,不存在返回0。可以指定多個,返回存在的KEY的數量。
●RANDOMKEY
	在現有的KEY中隨機返回一個
●RENAME KEY NEWKEY
	重命名一個KEY,NEWKEY不管是否是已經存在的都會執行,如果NEWKEY已經存在則會被覆蓋。
●RENAMENX KEY NEWKEY
	只有在NEWKEY不存在時能夠執行成功,否則失敗
●TIME
	返回當前UNIX時間戳
●TTL KEY
	以秒爲單位查看KEY還能存在多長時間
●PTTL KEY
	以毫秒爲單位查看KEY還能存在多長時間
●EXPIRE KEY SECONDS
	給一個KEY設置在SECONDS秒後過期,過期會被Redis移除。
●EXPIREAT KEY TIMESTAMP
	設置一個KEY在TIMESTAMP指定的時間過期
●PEXPIRE KEY MILLISECONDS
	以毫秒爲單位指定過期時間
●PEXPIREAT KEY MILLISECONDS-TIMESTAMP
	以毫秒爲單位指定過期的時間戳
●PERSIST KEY
	移除過期時間,變成永久key

2.string操作

●SET KEY VALUE [EX SECONDS] [PX MILLISECONDS] [NX|XX]
	給KEY設置一個string類型的值。
	EX參數用於設置存活的秒數。
	PX參數用於設置存活的毫秒數。
	NX參數表示當前命令中指定的KEY不存在才行。
	XX參數表示當前命令中指定的KEY存在才行。
●GET KEY
	根據key得到值,只能用於string類型。
●APPEND KEY VALUE
	把指定的value追加到KEY對應的原來的值後面,返回值是追加後字符串長度
●STRLEN KEY
	直接返回字符串長度
●INCR KEY
	自增1
●DECR KEY
	自減1
●INCRBY KEY INCREMENT
	原值+INCREMENT
●DECRBY KEY DECREMENT
	原值-DECREMENT
●GETRANGE KEY START END
	從字符串中取指定的一段
●SETRANGE KEY OFFSET VALUE
	從offset開始使用VALUE進行替換
●SETEX KEY SECONDS VALUE
	設置KEY,VALUE時指定存在秒數
●SETNX KEY VALUE
	新建字符串類型的鍵值對
●MSET KEY VALUE [KEY VALUE ...]
	一次性設置一組多個鍵值對
●MGET KEY [KEY ...]
	一次性指定多個KEY,返回它們對應的值,沒有值的KEY返回值是(nil)
●MSETNX KEY VALUE [KEY VALUE ...]
	一次性新建多個值
●GETSET KEY VALUE
	設置新值,同時能夠將舊值返回

3.list操作

●LPUSH key value [value ...]
●RPUSH key value [value ...]
●LRANGE key start stop
	根據list集合的索引打印元素數據
	正着數:0,1,2,3,...
	倒着數:-1,-2,-3,...
●LLEN key
●LPOP key
	從左邊彈出一個元素。
	彈出=返回+刪除。
●RPOP key
	從右邊彈出一個元素。
●RPOPLPUSH source destination
	從source中RPOP一個元素,LPUSH到destination中
●LINDEX key index
	根據索引從集合中取值
●LINSERT key BEFORE|AFTER pivot value
	在pivot指定的值前面或後面插入value
●LPUSHX key value
	只能針對存在的list執行LPUSH
●LREM key count value
	根據count指定的數量從key對應的list中刪除value
●LSET key index value
	把指定索引位置的元素替換爲另一個值
●LTRIM key start stop
	僅保留指定區間的數據,兩邊的數據被刪除

4.set操作

●SADD key member [member ...]
●SMEMBERS key
●SCARD key
	返回集合中元素的數量
●SISMEMBER key member
	檢查當前指定member是否是集合中的元素
●SREM key member [member ...]
	從集合中刪除元素
●SINTER key [key ...]
	將指定的集合進行“交集”操作
	集合A:a,b,c
	集合B:b,c,d
	交集:b,c
●SINTERSTORE destination key [key ...]
	取交集後存入destination
●SDIFF key [key ...]
	將指定的集合執行“差集”操作
	集合A:a,b,c
	集合B:b,c,d
	A對B執行diff:a
	相當於:A-交集部分
●SDIFFSTORE destination key [key ...]
●SUNION key [key ...]
	將指定的集合執行“並集”操作
	集合A:a,b,c
	集合B:b,c,d
	並集:a,b,c,d
●SUNIONSTORE destination key [key ...]
●SMOVE source destination member
	把member從source移動到destination
●SPOP key [count]
	從集合中隨機彈出count個數量的元素,count不指定就彈出1個
●SRANDMEMBER key [count]
	從集合中隨機返回count個數量的元素,count不指定就返回1個
●SSCAN key cursor [MATCH pattern] [COUNT count]
	基於遊標的遍歷

5.hash操作

●HSET key field value
●HGETALL key
●HGET key field
●HLEN key
●HKEYS key
●HVALS key
●HEXISTS key field
●HDEL key field [field ...]
●HINCRBY key field increment
●HMGET key field [field ...]
●HMSET key field value [field value ...]
●HSETNX key field value
●HSCAN key cursor [MATCH pattern] [COUNT count]

6.zset操作

●ZADD key [NX|XX] [CH] [INCR] score member [score member ...]
●ZRANGE key start stop [WITHSCORES]
●ZCARD key
●ZCOUNT key min max
	根據分數在min,max之間查找元素
●ZSCORE key member
●ZINCRBY key increment member
●ZLEXCOUNT key min max
●ZRANGEBYLEX key min max [LIMIT offset count]
	按照字母順序在區間內返回member
	min和max使用“[a”表示閉區間,使用“(a”表示開區間
	-表示負無窮
	+表示正無窮
●ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
	在分數的指定區間內返回數據
●ZRANK key member
	先對分數進行升序排序,返回member的排名
●ZREM key member [member ...]
●ZREMRANGEBYLEX key min max
●ZREMRANGEBYRANK key start stop
●ZREMRANGEBYSCORE key min max
●ZREVRANGE key start stop [WITHSCORES]
●ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
●ZREVRANK key member
●ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
●ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
	把指定集合的member取交集,分數會相加
●ZSCAN key cursor [MATCH pattern] [COUNT count]

六、Redis持久化機制

官網描述

Redis工作時數據都存儲在內存中,萬一服務器斷電,則所有數據都會丟失。針對這種情況,Redis採用持久化機制來增強數據安全性。

1.RDB

①機制描述

每隔一定的時間把內存中的數據作爲一個快照保存到硬盤上的文件中。Redis默認開啓RDB機制。

②觸發時機

[1]基於默認配置

save 900 1
save 300 10
save 60 10000

含義

配置 含義
save 900 1 900秒內至少有一次修改則觸發保存操作
save 300 10 300秒內至少有10次修改則觸發保存操作
save 60 10000 60秒內至少有1萬次修改則觸發保存操作

[2]使用保存命令

save或bgsave

[3]使用flushall命令

這個命令也會產生dump.rdb文件,但裏面是空的,沒有意義,相當於刪除所有數據。

[4]服務器關閉

如果執行SHUTDOWN命令讓Redis正常退出,那麼此前Redis就會執行一次持久化保存。

③相關配置

配置項 取值 作用
save “” 禁用RDB機制
dbfilename 文件名,例如:dump.rdb 設置RDB機制下,數據存儲文件的文件名
dir Redis工作目錄路徑 指定存放持久化文件的目錄的路徑。注意:這裏指定的必須是目錄不能是文件名

④思考

RDB機制能夠保證數據的絕對安全嗎?

2.AOF

①機制描述

根據配置文件中指定的策略,把生成數據的命令保存到硬盤上的文件中。一個AOF文件的內容可以參照下面的例子:

*2
$6
SELECT
$1
0
*3
$3
set
$3
num
$2
10
*2
$4
incr
$3
num
*2
$4
incr
$3
num
*2
$4
incr
$3
num

生成上面文件內容的Redis命令是:

set num 10
incr num
incr num
incr num

②AOF基本配置

配置項 取值 作用
appendonly yes 啓用AOF持久化機制
no 禁用AOF持久化機制[默認值]
appendfilename “文件名” AOF持久化文件名
dir Redis工作目錄路徑 指定存放持久化文件的目錄的路徑。注意:這裏指定的必須是目錄不能是文件名
appendfsync always 每一次數據修改後都將執行文件寫入操作,緩慢但是最安全。
everysec 每秒執行一次寫入操作。折中。
no 由操作系統在適當的時候執行寫入操作,最快。

③AOF重寫

對比下面兩組命令:

AOF重寫前 AOF重寫後
set count 1
incr count
incr count
incr count
set count 4

兩組命令執行後對於count來說最終的值是一致的,但是進行AOF重寫後省略了中間過程,可以讓AOF文件體積更小。而Redis會根據AOF文件的體積來決定是否進行AOF重寫。參考的配置項如下:

配置項 含義
auto-aof-rewrite-percentage 100 文件體積增大100%時執行AOF重寫
auto-aof-rewrite-min-size 64mb 文件體積增長到64mb時執行AOF重寫

實際工作中不要進行頻繁的AOF重寫,因爲CPU資源和硬盤資源二者之間肯定是CPU資源更加寶貴,所以不應該過多耗費CPU性能去節省硬盤空間。

3.持久化文件損壞修復

Redis服務器啓動時如果讀取了損壞的持久化文件會導致啓動失敗,此時爲了讓Redis服務器能夠正常啓動,需要對損壞的持久化文件進行修復。這裏以AOF文件爲例介紹修復操作的步驟。

  • 第一步:備份要修復的appendonly.aof文件

  • 第二步:執行修復程序

    /usr/local/redis/bin/redis-check-aof --fix /usr/local/redis/appendonly.aof

  • 第三步:重啓Redis

注意:所謂修復持久化文件僅僅是把損壞的部分去掉,而沒法把受損的數據找回。

4.擴展閱讀:兩種持久化機制的取捨

①RDB

[1]優勢

適合大規模的數據恢復,速度較快

[2]劣勢

會丟失最後一次快照後的所有修改,不能絕對保證數據的高度一致性和完整性。Fork的時候,內存中的數據被克隆了一份,大致2倍的膨脹性需要考慮,但上述成立有條件,Linux也有優化手段

②AOF

[1]優勢

選擇appendfsync always方式運行時理論上能夠做到數據完整一致,但此時性能又不好。文件內容具備一定可讀性,能夠用來分析Redis工作情況。

[2]劣勢

持久化相同的數據,文件體積比RDB大,恢復速度比RDB慢。效率在同步寫入時低於RDB,不同步寫入時與RDB相同。

③RDB和AOF並存

Redis重啓的時候會優先載入AOF文件來恢復原始的數據,因爲在通常情況下AOF文件保存的數據集要比RDB文件保存的數據集要完整

RDB的數據不實時,同時使用兩者時服務器重啓也只會找AOF文件。那要不要只使用AOF呢?作者建議不要,因爲RDB更適合用於備份數據庫(AOF在不斷變化不好備份)、快速重啓,而且不會有AOF可能潛在的bug,留着作爲一個萬一的手段。

④使用建議

如果Redis僅僅作爲緩存可以不使用任何持久化方式。

其他應用方式綜合考慮性能和完整性、一致性要求。

RDB文件只用作後備用途,建議只在Slave上持久化RDB文件,而且只要15分鐘備份一次就夠了,只保留save 900 1這條規則。如果Enalbe AOF,好處是在最惡劣情況下也只會丟失不超過兩秒數據,啓動腳本較簡單隻load自己的AOF文件就可以了。代價一是帶來了持續的IO,二是AOF rewrite的最後將rewrite過程中產生的新數據寫到新文件造成的阻塞幾乎是不可避免的。只要硬盤許可,應該儘量減少AOF rewrite的頻率,AOF重寫的基礎大小默認值64M太小了,可以設到5G以上。默認超過原大小100%大小時重寫可以改到適當的數值。如果不開啓AOF,僅靠Master-Slave Replication 實現高可用性能也不錯。能省掉一大筆IO也減少了rewrite時帶來的系統波動。代價是如果Master/Slave同時倒掉,會丟失十幾分鐘的數據,啓動腳本也要比較兩個Master/Slave中的RDB文件,載入較新的那個。新浪微博就選用了這種架構。

七、Redis事務控制

1.Redis事務控制的相關命令

命令名 作用
MULTI 表示開始收集命令,後面所有命令都不是馬上執行,而是加入到一個隊列中。
EXEC 執行MULTI後面命令隊列中的所有命令。
DISCARD 放棄執行隊列中的命令。
WATCH “觀察“、”監控“一個KEY,在當前隊列外的其他命令操作這個KEY時,放棄執行自己隊列的命令
UNWATCH 放棄監控一個KEY

2.命令隊列執行失敗的兩種情況

①加入隊列時失敗

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set age 20
QUEUED
127.0.0.1:6379> incr age
QUEUED
127.0.0.1:6379> incr age www
(error) ERR wrong number of arguments for 'incr' command
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.

遇到了入隊時即可檢測到的錯誤,整個隊列都不會執行。

②執行隊列時失敗

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set age 30
QUEUED
127.0.0.1:6379> incrby age 5
QUEUED
127.0.0.1:6379> incrby age 5
QUEUED
127.0.0.1:6379> incrby age ww
QUEUED
127.0.0.1:6379> incrby age 5
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) (integer) 35
3) (integer) 40
4) (error) ERR value is not an integer or out of range
5) (integer) 45
127.0.0.1:6379> get age
"45"

錯誤在入隊時檢測不出來,整個隊列執行時有錯的命令執行失敗,但是其他命令並沒有回滾。

③Redis爲什麼不支持回滾

官方解釋如下:

如果你有使用關係式數據庫的經驗, 那麼 “Redis 在事務失敗時不進行回滾,而是繼續執行餘下的命令”這種做法可能會讓你覺得有點奇怪。以下是這種做法的優點:
1.Redis 命令只會因爲錯誤的語法而失敗(並且這些問題不能在入隊時發現),或是命令用在了錯誤類型的鍵上面:這也就是說,從實用性的角度來說,失敗的命令是由編程錯誤造成的,而這些錯誤應該在開發的過程中被發現,而不應該出現在生產環境中。
2.因爲不需要對回滾進行支持,所以 Redis 的內部可以保持簡單且快速。
有種觀點認爲 Redis 處理事務的做法會產生 bug , 然而需要注意的是, 在通常情況下, 回滾並不能解決編程錯誤帶來的問題。 舉個例子, 如果你本來想通過 INCR 命令將鍵的值加上 1 , 卻不小心加上了 2 , 又或者對錯誤類型的鍵執行了 INCR , 回滾是沒有辦法處理這些情況的。

3.悲觀鎖和樂觀鎖

在使用WATCH命令監控一個KEY後,當前隊列中的命令會由於外部命令的執行而放棄,這是樂觀鎖的體現。

  • 悲觀鎖

    認爲當前環境非常容易發生碰撞,所以執行操作前需要把數據鎖定,操作完成後釋放鎖,其他操作纔可以繼續操作。

  • 樂觀鎖

    認爲當前環境不容易發生碰撞,所以執行操作前不鎖定數據,萬一碰撞真的發生了,那麼放棄自己的操作。

八、Redis主從複製機制

在這裏插入圖片描述

1.讀寫分離的好處:

  • 性能優化:主服務器專注於寫操作,可以用更適合寫入數據的模式工作;同樣,從服務器專注於讀操作,可以用更適合讀取數據的模式工作。
  • 強化數據安全,避免單點故障:由於數據同步機制的存在,各個服務器之間數據保持一致,所以其中某個服務器宕機不會導致數據丟失或無法訪問。從這個角度說參與主從複製的Redis服務器構成了一個集羣

2.搭建步驟

①思路

Redis集羣在運行時使用的是同一個可執行文件,只是對應的配置文件不同。

在這裏插入圖片描述

每個配置文件中相同的參數是:

daemonize yes
dir /usr/local/cluster-redis

不同的參數有:

配置項名稱 作用 取值
port Redis服務器啓動後監聽的端口號 6000
7000
8000
dbfilename RDB文件存儲位置 dump6000.rdb
dump7000.rdb
dump8000.rdb
logfile 日誌文件位置 /usr/local/cluster-redis/logs/redis6000.log
/usr/local/cluster-redis/logs/redis7000.log
/usr/local/cluster-redis/logs/redis8000.log
pidfile pid文件位置 /var/run/redis6000.pid
/var/run/redis7000.pid
/var/run/redis8000.pid

②步驟

  • 第一步:創建/usr/local/cluster-redis目錄
  • 第二步:把原始未經修改的redis.conf複製到/usr/local/cluster-redis目錄
  • 第三步:把/usr/local/cluster-redis目錄下的redis.conf複製爲redis6000.conf
  • 第四步:按照既定計劃修改redis6000.conf中的相關配置項
    • daemonize yes
    • dir
    • port
    • dbfilename
    • logfile
    • pidfile
  • 第五步:複製redis6000.conf爲redis7000.conf
  • 第六步:修改redis7000.conf中的相關配置項
    • port
    • dbfilename
    • logfile
    • pidfile
  • 第七步:複製redis6000.conf爲redis8000.conf
  • 第八步:修改redis8000.conf中的相關配置項
    • port
    • dbfilename
    • logfile
    • pidfile

③啓動Redis主從複製集羣

/usr/local/redis/bin/redis-server /usr/local/cluster-redis/redis6000.conf
/usr/local/redis/bin/redis-server /usr/local/cluster-redis/redis7000.conf
/usr/local/redis/bin/redis-server /usr/local/cluster-redis/redis8000.conf

使用redis-cli停止指定服務器的命令格式如下:
/usr/local/bin/redis-cli -h IP地址 -p 端口號 shutdown

3.主從關係

①查看主從關係

127.0.0.1:6000> info replication
# Replication
role:master
connected_slaves:0

剛剛啓動的集羣服務器中每一個節點服務器都認爲自己是主服務器。需要建立主從關係。

②設定主從關係

在從機上指定主機位置即可

SLAVEOF 127.0.0.1 6000

③取消主從關係

在從機上執行命令

SLAVEOF NO ONE

4.初步測試

  • 測試1:在主機寫入數據,在從機查看

  • 測試2:在從機寫入數據報錯。配置文件中的依據是:slave-read-only yes

  • 測試3:主機執行SHUTDOWN看從機狀態

    從機依舊是slave狀態,顯示主機下線,可以查詢數據

  • 測試4:主機恢復啓動,看從機狀態

    顯示主機上線,可以查詢數據

  • 測試5:從機SHUTDOWN,此時主機寫入數據,從機恢復啓動查看狀態。重新設定主從關係後看新寫入的數據是否同步。

    從機重新啓動又變成master狀態,需要重新建立主從關係纔可以同步主機新寫的數據。

5.哨兵模式

①作用

通過哨兵服務器監控master/slave實現主從複製集羣的自動管理。

在這裏插入圖片描述

②相關概念

[1]主觀下線

1臺哨兵檢測到某節點服務器下線。

[2]客觀下線

認爲某個節點服務器下線的哨兵服務器達到指定數量。這個數量後面在哨兵的啓動配置文件中指定。

③配置方式

簡單起見我們只配置一臺哨兵。我們所需要做的就是創建一個哨兵服務器運行所需要的配置文件。

新建並編輯sentinel的配置文件

vim /usr/local/cluster-redis/sentinel.conf

#配置文件加入:
sentinel monitor mymaster 127.0.0.1 6000 1
格式 sentinel monitor 爲主機命名 主機IP 主機端口號 將主機判定爲下線時需要Sentinel同意的數量
例子 sentinel monitor mymaster 127.0.0.1 6000 1

④啓動哨兵

根據新建的sentinel的配置文件啓動redis

/usr/local/redis/bin/redis-server /usr/local/cluster-redis/sentinel.conf --sentinel

下面是哨兵模式的日誌打印情況

# 啓動哨兵模式,根據配置指定主服務器,並自動建立主從關係
+monitor master mymaster 127.0.0.1 6000 quorum 1
8516:X 17 Oct 20:45:45.960 * 
+slave slave 127.0.0.1:8000 127.0.0.1 8000 @ mymaster 127.0.0.1 6000
8516:X 17 Oct 20:45:45.961 * 
+slave slave 127.0.0.1:7000 127.0.0.1 7000 @ mymaster 127.0.0.1 6000

# shutdown7000從服務器 從服務器[主觀下線]
+sdown slave 127.0.0.1:7000 127.0.0.1 7000 @ mymaster 127.0.0.1 6000

# 7000從服務器重新啓動
+reboot slave 127.0.0.1:7000 127.0.0.1 7000 @ mymaster 127.0.0.1 6000
-sdown slave 127.0.0.1:7000 127.0.0.1 7000 @ mymaster 127.0.0.1 6000
## 從服務器會重新設置主從關係到主服務器
+convert-to-slave slave 127.0.0.1:7000 127.0.0.1 7000 @ mymaster 127.0.0.1 6000

# shotdown6000主服務器------------------
## 主服務器[主觀下線]
+sdown master mymaster 127.0.0.1 6000
## 主服務器[客觀下線]
+odown master mymaster 127.0.0.1 6000 #quorum 1/1
## 選舉leader
+vote-for-leader 55717050322c1b4fc6888971e37d3dc2b6131cd4 1
## 把其中一個從服務器設置爲主服務器,並將其他作爲從服務器
+failover-state-send-slaveof-noone slave 127.0.0.1:8000 127.0.0.1 8000 @ mymaster 127.0.0.1 6000
+switch-master mymaster 127.0.0.1 6000 127.0.0.1 8000
+slave slave 127.0.0.1:7000 127.0.0.1 7000 @ mymaster 127.0.0.1 8000
+slave slave 127.0.0.1:6000 127.0.0.1 6000 @ mymaster 127.0.0.1 8000

# 重新啓動原來的主服務器6000 
-sdown slave 127.0.0.1:6000 127.0.0.1 6000 @ mymaster 127.0.0.1 8000
+convert-to-slave slave 127.0.0.1:6000 127.0.0.1 6000 @ mymaster 127.0.0.1 8000

九、發佈訂閱

1.訂閱一個頻道

127.0.0.1:6379> SUBSCRIBE cctv1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "cctv1"
3) (integer) 1

2.在一個頻道上發佈信息

127.0.0.1:6379> PUBLISH cctv1 weather
(integer) 1
127.0.0.1:6379> SUBSCRIBE cctv1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "cctv1"
3) (integer) 1
1) "message"
2) "cctv1"
3) "weather"

十、Jedis

示例代碼:github

1.對比

MySQL Redis
連接 Connection Jedis
連接池 C3P0等等 JedisPool
操作完成 關閉連接 關閉連接

2.Redis準備

①理解Redis配置文件中bind配置項含義

bind後面跟的ip地址是客戶端訪問Redis時使用的IP地址。看下面例子:

bind值 訪問方式
127.0.0.1 ./redis-cli -h 127.0.0.1
192.168.200.100 ./redis-cli -h 192.168.200.100

②查看Linux系統本機IP

遠程客戶端訪問Linux服務器時不能使用127.0.0.1,要使用網絡上的實際IP。可以用ifconfig命令查看。

③將Redis配置文件中的bind配置項設置爲本機IP。

bind [你的實際IP]
bind 192.168.252.128

3.Jedis

	<dependency>
		<groupId>redis.clients</groupId>
		<artifactId>jedis</artifactId>
		<version>2.9.0</version>
	</dependency>
//指定Redis服務器的IP地址和端口號
Jedis jedis = new Jedis("192.168.252.128", 6379);

//執行ping命令
String ping = jedis.ping();
System.out.println(ping);   // PONG

//關閉連接
jedis.close();

4.JedisPool

//聲明Linux服務器IP地址
String host = "192.168.252.128";
//聲明Redis端口號
int port = Protocol.DEFAULT_PORT;

//創建連接池對象
JedisPool jedisPool = new JedisPool(host, port);
//獲取Jedis對象連接Redis
Jedis jedis = jedisPool.getResource();

//執行具體操作
String ping = jedis.ping();
System.out.println(ping);  // PONG

//關閉連接
jedisPool.close();
  | ./redis-cli -h 127.0.0.1       |

| 192.168.200.100 | ./redis-cli -h 192.168.200.100 |

②查看Linux系統本機IP

遠程客戶端訪問Linux服務器時不能使用127.0.0.1,要使用網絡上的實際IP。可以用ifconfig命令查看。

③將Redis配置文件中的bind配置項設置爲本機IP。

bind [你的實際IP]
bind 192.168.252.128

3.Jedis

	<dependency>
		<groupId>redis.clients</groupId>
		<artifactId>jedis</artifactId>
		<version>2.9.0</version>
	</dependency>
//指定Redis服務器的IP地址和端口號
Jedis jedis = new Jedis("192.168.252.128", 6379);

//執行ping命令
String ping = jedis.ping();
System.out.println(ping);   // PONG

//關閉連接
jedis.close();

4.JedisPool

//聲明Linux服務器IP地址
String host = "192.168.252.128";
//聲明Redis端口號
int port = Protocol.DEFAULT_PORT;

//創建連接池對象
JedisPool jedisPool = new JedisPool(host, port);
//獲取Jedis對象連接Redis
Jedis jedis = jedisPool.getResource();

//執行具體操作
String ping = jedis.ping();
System.out.println(ping);  // PONG

//關閉連接
jedisPool.close();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章