Redis之使用
- 2019 年 10 月 3 日
- 筆記
Redis
一、概述
1. 特點
- 開源的,使用c編寫,基於記憶體且支援持久化
- 高性能的Key-Value的NoSQL資料庫
- 支援數據類型豐富(字元串string、散列hashes、列表list、集合sets、有序集合sorted)
- 支援多種語言
2. 區別
- MySQL:關係型資料庫,表格,基於磁碟,慢
- MongoDB:鍵值對文檔型資料庫,值為json文檔,基於磁碟,慢,存儲資料庫類型單一
- Redis:解決硬碟IO帶來的性能瓶頸
3. 應用場景
- 使用Redis來快取一些經常被用到或者主要消耗大量資源的內容,通過這些內容放到Redis裡面,程式可以快速讀取這些內容
- 一個網站,如果某個頁面經常被訪問到,或者創建頁面時消耗的資源較多,比如需要多次訪問資料庫、生成時間比較長等,我們可以使用Redis將其快取起來,減輕網站負擔,降低網站延遲
4. 附加功能
-
持久化
將記憶體中數據保存到磁碟中,保證數據安全,方便進行數據備份和恢復
-
發布與訂閱
將消息同時分發給多個客戶端,用於構建廣播系統
-
過期鍵功能
為鍵設置一個過期時間,讓他在指定時間內自動刪除<節省記憶體空間>
-
事務功能
原子的多個操作
5. 安裝
Ubuntu
sudo apt-get redis-server
Windows
前往GitHub下載Windows安裝包,Redis官網並沒有Windows版本的。
服務配置
將redis.windows.conf重命名為redis.conf,作為redis服務的配置文件
cmd命令行,切換到redis-server.exe目錄
redis-server --service-install redis.conf --loglevel verbose
電腦-管理-服務-Redis-啟動
卸載
到redis-server.exe所在路徑執行
redis-server --service-uninstall
sc delete Redis
CentOS
二、基本配置
1. 密碼配置
進入配置文件,查找
requirepass
後邊加上密碼重啟服務
sudo /etc/init.d/redis-server restart
客戶端連接
redis-cli -h 127.0.0.1 -p 6379 -a 123456
ping
2. 允許遠程
vim /etc/vim /etc/redis/6379.conf #注釋bind 127.0.0.1 ::1 #將protected-mode yes 改為 protected-mode nobash redis-cli -h IP -p 6379 -a passworld
三、數據類型
1. 字元串
特點
- 字元串、數字,都會轉換為字元串來存儲
命令
set key value #設置鍵值對 setnx key value #鍵不存在時才能設置 #設置過期時間 set key value ex 5 #以秒為單位 expire key 5 #在創建的時候並沒有指定時間 mset key1 value1 key2 value2 #一次性設置多個值 mget key1 key2 key3 #同時獲取多個值
鍵的命名規範
利用:層級關係
127.0.0.1:6379> mset zhang:email [email protected] li:email [email protected] OK 127.0.0.1:6379> mget zhang:email li:email 1) "[email protected]" 2) "[email protected]"
1.1 長度
作用:獲取值的長度
命令格式:strlen key
127.0.0.1:6379> get name "danni" 127.0.0.1:6379> strlen name (integer) 5
1.2 替換
setrange key 索引值 value
作用:從索引值開始,value替換原內容(依次替換)
127.0.0.1:6379> set message "hello world" OK 127.0.0.1:6379> setrange message 6 python (integer) 12 127.0.0.1:6379> get message "hello python"
1.3 切片
getrange key 起始值 終止值
作用:獲取指定範圍內的
127.0.0.1:6379> get message "hello python" 127.0.0.1:6379> getrange message 0 4 "hello" 127.0.0.1:6379> getrange message 0 -1 "hello python"
1.4 拼接
append key "value"
追加後邊的值
127.0.0.1:6379> set message "hello " OK 127.0.0.1:6379> get message "hello " 127.0.0.1:6379> append message "python" (integer) 12 127.0.0.1:6379> get message "hello python"
1.5 加
incrby key 步長
在原來的value上+步長
127.0.0.1:6379> set number 10 OK 127.0.0.1:6379> incrby number 5 (integer) 15 127.0.0.1:6379> get number "15"
1.6 減
decrby key 步長
同上,為減法
127.0.0.1:6379> get number "15" 127.0.0.1:6379> decrby number 5 (integer) 10 127.0.0.1:6379> get number "10"
1.7 浮點型
INCRBYFLOAT key value
加法,如果value為負數,則為減法
127.0.0.1:6379> get number "18" 127.0.0.1:6379> INCRBYFLOAT number 6.66 "24.66" 127.0.0.1:6379> INCRBYFLOAT number -6.66 "18"
1.8 匯總
#字元串 1、set key value 2、setnx key value 3、get key 4、mset key1 value1 key2 value2 5、mget key1 key2 6、set key value ex seconds # 設置過期時間 7、strlen key #數字操作 8、incrby key 步長 9、decrby key 步長 10、incr key 11、decr key 12、incrbyfloat key number #設置過期時間的兩種方式 #方式一 1、set key value ex 3 #方式二 1、set key value 2、expire key 3 #秒 3、pexpire key 5 #毫秒 #查看存活時間 ttl key # 刪除過期 persist key
1.9 通用命令
# 查看所有鍵 keys * # 鍵類型 type key # 鍵是否存在 exists key # 刪除鍵 del key # 鍵重命名 rename key newkey # 返回舊值並設置新值(如果鍵不存在,就會創建並賦值) getset key value # 清除當前庫中的所有數據 flushdb # 清除所有庫中的所有數據 flushall
1.10 練習
- 查看db0中的所有鍵
select 0
keys *
- 設置鍵trill::username 對應的值為user001,並查看
set trill::username user001
- 獲取trill::username 值長度
strlen trill::username
- 一次性的設置trill::password、trill::gender、trill::fansnumber並查看(值自定義)
mset trill::password 123456 trill::gender boy trill::fansnumber 100
- 查看鍵trill::score是否存在
exsits trill::score
- 增加10個粉絲
incrby trill::fansnumber 10
- 增加2個粉絲
incr trill::fansnumber
incr trill::fansnumber
- 減少3個粉絲
decrby trill::fansnumber 3
- 又有一個粉絲減少
decr trill::fansnumber
- 清除當前庫
fulshdb
- 清除所有庫
fulshall
2. 列表
特點:
- 元素是字元串類型
- 列表頭尾增刪快,中間增刪慢,增刪元素是常態
- 元素可重複
- 最多可包含
個元素
- 索引同python列表
2.1 插入
頭尾壓入元素
lpush key value1 value2 value3
頭部壓入數據
rupsh key value1 value2 value3
尾部壓入數據
# lpush :left 127.0.0.1:6379> lpush mylist1 0 1 2 3 # 該表為["lucy", "tom", "10"] 127.0.0.1:6379> lrange mylist1 0 -1 1) "3" 2) "2" 3) "1" 4) "0" # rpush:right 127.0.0.1:6379> rpush mylist2 0 1 2 3 (integer) 4 127.0.0.1:6379> lrange mylist2 0 -1 1) "0" 2) "1" 3) "2" 4) "3"
2.2 查看
lrange
# lrange key start stop lrange mylist1 0 2 # 顯示前三個元素 lrange mylist1 0 -1 # 顯示全部元素
lindex
獲取指定位置元素的值
127.0.0.1:6379> lrange mylist1 0 -1 1) "3" 2) "2" 3) "1" 4) "0" 127.0.0.1:6379> lindex mylist1 1 "2"
lset
替換元素
127.0.0.1:6379> lrange mylist1 0 -1 1) "3" 2) "2" 3) "1" 4) "0" 127.0.0.1:6379> lset mylist1 1 tom OK 127.0.0.1:6379> lrange mylist1 0 -1 1) "3" 2) "tom" 3) "1" 4) "0"
llen
獲取列表長度
127.0.0.1:6379> lrange mylist1 0 -1 1) "3" 2) "2" 3) "1" 4) "0" 127.0.0.1:6379> llen mylist1 (integer) 4
2.3 刪除
頭尾彈出元素
lpop key
從列表的頭部彈出一個元素
127.0.0.1:6379> lrange mylist1 0 -1 1) "3" 2) "2" 3) "1" 4) "0" 127.0.0.1:6379> lpop mylist1 "3" 127.0.0.1:6379> lrange mylist1 0 -1 1) "tom" 2) "1" 3) "0"
rpop key
從列表的尾部彈出一個元素
127.0.0.1:6379> lrange mylist1 0 -1 1) "tom" 2) "1" 3) "0" 127.0.0.1:6379> rpop mylist1 "0" 127.0.0.1:6379> lrange mylist1 0 -1 1) "tom" 2) "1"
rpoprpush
rpoprpush list1 list2
彈出list1尾部元素並壓入list2尾部(可自由組合)
127.0.0.1:6379> rpush mylist1 0 1 2 3 4 (integer) 5 127.0.0.1:6379> rpoplpush mylist1 mylist2 "4" 127.0.0.1:6379> lrange mylist2 0 -1 1) "0" 2) "1" 3) "2" 4) "3" 127.0.0.1:6379> lrange mylist2 0 -1 1) "4"
lrem
lrem key count vlaue
移除指定元素()
count > 0
表示從頭開始向表尾搜索,移除與value相等的元素,刪除的數量為count
count < 0
表示從尾開始向表頭搜索,移除與value相等的元素,刪除的數量為|count|
count = 0
表示刪除所有value值
127.0.0.1:6379> lrange mylist 0 -1 1) "6" 2) "5" 3) "4" 4) "chancey" 5) "2" 6) "waller" 7) "0" 8) "chancey" 9) "1" 10) "waller" 11) "3" 127.0.0.1:6379> lrem mylist 1 chancey (integer) 1 127.0.0.1:6379> lrange mylist 0 -1 1) "6" 2) "5" 3) "4" 4) "2" 5) "waller" 6) "0" 7) "chancey" 8) "1" 9) "waller" 10) "3" 127.0.0.1:6379> lrem mylist -2 waller (integer) 2 127.0.0.1:6379> lrange mylist 0 -1 1) "6" 2) "5" 3) "4" 4) "2" 5) "0" 6) "chancey" 7) "1" 8) "3"
ltrim
ltrim key start stop
保留指定位置的元素
127.0.0.1:6379> lrange mylist1 0 -1 1) "tom" 2) "0" 3) "1" 4) "2" 5) "3" 6) "4" 127.0.0.1:6379> ltrim mylist1 0 1 # 保留前兩位元素 OK 127.0.0.1:6379> lrange mylist1 0 -1 1) "tom" 2) "0"
#保留微博最後500條評論 ltrim weibo:comments 0 499 ltrim weibo:comments -500 -1
練習
- 查看所有的鍵
key *
- 向列表 spider::urls 中已rpush放入如下元素(01_baidu.com、02_taobao.com、03_sina.com、04_jd.com、05_xxx.com)
rpush spider::urls 01_baidu.com、02_taobao.com、03_sina.com、04_jd.com、05_xxx.com
- 查看列表中的所有元素
lrange spider::urls
- 查看列表長度
llen spider::urls
- 將列表中01_baidu.com 改為01_tmall.com
lset sipder::urls 0 01_tmall.com
- 在列表中04_jd.com之後再加一個元素02_tabao.com
linsert spider::urls after 04_jd.com 02_taobao.com
- 彈出列表中的最後一個元素
rpop spider::urls
- 刪除列表中所有的02_taobao.com
lrem spider::urls 0 02_taobao.com
- 剔除列表中的其他元素,只剩前三條
ltrim spider::urls 0 2
2.4 匯總
# 插入元素的相關操作 lpush key value1 value2 rpush key value1 value2 rpoplpush course destination linsert key after | before value newvalue # 查詢相關的操作 lrange key start stop llen key # 刪除相關操作 lpop key rpop key blpop key timeout # timeout參數必須給,0為永久阻塞 brpop key timeout # 同上 lrem key count value # 剔除count個value ltrim key start stop # 保留範圍內元素 # 修改制定元素 lset key index newvalue
Redis列表如何當做共享隊列來使用?
- 生產者消費者模型
- 生產者進程在列表中 lpush | rpush 數據,消費者進程在列表中 rpop | lpop 數據
==點陣圖操作==
特殊的字元串類型
- 點陣圖不是真正的數據類型,他是定義在字元串類型中
- 一個字元串類型的值最多嫩存儲512M位元組的內容(位上線)
常用命令
# 設置某一位上的值,offset是偏移量,從0開始 setbit key offset value # 獲取某一位上的值 getbit key offset # 統計鍵所對應的值中有多少個,二進位中1的格式 bitcount key
應用場景
網站用戶的上線次數統計(尋找活躍用戶)
用戶名為key,上線天數為offset,上線設置為1
示例:用戶名為user001的用戶,今年第1天上線,第30天上線
setbit user 001 setbit user 29 1 bitcount user001
python文件
import redis r = redis.Redis(host="127.0.0.1", port=6379, db=0) #user1:一年之中第一天和第五天登錄 r.setbit("user1", 0, 1) r.setbit("user1", 4, 1) #user2:一年之中第100天和第200天登錄 r.setbit("user2", 99, 1) r.setbit("user2", 199, 1) #user3:一年中有100天以上登錄 for i in range(0, 365, 2): r.setbit("user3", i, 1) #user4:一年中有100天以上登錄 for i in range(0, 365, 3): r.setbit("user4", i, 1) #統計活躍用戶和非活躍用戶 ## 先找到所有用戶 user_list = r.keys("user*") ## 定義兩個列表,活躍用戶和非活躍用戶 active_users = [] no_active_users = [] for user in user_list: # 統計點陣圖中有多少個1 login_count = r.bitcount(user) if login_count >= 100: active_users.append((user, login_count)) else: no_active_users.append((user, login_count)) #列印活躍用戶 #活躍用戶: [(b'user4', 122), (b'user3', 183)] for user in active_users: print("活躍用戶:%s 活躍次數:%s" % (user[0].decode(), user[1]))
3. 散列
3.1 概述
3.1.1 定義
- 由filed和關聯的value組成的鍵值對
- filed和value是字元串類型
- 一個hash中最多包含
個鍵值對
3.2.1 優點
- 節約記憶體空間
- 每創建一個鍵,他都會為這個鍵存儲一些附加的管理資訊(比如這個鍵的類型,這個鍵最後一次訪問的事件等)
- 鍵越多,redis資料庫在存儲附件管理資訊方面耗費記憶體越多,花在管理資料庫鍵上的CPU也會越多
3.2.2 缺點
- 使用二進位位操作命令:
setbit
、getbit
、bitcount
等,如果想使用這些操作,只能用字元串鍵 - 使用過期功能:鍵過期功能只能對鍵進行過期操作,而不能對散列的欄位進行過期操作
3.2 基本命令
# 1、設置單個欄位 hset key filed value hsetnx key filed value # 2、設置多個欄位 hmset key filed value filed value # 3、返回欄位個數 hlen key # 4、判斷欄位是否存在(不存在返回0) hexists key field # 5、返回欄位值 hget key field # 6、返回多個欄位值 hmget key field1 filed2 # 7、返回所有鍵值對 hgetall key # 8、返回欄位長度 hlen key # 9、返回所有欄位名 hkeys key # 10、返回所有值 hvals key # 11、刪除指定欄位 hdel key field1 field2 field3 # 12、在欄位對應值上進行整數增量運算 hincrby key filed increment # 13、在欄位對應值上進行浮點數增量運算 hincrbyfloat key filed increment
4. 集合
與python集合類似
4.1 概述
- 無序、去重
- 元素是字元串類型
- 最多包含
個元素
4.2 基本命令
# 1、增加一個或多個元素,自動去重 sadd key member1 member2 # 2、查看集合中所有元素 smembers key # 3、刪除一個或多個元素,元素不存在則自動忽略 sismember key count # 4、隨機彈出元素(默認彈出一個) spop key [count] # 5、元素是否存在(返回1表示存在,0表示不存在) sismember key member # 6、隨機返回集合中指定個數的元素,默認一個 srandmember key count # 7、返回集合中元素的個數,不會遍歷整個集合,只是存儲在鍵當中 scard key # 8、把元素從源集合移動到目標集合 smove source desctination member # 9、差集(number1 1 2 3 4 number2 1 2 4) sdiff key1 key2 sdiffstore destination key1 key2 #將差集保存至新集合里 # 10、交集 sinter key1 key2 sinserstore destination key1 key2 #同上 # 11、並集 sunion key1 key2 sunionstore destination key1 key2 #同上
sina的共同關注
需求:當用戶訪問另一個用戶的時候,會顯示出兩個用戶共同關注過哪些相同的用戶
設計:將每一個用戶關注的用戶放在集合,求交集即可
實現:
user001 = {"peiqi", "qiaozhi", "danni"}
user002 = {"peiqi", "qiaozhi", "lingyang"}
127.0.0.1:6379> sadd user001 peiqi qiaozhi danni (integer) 3 127.0.0.1:6379> sadd user002 peiqi qiaozhi lingyang (integer) 3 127.0.0.1:6379> sinterstore user_all user001 user002 1) "peiqi" 2) "qiaozhi"
6. 有序集合
即有順序的集合
6.1 概述
- 有序、去重
- 元素都是字元串
- 每個元素都關聯著一個浮點數分值(score),並按照分值從小到大的順序排列集合中的元素(分值可以相同)
- 最多包含
個元素
示例:
一個保存的水果價格的有序集合
分值 | 2.0 | 4.0 | 6.0 | 8.0 | 10.0 |
---|---|---|---|---|---|
元素 | 西瓜 | 葡萄 | 芒果 | 香蕉 | 蘋果 |
一個保存了員工薪水的有序集合
分值 | 6000 | 8000 | 10000 | 12000 |
---|---|---|---|---|
元素 | lucy | tom | jim | jack |
一個保存了正在閱讀某些技術書的人數
分值 | 300 | 400 | 555 | 666 | 777 |
---|---|---|---|---|---|
元素 | 核心編程 | 阿凡提 | 本拉登 | 阿姆斯特朗 | 比爾蓋茨 |
6.2 增加
zadd key score member
# 有序集合中添加一個成員 zadd key score member # 查看指定區間元素(升序) zrange key start stop [withscores] # 查看指定區間元素(降序) zrevrange key start stop [withscores] #反轉 # 查看指定元素的分值 zscore key member # 返回指定區間元素 # offset:跳過多少個元素 # count : 返回幾個 # 小括弧:開區間 zrangebyscore key min max [withscore] [limit offset count] 例如: zrangebyscore salary (6000 (8000 # 刪除6000-8000之間的所有元素 # 刪除成員 zrem key member # 增加或者減少分值 zincrby key increment member # 返回元素逆序排名 zrevrank key member # 刪除指定區間的元素 zremrangebyscore key min max #返回集合中元素個數 zcard key # 返回指定範圍中元素的個數 zount key min max # 並集 numkeys為想要合併的key的個數 zunionstore destination numkeys key [weights 權重值] [aggregate sum|min|max] # 交集 zinterstore destination numkeys key1 key2 weights weight aggregate sum|min|max
6.3 交並集
# 交集(weights代表權重值,aggregate代表聚合方式 - 計算權重值,然後聚合) zinserstore destination numkeys key1 key2 `zinterstore z_inter 2 z1 z2 weights 0.5 0.3 aggregate max` # 並集 zunionstore destination numkeys [weights 權重值] [aggregate sum|min|max]
6.4 應用場景
網易雲音樂排行榜
1、每首歌的革命作為元素(不考慮重複)
2、每首歌的播放次數作為分值
3、使用zrevrange來獲取播放次數最多的歌曲
四、數據持久化
持久化:將資料庫從掉電易失的記憶體放到永久儲存的設備上
1. RDB
默認模式
- 保存真實的數據
- 將伺服器包含的所有資料庫數據以二進位文件的形式保存到硬碟裡面
- 默認文件名:
var/lib/redis/dump.rdb
創建RDB的方式有兩種
1.1 手動操作
伺服器執行客戶端發送的save或者bgsave命令
127.0.0.1:6379> save OK 127.0.0.1:6379> exit chancey@Server:~$ sudo ls /var/lib/redis/ dump.rdb
- 特點
- 執行save命令過程中,redis伺服器將被阻塞,無法處理客戶端發送命令請求,在save之後,吳福氣才會重新開始處理客戶端發送的命令請求
- 如果RDB文件存在,那麼伺服器將自動使用新的RDB文件覆蓋原來的RDB文件
127.0.0.1:6379> bgsave Background saving started 127.0.0.1:6379> exit chancey@Server:~$ sudo ls -l /var/lib/redis/ 總用量 4 -rw-rw---- 1 redis redis 581 9月 2 14:22 dump.rdb
-
執行過程如下
- 客戶端發送bgsave給伺服器
- server馬上返回Background saving started 給client
- server 的 fork() 子進程做這件事情
- server繼續提供服務
- 子進程創建完RDB文件後再告知Redis server
-
配置文件的相關操作
/etx/redis/redis.conf dir /var/lib/redis # 表示redis備份路徑 dbfilename dump.rdb # 文件名
1.2 自動備份
設置配置文件條件滿足時自動保存(使用最多)
# 命令行示例 redis>save 300 10
表示如果距離上一次創建的RDB文件已經過去了300秒,並且伺服器的所有資料庫總共發生了不少於10的修改,那麼執行命令dbsave
配置文件默認設置
save 900 1 save 300 10 save 60 10000 1、表示只要三個條件中的任意一個被滿足時,伺服器就會執行bgsave 2、每次創建RDB文件之後,伺服器為實現自動持久化而設置的事件計數器和次數計數器就會被清零,並重新開始計數,所以多個保存條件的效果不會疊加
1.3 缺點
- 創建RDB文件需要將server所有的資料庫數據保存,其過程非常消耗資源和時間,所有server需要隔一段時間才創建一個新的RDB文件,也就是說,創建RDB文件不能執行的過於頻繁,否則會嚴重影響server的性能
- 可能丟失數據
2. AOF
2.1 配置
-
存儲的是命令,而不是真實的數據
-
默認不開啟
-
開啟方式:
-
/etc/redis/redis.conf
改
appendonly no
為appendonly yes
改
#appendfilename "appendonly.aof"
為appendfilename "appendonly.aof"
-
sudo /etc/init.d/redis-server restart
重啟服務
-
2.1 原理
- 每當有修改資料庫的命令被執行的時候,server就會將執行的命令寫到AOF文件的末尾
- 因為AOF文件裡面存儲了server執行過的所有數據修改的命令。所以給定一個AOF文件,伺服器只要重新執行一遍AOF文件裡面的所有命令,就可以達到還原數據的目的
2.2 優點
用戶可以根據自己的需要對AOF持久化進行調整,讓Redis在遭遇意外停電停機時不會丟失任何數據,或者只丟失一秒的數據
2.3 策略
編輯配置文件/etc/redis/redis.conf
appendfsync alwarys 伺服器每寫入一條命令,就將緩衝區裡面的命令寫入到硬碟裡面,server就算意外停機,也不會丟失人格已經成功執行的命令 appendfsync everysec #(默認) server每一秒將緩衝區裡面的命令寫入到硬碟裡面,伺服器即使遭受意外停機,最多丟失一秒的數據 appendfsync no server不主動將命令寫入硬碟。由作業系統決定何時將緩衝區裡面的命令寫入到硬碟裡面,丟失命令數量不確定
AOF中的冗餘命令
為了讓AOF文件的大小控制在合理範圍,避免胡亂增長,redis提供了AOF重寫功能,通過這個功能,server可以產生一個新的AOF文件
— 新的AOF文件記錄的資料庫數據和原來的AOF文件記錄的資料庫數據完全一樣
— 新的AOF文件會使用儘可能少的命令記錄數據數據,因此新的AOF文件的體積通常會小很多
— AOF重寫期間,伺服器不會阻塞,可以正常處理客戶端發送的命令請求
2.4 重寫觸發
-
client向server發送
bgrewriteaof
127.0.0.1:6379> BGREWRITEAOF Background append only file rewriting started
-
修改配置文件讓server自動執行bgrewriteaof命令
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
只有當AOF文件的增量大於100%時才進行重寫,也就是大一倍的時候觸發
3. 總結
配置文件:/etc/redis/redis.conf
日誌文件:/var/log/redis/reids-server.log
RDB文件:/var/lib/redis/dump.rdb
AOF文件:/var/lib/redis/appendonly.aof
3.1 RDB
默認
dir /var/lib/redis
dbfilename dumo.rdb
save 900 1
save 300 10
save 60 10000
3.2 AOF
appendonly yes
appendfilename "appendonly.aof"
appendfsync always
appendfsync everysec
appendfsync no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
五、主從複製
1. 概述
定義
- 一個redis服務可以有多個該服務的複製品,這個redis稱為master,其他複製品稱為slaves
- 網路正常,master會一致將自己的數據更新同步給slaves,保持主從同步
- 只有master可以執行寫命令,slave只能執行讀命令
作用
- 分擔了讀的壓力(高並發)
原理
- 從伺服器執行客戶端發送的讀命令,比如GET、LRANGE、SMEMMVERS、HGET、ZRANGE等等,客戶端可以連接slaves執行讀請求,來降低master的讀壓力
2. 實現
==法一(命令行)==
redis-server --port 630 --slaveof 127.0.0.1 6379
# 從server端 redis-server --port 6300 --slaveof 127.0.0.1 6379 # 從client端 redis-cli -p 6300 127.0.0.1:6300> keys * # 發現是複製了原6379埠的redis數據 127.0.0.1:6379> set sex man OK 127.0.0.1:6300> keys * 1) "name" 2) "sex" # 從server只能讀取數據,不能寫入`
==法二(命令行)==
127.0.0.1:6379> keys * 1) "name" 2) "sex" 127.0.0.1:6379> set age 18 OK 127.0.0.1:6379> slaveof 127.0.0.1 6379 # 切換為從server OK 127.0.0.1:6379> set newkey 456 (error) READONLY You can't write against a read only slave. 127.0.0.1:6379> keys * 1) "age" 2) "name" 3) "sex" 127.0.0.1:6379> slaveof no one # 切換回主server OK
==法三(修改配置)==
vim /etc/redis/redis.conf