Redis?簡介
Remote Dictionary Server(Redis)是一個開源的使用 ANSI C 語言編寫、支持網(wǎng)絡、可基于內存亦可持久化的日志型仓技、Key-Value 數(shù)據(jù)庫,并提供多種語言的 API。
它通常被稱為數(shù)據(jù)結構服務器足画,因為值(value)可以是 字符串(String), 哈希(Map),列表(list), 集合(sets) 和 有序集合(sorted sets)等類型。
Redis 的特點
1. 支持多種數(shù)據(jù)結構佃牛,如 string(字符串)淹辞、 list(雙向鏈表)、dict(hash 表)俘侠、set(集合)象缀、zset(排序 set)、hyperloglog(基數(shù)估算)
2. 支持持久化操作爷速,可以進行 aof 及 rdb 數(shù)據(jù)持久化到磁盤央星,從而進行數(shù)據(jù)備份或數(shù)據(jù)恢復等操作,較好的防止數(shù)據(jù)丟失的手段惫东。
3. 支持通過 Replication 進行數(shù)據(jù)復制莉给,通過 master-slave 機制,可以實時進行數(shù)據(jù)的同步復制凿蒜,支持多級復制和增量復制禁谦,master-slave 機制是 Redis 進行 HA 的重要手段。
4. 單進程請求废封,所有命令串行執(zhí)行州泊,并發(fā)情況下不需要考慮數(shù)據(jù)一致性問題。
安裝 Redis 單機版
第一步 需要在 linux 系統(tǒng)中安裝 gcc
命令:yum install -y gcc-c++
第二步 需要將下載好的 redis 壓縮包添加到 linux 服務器中版本:redis-3.0.0.tar.gz
redis 的版本:副版本號奇數(shù)版本號是測試版漂洋,不建議在生產(chǎn)環(huán)境中使用遥皂。偶數(shù)版本時穩(wěn)定版建議在生產(chǎn)環(huán)境中使用。3.0 版本更新比較大刽漂。集成了集群技術
第三步 解壓壓縮包
命令:tar -zxvf redis......
第四步 編譯 redis
命令:進入 redis 的解壓完畢的根目錄下 執(zhí)行命令:make
第五步 安裝 redis
命 令 : 進 入 redis 的 解 壓 完 畢 的 根 目 錄 下 演训, 執(zhí) 行 命 令 : make install ?PREFIX=/usr/local/redis
第六步:啟動 redis
1,前端啟動
在 bin 目錄下執(zhí)行命令: ./redis-server (ctrl+c)退出 redis
2.后端啟動
(1)先將 redis 解壓目錄下的 redis.conf 文件拷貝到 安裝好的 redis 的 bin 目錄下
命令:cp redis.conf /usr/local/redis/bin
(2)修改拷貝過來的 redis.conf 配置文件
命令:vim redis.conf
將 daemonize no 改為 yes
(3)啟動 redis
在 bin 目錄下執(zhí)行命令:./redis-server redis.conf
(4)查看 redis 啟動是否成功
輸入命令:ps aux|grep redis
(5) 關閉 redis 的命令
./redis-cli shutdown
第七步:測試 redis
在 bin 目錄下啟動 redis 自帶的客戶端 ./redis-cli
使用平命令:返回pong表示服務正常運行
ping--->pong
Redis 數(shù)據(jù)類型
String(字符串)
Redis 字符串是字節(jié)序列贝咙。Redis 字符串是二進制安全的样悟,這意味著他們有一個已知的長度沒有任何特殊字符終止,所以你可以存儲任何東西,512 兆為上限
示例:
redis 127.0.0.1:6379> SET name kevin
OK
redis 127.0.0.1:6379> GET name
"kevin"
incr 讓當前鍵值以 1 的數(shù)量遞增窟她,并返回遞增后的值
incrby 可以指定參數(shù)一次增加的數(shù)值陈症,并返回遞增后的值
decr 讓當前鍵值以 1 的數(shù)量遞減 并返回遞減后的值
decrby 可以指定參數(shù)一次遞減的數(shù)值,并返回遞減后的值
incrbyfloat 可以遞增一個雙精度浮點數(shù)
append 作用是向鍵值的末尾追加 value震糖。如果鍵不存在則將該鍵的值設置為 value录肯。返回值是追加后字符串的總長度。
mget/mset 作用與 get/set 相似吊说,不過 mget/mset 可以同時獲得/設置多個鍵的鍵值
del 根據(jù) key 來刪除 value
flushdb 清除當前庫的所有數(shù)據(jù)
Hash(hash 表)
Redis 的哈希是鍵值對的集合论咏。 Redis 的哈希值是字符串字段和字符串值之間的映射,因此它們被用來表示對象
示例:
redis 127.0.0.1:6379> HSET key field value
OK
redis 127.0.0.1:6379> HGET key field
value
hset 存儲一個哈希鍵值對的集合????????hset key field value
hget 獲取一個哈希鍵的值????????????????????hget key field
hmset 存儲一個或多個哈希是鍵值對的集合????????????hmset key field1 value1 ......fieldN keyN
hmget 獲取多個指定的鍵的值????????????????????hmget key field1 ... fieldN
hexists 判斷哈希表中的字段名是否存在 如果存在返回 1 否則返回 0 ?????????????hexists key field
hdel 刪除一個或多個字段????????????hdel key field
hgetall 獲取一個哈希是鍵值對的集合????????????hgetall key
hvals 只返回字段值????????????hvals key
hkeys 只返回字段名????????????hkeys key
hlen 返回 key 的 hash 的元素個數(shù)????????????hlen key
List(鏈表)
Redis 的鏈表是簡單的字符串列表颁井,排序插入順序厅贪。您可以添加元素到 Redis 的列表的頭部或尾部
示例:
redis 127.0.0.1:6379> lpush tutoriallist redis
(integer) 1
redis 127.0.0.1:6379> lpush tutoriallist mongodb
(integer) 2
redis 127.0.0.1:6379> lpush tutoriallist rabitmq
(integer) 3
redis 127.0.0.1:6379> lrange tutoriallist 0 10
1) "rabitmq"
2) "mongodb"
3) "redis
lpush key value 向鏈表左側添加
rpush key value 向鏈表右側添加
lpop key 從左邊移出一個元素
rpop key 從右邊移出一個元素
llen key 返回鏈表中元素的個數(shù) 相當于關系型數(shù)據(jù)庫中 select count(*)
lrange key start end lrange 命令將返回索引從 start 到 stop 之間的所有元素。Redis 的列表起始索引為 0蚤蔓。
lrange 也支持負索引 lrange nn -2 -1 如 -1 表示最右邊第一個元素 -2 表示最右邊第二個元素卦溢,依次類推。
lindex key indexnumber 如果要將列表類型當做數(shù)組來用秀又,lindex 命令是必不可少的单寂。
lindex 命令用來返回指定索引的元素,索引從 0 開始如果是負數(shù)表示從右邊開始計算的索引吐辙,最右邊元素的索引是-1宣决。
Lset key indexnumber value 是另一個通過索引操作列表的命令,它會將索引為 index的元素賦值為 value昏苏。
Set(集合)
Redis 的集合是字符串的無序集合尊沸。
示例:
redis 127.0.0.1:6379> sadd tutoriallist redis
(integer) 1
redis 127.0.0.1:6379> sadd tutoriallist mongodb
(integer) 1
redis 127.0.0.1:6379> sadd tutoriallist rabitmq
(integer) 1
redis 127.0.0.1:6379> sadd tutoriallist rabitmq
(integer) 0
redis 127.0.0.1:6379> smembers tutoriallist
1) "rabitmq"
2) "mongodb"
3) "redis"
sadd key value 添加一個 string 元素到,key 對應的 set 集合中,成功返回 1,如果元素已經(jīng)在集合中返回 0
scard key 返回 set 的元素個數(shù)贤惯,如果 set 是空或者 key 不存在返回 0
smembers key 返回 key 對應 set 的所有元素洼专,結果是無序的
sismember key value 判斷 value 是否在 set 中,存在返回 1孵构,0 表示不存在或者 key 不存在
srem key value 從 key 對應 set 中移除給定元素屁商,成功返回 1,如果 value 在集合中不存在或者 key 不存在返回 0
SortedSet(有序集合)zset
Redis 的有序集合類似于 Redis 的集合颈墅,字符串不重復的集合蜡镶。
示例:
redis 127.0.0.1:6379> zadd tutoriallist 0 redis
(integer) 1
redis 127.0.0.1:6379> zadd tutoriallist 0 mongodb
(integer) 1
redis 127.0.0.1:6379> zadd tutoriallist 0 rabitmq
(integer) 1
redis 127.0.0.1:6379> zadd tutoriallist 0 rabitmq
(integer) 0
redis 127.0.0.1:6379> ZRANGEBYSCORE tutoriallist 0 1000
1) "redis"
2) "mongodb"
3) "rabitmq"
zadd key score value 將一個或多個 value 及其 socre 加入到 set 中
zrange key start end 0 和-1 表示從索引為 0 的元素到最后一個元素(同 LRANGE 命令相似)
zrange key 0 -1 withscores 也可以連同 score 一塊輸出,使用 WITHSCORES 參數(shù)
zremrangebyscore key start end 可用于范圍刪除操作
Redis 中的其他命令
ping 測試 redis 是否鏈接 如果已鏈接返回 PONG
echo value 測試 redis 是否鏈接 如果已鏈接返回 echo 命令后給定的值
keys * 返回所有的 key 可以加*通配
exists key 判斷 string 類型一個 key 是否存在 如果存在返回 1 否則返回 0
expire key time(s) 設置一個 key 的過期時間 單位秒恤筛。時間到達后會刪除 key 及 value
ttl key 查詢已設置過期時間的 key 的剩余時間 如果返回-2 表示該鍵值對已經(jīng)被刪除
persist 移除給定 key 的過期時間
select dbindex 選擇數(shù)據(jù)庫(0-15)
move key dbIndex 將當前數(shù)據(jù)庫中的 key 轉移到其他數(shù)據(jù)庫中
dbsize 返回當前數(shù)據(jù)庫中的 key 的數(shù)目
info 獲取服務器的信息和統(tǒng)計
flushdb 刪除當前選擇的數(shù)據(jù)庫中的 key
flushall 刪除所有數(shù)據(jù)庫中的所有 key
quit 退出連接
Redis 的數(shù)據(jù)持久化
RDB 方式
對內存中數(shù)據(jù)庫狀態(tài)進行快照
RDB 方式:將 Redis 在內存中的數(shù)據(jù)庫狀態(tài)保存到磁盤里面官还,RDB 文件是一個經(jīng)過壓縮的二進制文件琐鲁,通過該文件可以還原生成 RDB 文件時的數(shù)據(jù)庫狀態(tài)(默認下赂蠢,持久化到dump.rdb 文件,并且在 redis 重啟后古程,自動讀取其中文件,據(jù)悉屯伞,通常情況下一千萬的字符串類型鍵述么,1GB 的快照文件,同步到內存中的 時間是 20-30 秒)
RDB 的生成方式:
1)執(zhí)行命令手動生成
有兩個 Redis 命令可以用于生成 RDB 文件愕掏,一個是 SAVE,另一個是 BGSAVE SAVE命令會阻塞 Redis 服務器進程顶伞,直到 RDB 文件創(chuàng)建完畢為止饵撑,在服務器進程阻塞期間,服務器不能處理任何命令請求唆貌,BGSAVE 命令會派生出一個子進程滑潘,然后由子進程負責創(chuàng)建RDB 文件,服務器進程(父進程)繼續(xù)處理命令請求锨咙,創(chuàng)建 RDB 文件結束之前语卤,客戶端發(fā)送的 BGSAVE 和 SAVE 命令會被服務器拒絕
2)通過配置自動生成
可以設置服務器配置的 save 選項,讓服務器每隔一段時間自動執(zhí)行一次 BGSAVE 命令酪刀,可以通過 save 選項設置多個保存條件粹舵,但只要其中任意一個條件被滿足,服務器就會
執(zhí)行 BGSAVE 命令
例如:
save 900 1
save 300 10
save 60 10000
那么只要滿足以下三個條件中的任意一個骂倘,BGSAVE 命令就會被執(zhí)行
服務器在 900 秒之內眼滤,對數(shù)據(jù)庫進行了至少 1 次修改
服務器在 300 秒之內,對數(shù)據(jù)庫進行了至少 10 次修改
服務器在 60 秒之內历涝,對數(shù)據(jù)庫進行了至少 10000 次修改
AOF 方式
AOF 持久化方式在 redis 中默認是關閉的诅需,需要修改配置文件開啟該方式。
AOF:把每條命令都寫入文件荧库,類似 mysql 的 binlog 日志
AOF 方式:是通過保存 Redis 服務器所執(zhí)行的寫命令來記錄數(shù)據(jù)庫狀態(tài)的文件堰塌。
AOF 文件刷新的方式,有三種:
appendfsync always - 每提交一個修改命令都調用 fsync 刷新到 AOF 文件分衫,非常非常慢场刑,但也非常安全
appendfsync everysec - 每秒鐘都調用 fsync 刷新到 AOF 文件,很快丐箩,但可能會丟失一秒以內的數(shù)據(jù)
appendfsync no - 依靠 OS 進行刷新摇邦,redis 不主動刷新 AOF,這樣最快屎勘,但安全性就差默認并推薦每秒刷新施籍,這樣在速度和安全上都做到了兼顧
AOF 數(shù)據(jù)恢復方式
服務器在啟動時,通過載入和執(zhí)行 AOF 文件中保存的命令來還原服務器關閉之前的數(shù)據(jù)庫狀態(tài)概漱,具體過程:
載入 AOF 文件
創(chuàng)建模擬客戶端
從 AOF 文件中讀取一條命令
使用模擬客戶端執(zhí)行命令
循環(huán)讀取并執(zhí)行命令丑慎,直到全部完成
如果同時啟用了 RDB 和 AOF 方式,AOF 優(yōu)先,啟動時只加載 AOF 文件恢復數(shù)據(jù)
Redis 集群介紹
Redis3.0 版本之后支持 Cluster竿裂。集群要求集群節(jié)點中必須要支持主備模式玉吁,也就說集中的主節(jié)點(Master)至少要有一個從節(jié)點(Slave)每一個藍色的圈都代表著一個 redis 集群中的主節(jié)點。它們任何兩個節(jié)點之間都是相互連通的腻异〗保客戶端可以與任何一個節(jié)點相連接,然后就可以訪問集群中的任何一個節(jié)點悔常。對其進行存取和其他操作
Redis-Cluster 架構圖
Redis-Cluster 選舉:容錯
????????Redis 之間通過互相的 ping-pong 判斷是否節(jié)點可以連接上影斑。如果有一半以上的節(jié)點去ping 一個節(jié)點的時候沒有回應,集群就認為這個節(jié)點宕機了机打,然后去連接它的從節(jié)點矫户。如果某個節(jié)點和所有從節(jié)點全部掛掉,我們集群就進入 fail 狀態(tài)残邀。還有就是如果有一半以上的主節(jié)點宕機皆辽,那么我們集群同樣進入 fail 了狀態(tài)。這就是我們的 redis 的投票機制芥挣,具體原理如下圖所示:
投票過程是集群中所有 master 參與,如果半數(shù)以上 master 節(jié)點與 master 節(jié)點通信超時(cluster-node-timeout),認為當前 master 節(jié)點掛掉.
什么時候整個集群不可用(cluster_state:fail)?
????????1) 如果集群任意 master 掛掉,且當前 master 沒有 slave驱闷。此時集群進入 fail 狀態(tài),也可以理解成集群的 slot 映射[0-16383]不完整時進入 fail 狀態(tài)。
????2) 如果集群超過半數(shù)以上 master 掛掉九秀,無論是否有 slave遗嗽,集群進入 fail 狀態(tài)
Redis-Cluster 數(shù)據(jù)存儲
當我們的存取的 key 到達的時候,redis 會根據(jù) crc16 的算法得出一個結果鼓蜒,然后把結果對 16384 求余數(shù)痹换,這樣每個 key 都會對應一個編號在 0-16383 之間的哈希槽,通過這個值都弹,去找到對應的插槽所對應的節(jié)點娇豫,然后直接自動跳轉到這個對應的節(jié)點上進行存取操作。
在 Node1 執(zhí)行 set name kevin
1. 使用 CRC16 算法對 key 進行計算畅厢,得到一個數(shù)字冯痢,然后對數(shù)字進行取余。
CRC16 : name = 26384
26384%16384 = 10000
2. 查找到包含 10000 插槽的節(jié)點框杜,比如是 node2浦楣,自動跳轉到 node2
3. 在 node2 上執(zhí)行 set name kevin 命令完成數(shù)據(jù)的插入
4. 如果在 node1 上執(zhí)行 get name,先使用 CRC16 算法對 key 進行計算咪辱,在使用16384 取余振劳,得到插槽的下標,然后跳到擁有該插槽的 node2 中執(zhí)行 get name 命令油狂,并返回結果历恐。
安裝集群(本教程使用一臺虛擬機寸癌,搭建偽集群)
搭建一個 Redis 的最小集群,使用偽集群方式弱贼。Redis 中最小的集群三對主從蒸苇。
在虛擬機中安裝 6 個 redis 實例。
修改redis.conf文件中的端口配置吮旅,6 個 redis 實例的端口分配:7001溪烤、7002、7003庇勃、7004氛什、7005、7006
修改開啟集群 在配置文件中搜索 cluster 找到后 將默認為注釋的 cluster-enabled yes 去掉注釋
redis 集群時需要使用一個 ruby 的腳本來完成集群匪凉。
安裝 ruby 環(huán)境
命令: yum install ruby
安裝 ruby 的包管理器
命令:yum install rubygems
這個腳本的執(zhí)行需要依賴于一些其他的 ruby 包 所以我們還要下載一個
redis-3.0.0.gem
將這個文件上傳到 linux 服務器中
安裝這個 ruby 包
命令:gem install redis-3.0.0.gem
進入到 redis 的安裝目錄下的 src 目錄下找到到 redis-trib.rb 這個文件 這是集群時需要的腳本,
把創(chuàng)建集群的redis-trib.rb 這個腳本復制到集群的根目錄下中
創(chuàng)建一個能夠批量啟動的腳本程序
將6個示例的啟動 和各自配配置文件進行匹配寫入文件中,
將批量啟動腳本設置為可執(zhí)行權限
命令:chmod +x startall.sh
執(zhí)行這個批量啟動的腳本捺檬,查看 redis 是否啟動成功
命令 ps aux|grep redis
創(chuàng)建集群
執(zhí)行腳本文件再层,并附加參數(shù)
./redis-trib.rb create --replicas 1 192.168.1.19:7001 192.168.1.19:7002 192.168.1.19:7003 192.168.1.19:7004 192.168.1.19:7005 192.168.1.19:7006
此時會有確認信息,輸入yes堡纬,確認執(zhí)行
此時集群架設完成聂受!
集群測試
可以連接集群中的任意一個節(jié)點進行測試 注意一定要有-c 參數(shù),否則能連上烤镐,但是無法操作 redis 集群
連接方法蛋济。通過任何一個redis實例中的客戶端進行連接
命令:./redis01/redis-cli -h 主機ip -p 端口 -c
關閉集群
通過任何一個redis實例中的客戶端進行關閉每個實例,可以編寫一個批處理文件炮叶。方法同批量啟動一樣
關閉一個實例命令:./redis01/redis-cli -h 主機ip -p 端口 shutdown