Redis

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

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末碗旅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子镜悉,更是在濱河造成了極大的恐慌祟辟,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侣肄,死亡現(xiàn)場離奇詭異旧困,居然都是意外死亡,警方通過查閱死者的電腦和手機稼锅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門吼具,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人矩距,你說我怎么就攤上這事拗盒。” “怎么了剩晴?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵锣咒,是天一觀的道長侵状。 經(jīng)常有香客問我,道長毅整,這世上最難降的妖魔是什么趣兄? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮悼嫉,結果婚禮上艇潭,老公的妹妹穿的比我還像新娘。我一直安慰自己戏蔑,他們只是感情好蹋凝,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著总棵,像睡著了一般鳍寂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上情龄,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天迄汛,我揣著相機與錄音,去河邊找鬼骤视。 笑死鞍爱,一個胖子當著我的面吹牛,可吹牛的內容都是我干的专酗。 我是一名探鬼主播睹逃,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼祷肯!你這毒婦竟也來了沉填?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤佑笋,失蹤者是張志新(化名)和其女友劉穎拜轨,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體允青,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡橄碾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了颠锉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片法牲。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖琼掠,靈堂內的尸體忽然破棺而出拒垃,到底是詐尸還是另有隱情,我是刑警寧澤瓷蛙,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布悼瓮,位于F島的核電站戈毒,受9級特大地震影響,放射性物質發(fā)生泄漏横堡。R本人自食惡果不足惜埋市,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望命贴。 院中可真熱鬧道宅,春花似錦、人聲如沸胸蛛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽葬项。三九已至泞当,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間民珍,已是汗流浹背零蓉。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留穷缤,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓箩兽,卻偏偏與公主長得像津肛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子汗贫,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內容