Redis–部署操作
1.Redis
1.1 安裝
- 當前ubuntu虛擬機中已經安裝好了redis,以下步驟可以跳過
- 以後自己安裝過程如下:redis下載鏈接:x 指的是版本號 //download.redis.io/releases/redis-x.x.x.tar.gz
- step1:下載
wget //download.redis.io/releases/redis-x.x.x.tar.gz
- step2:解壓
tar xzf redis-x.x.x.tar.gz
- step3:移動,放到usr/local⽬錄下
sudo mv ./redis-x.x.x /usr/local/redis/
- step4:進⼊redis⽬錄
cd /usr/local/redis/
- step5:生成
sudo make
- step6:測試,這段運⾏時間會較⻓
sudo make test
- step7:安裝,將redis的命令安裝到
/usr/local/bin/
⽬錄
sudo make install
- step8:安裝完成後,我們進入目錄
/usr/local/bin
中查看
cd /usr/local/bin
ls -all
redis-server redis伺服器
redis-cli redis命令行客戶端
redis-benchmark redis性能測試工具
redis-check-aof AOF文件修復工具
redis-check-rdb RDB文件檢索工具
- step9:配置⽂件,移動到
/etc/
⽬錄下
配置⽂件⽬錄為/usr/local/redis/redis.conf
sudo cp /usr/local/redis/redis.conf /etc/redis/
- step9:其他補充
Mac 上安裝 Redis://brew.sh/
使用 brew 安裝 Redis://www.cnblogs.com/cloudshadow/p/mac_brew_install_redis.html
1.2 配置
- Redis的配置資訊在
/etc/redis/redis.conf
下
查看 sudo vi /etc/redis/redis.conf
- 綁定ip:如果需要遠程訪問,可將此⾏注釋,或綁定⼀個真實ip
- bind 127.0.0.1
- 端⼝:默認為6379
- port 6379
- 是否以守護進程運⾏
- 如果以守護進程運行,則不會在命令⾏阻塞,類似於服務
- 如果以⾮守護進程運⾏,則當前終端被阻塞
- 設置為yes表示守護進程,設置為no表示⾮守護進程
- 推薦設置為yes daemonize yes
- 數據⽂件
- dbfilename dump.rdb
- 數據⽂件存儲路徑
- dir /var/lib/redis
- ⽇志⽂件
- logfile “/var/log/redis/redis-server.log”
- 資料庫,默認有16個
- database 16
- 主從複製,類似於雙機備份
- slaveof host port
- 參考資料
1.3 伺服器端和客戶端命令
1.3.1 伺服器端
- 伺服器端的命令為redis-server
- 可以使⽤help查看幫助⽂檔
- redis-server –help
- 個人習慣
- ps aux | grep redis 查看redis伺服器進程
- sudo kill -9 pid 殺死redis伺服器
- sudo redis-server /etc/redis/redis.conf 指定載入的配置文件
1.3.2 客戶端
- 客戶端的命令為redis-cli
- 可以使⽤help查看幫助⽂檔
- redis-cli –help
- 連接redis
- redis-cli
- 運⾏測試命令
- ping
- 切換資料庫
- 資料庫沒有名稱,默認有16個,通過0-15來標識,連接redis默認選擇第一個資料庫
- select 10
1.4 數據操作


鍵命令 1)查看所有鍵:keys * 2)查看名稱中包含a的鍵:keys a* 3)判斷鍵是否存在,如果存在返回1,不存在返回0:exists key1 4)查看鍵對應的value的類型:type key 5)刪除鍵及對應的值:del key1 key2 ... 6)設置過期時間,以秒為單位:expire key seconds 7)查看有效時間,以秒為單位:ttl key
鍵命令



hash類型: hash⽤於存儲對象,對象的結構為屬性、值 值的類型為string 1、增加、修改 設置單個屬性:hset key field value 設置多個屬性:hmset key field1 value1 field2 value2 ... 2、獲取 獲取指定鍵所有的屬性:hkeys key 獲取所有屬性的值:hvals key 獲取⼀個屬性的值:hget key field 獲取多個屬性的值:hmget key field1 field2 ... 3、刪除 刪除整個hash鍵及值,使⽤del命令:hdel key ...
hash


list類型 列表的元素類型為string 按照插⼊順序排序 1、增加 在左側插⼊數據:lpush key value1 value2 ... 在右側插⼊數據:rpush key value1 value2 ... 在指定元素的前或後插⼊新元素: linsert key before或after 現有元素 新元素 2、獲取 返回列表⾥指定範圍內的元素:range key start stop 設置指定元素的值:lset key index value 3、刪除 刪除指定元素 將列表中前count次出現的值為value的元素移除 count > 0: 從頭往尾移除 count < 0: 從尾往頭移除 count = 0: 移除所有 lrem key count value 4、截取修剪 修剪(截取) 在[start stop]區間內的元素,區間外的元素全部刪除 ltrim key start stop
list


set類型 1)⽆序集合 2)元素為string類型 3)元素具有唯⼀性,不重複 4)說明:對於集合沒有修改操作 1、增加 1)添加元素:sadd key member1 member2 ... 2、獲取 1)返回所有的元素:smembers key 3、刪除 1)刪除指定元素:srem key values
set


zset類型 1)sorted set,有序集合 2)元素為string類型 3)元素具有唯⼀性,不重複 4)每個元素都會關聯⼀個double類型的score, 表示權重,通過權重將元素從⼩到⼤排序 5)說明:沒有修改操作 1、增加 1)添加:zadd key score1 member1 score2 member2 ... 2、獲取 1)返回指定範圍內的元素:zrange key start stop 2)獲取鍵a1的集合中許可權值在min和max之間的成員 zrangebyscore a1 5 6 3)獲取鍵a2的集合中元素zhangsan的權重 zscore a4 zhangsan 3、刪除 1)刪除指定元素:zrem key member1 member2 ... 2)刪除權重在指定範圍的元素:zremrangebyscore key min max
zset
1.5 與python交互
安裝包
安裝Redis的有3種方式//github.com/andymccurdy/redis-py
- 第一種:進⼊虛擬環境,聯⽹安裝包redis
- pip install redis
- 第二種:進⼊虛擬環境,聯⽹安裝包redis
- easy_install redis
- 第三種:到中⽂官⽹-客戶端下載redis包的源碼,使⽤源碼安裝
- 一步步執行 wget //github.com/andymccurdy/redis-py/archive/master.zip
- unzip master.zip
- cd redis-py-master
- sudo python setup.py install
調用模組
- 引⼊模組
- from redis import StrictRedis
- 這個模組中提供了
StrictRedis對象
,⽤於連接redis伺服器,並按照不同類型提供 了不同⽅法,進⾏交互操作
1.5.1 StrictRedis對象方法
-
-
- 通過init創建對象,指定參數host、port與指定的伺服器和端⼝連接,host默認為localhost,port默認為6379,db默認為0
-
sr = StrictRedis(host='localhost', port=6379, db=0) sr=StrictRedis()
- 根據不同的類型,擁有不同的實例⽅法可以調⽤,與前⾯學的redis命令對應,⽅法需要的參數與命令的參數⼀致
-
1、exists 2、type 3、delete 4、expire 5、getrange 6、ttl
keys
-
1、set 2、setex 3、mset 4、append 5、get 6、mget 7、key
string
-
1、hset 2、hmset 3、hkeys 4、hget 5、hmget 6、hvals 7、hdel
hash
-
1、lpush 2、rpush 3、linsert 4、lrange 5、lset 6、lrem
list
-
1、sadd 2、smembers 3、srem
set
-
1、zadd 2、zrange 3、zrangebyscore 4、zscore 5、zrem 6、zremrangebyscore
zset
-
-
1.5.2 舉例 String
-
-
-
⽅法set,添加鍵、值,如果添加成功則返回True,如果添加失敗則返回False 編寫程式碼如下: from redis import * if __name__=="__main__": try: #創建StrictRedis對象,與redis伺服器建⽴連接 sr=StrictRedis() #添加鍵name,值為itheima result=sr.set('name','itheima') #輸出響應結果,如果添加成功則返回True,否則返回False print(result) except Exception as e: print(e)
string–增加
-
1)⽅法get,添加鍵對應的值,如果鍵存在則返回對應的值, 如果鍵不存在則返回None 編寫程式碼如下: from redis import * if __name__=="__main__": try: #創建StrictRedis對象,與redis伺服器建⽴連接 sr=StrictRedis() #獲取鍵name的值 result = sr.get('name') #輸出鍵的值,如果鍵不存在則返回None print(result) except Exception as e: print(e)
string–獲取
-
1)⽅法set,如果鍵已經存在則進⾏修改,如果鍵不存在則進⾏添加 編寫程式碼如下: from redis import * if __name__=="__main__": try: #創建StrictRedis對象,與redis伺服器建⽴連接 sr=StrictRedis() #設置鍵name的值,如果鍵已經存在則進⾏修改,如果鍵不存在則進⾏添加 result = sr.set('name','itcast') #輸出響應結果,如果操作成功則返回True,否則返回False print(result) except Exception as e: print(e)
string–修改
-
1)⽅法delete,刪除鍵及對應的值,如果刪除成功則返回受影響的鍵數, 否則返回0 編寫程式碼如下: from redis import * if __name__=="__main__": try: #創建StrictRedis對象,與redis伺服器建⽴連接 sr=StrictRedis() #設置鍵name的值,如果鍵已經存在則進⾏修改,如果鍵不存在則進⾏添加 result = sr.delete('name') #輸出響應結果,如果刪除成功則返回受影響的鍵數,否則則返回0 print(result) except Exception as e: print(e)
string–刪除
-
1)⽅法keys,根據正則表達式獲取鍵 編寫程式碼如下: from redis import * if __name__=="__main__": try: #創建StrictRedis對象,與redis伺服器建⽴連接 sr=StrictRedis() #獲取所有的鍵 result=sr.keys() #輸出響應結果,所有的鍵構成⼀個列表,如果沒有鍵則返回空列表 print(result) except Exception as e: print(e)
string–獲取鍵
-
-
1.6 搭建主從
1.6.1 主從概念
-
-
- ⼀個master可以擁有多個slave,⼀個slave⼜可以擁有多個slave,如此下去,形成了強⼤的多級伺服器集群架構
-
-
-
- master用來寫數據,slave用來讀數據,經統計:網站的讀寫比率是10:1
-
-
-
- 通過主從配置可以實現讀寫分離
-
master和slave都是一個redis實例(redis服務)
-
1.6.2 主從配置
- 配置主
-
-
- 查看當前主機的ip地址
- ifconfig
- 查看當前主機的ip地址
-
-
-
- 修改
/etc/redis/redis.conf
文件
- 修改
-
sudo vi redis.conf
bind 192.168.26.128
-
-
- 重啟redis服務
-
sudo service redis stop
sudo redis-server redis.conf
配置從
-
-
- 複製
/etc/redis/redis.conf
文件
- 複製
-
sudo cp redis.conf ./slave.conf
-
-
- 修改
redis/slave.conf
文件
- 修改
-
sudo vi slave.conf
-
-
- 編輯內容
-
bind 192.168.26.128
port 6378
slaveof 192.168.26.128 6379
-
-
- redis服務
-
sudo redis-server slave.conf
-
-
- 查看主從關係
-
redis-cli -h 192.168.26.128 info Replication
1.6.3 數據操作
-
-
- 在master和slave分別執⾏info命令,查看輸出資訊 進入主客戶端
-
redis-cli -h 192.168.26.128 -p 6379
-
-
- 進入從的客戶端
-
redis-cli -h 192.168.26.128 -p 6378
-
-
- 在master上寫數據
-
set aa aa
-
-
- 在slave上讀數據
-
get aa
1.6.4 與python交互
-
-
-
REDIS = { 'Master':{ 'host':'192.168.56.100', 'port': '6379', 'db': 0 }, 'Slave':{ 'host':'192.168.56.100', 'port': '6378', 'db': 0 }, } class MSRedis(object): '''讀寫分離客戶端(只針對程式中用到的命令)''' def __init__(self,conf): self.master = StrictRedis(**conf['Master']) self.slave = StrictRedis(**conf['Slave']) self.read_commands = [ 'ttl', 'exist', 'expire', 'get', 'keys', 'hget', 'hgetall', 'hkeys', 'hmget', 'sismember', 'smembers', 'sdiff', 'sinter', 'sunion' 'zrevrange', 'zrevrangebyscore', 'zrevrank', 'zscore' ] def __getattribute__(self, name): if name in ['master', 'slave', 'read_commands']: return object.__getattribute__(self, name) elif name in self.read_commands: print('選擇了從庫') return self.slave.__getattribute__(name) else: print('選擇了主庫') return self.master.__getattribute__(name) rds = MSRedis(REDIS) res = rds.get('name2') # res = rds.set('name2','lisi') print(res)
redis_test.py
-
-
1.7 搭建集群
1.7.1 配置機器1
-
-
- 在演示中,192.168.56.100為當前ubuntu機器的ip
- 在192.168.56.100上進⼊Desktop⽬錄,創建conf⽬錄
- 在conf⽬錄下創建⽂件7000.conf,編輯內容如下
-
port 7000 bind 192.168.56.100 daemonize yes pidfile 7000.pid cluster-enabled yes cluster-config-file 7000_node.conf cluster-node-timeout 15000 appendonly yes
7000.conf
-
-
-
-
- 在conf⽬錄下創建⽂件7001.conf,編輯內容如下
-
port 7001 bind 192.168.56.100 daemonize yes pidfile 7001.pid cluster-enabled yes cluster-config-file 7001_node.conf cluster-node-timeout 15000 appendonly yes
7001.conf
-
- 在conf⽬錄下創建⽂件7001.conf,編輯內容如下
-
-
-
- 在conf⽬錄下創建⽂件7002.conf,編輯內容如下
-
port 7002 bind 192.168.56.100 daemonize yes pidfile 7002.pid cluster-enabled yes cluster-config-file 7002_node.conf cluster-node-timeout 15000 appendonly yes
7002.conf
-
- 在conf⽬錄下創建⽂件7002.conf,編輯內容如下
-
-
-
- 總結:三個⽂件的配置區別在port、pidfile、cluster-config-file三項
- 使⽤配置⽂件啟動redis服務
-
redis-server 7000.conf redis-server 7001.conf redis-server 7002.conf
-
- 查看進程如下圖
-
1.7.2 配置機器2
-
-
- 在演示中,192.168.56.100為當前ubuntu機器的ip
- 在192.168.56.100上進⼊Desktop⽬錄,創建conf⽬錄
-
port 7003 bind 192.168.56.100 daemonize yes pidfile 7003.pid cluster-enabled yes cluster-config-file 7003_node.conf cluster-node-timeout 15000 appendonly yes
7003.con
在conf⽬錄下創建⽂件7003.conf,編輯內容如下
-
-
-
- 在conf⽬錄下創建⽂件7004.conf,編輯內容如下
-
port 7004 bind 192.168.56.100 daemonize yes pidfile 7004.pid cluster-enabled yes cluster-config-file 7004_node.conf cluster-node-timeout 15000 appendonly yes
7004.conf
-
- 在conf⽬錄下創建⽂件7004.conf,編輯內容如下
-
-
-
- 在conf⽬錄下創建⽂件7005.conf,編輯內容如下
-
port 7005 bind 192.168.56.100 daemonize yes pidfile 7005.pid cluster-enabled yes cluster-config-file 7005_node.conf cluster-node-timeout 15000 appendonly yes
7005.conf
-
- 在conf⽬錄下創建⽂件7005.conf,編輯內容如下
-
-
-
- 總結:三個⽂件的配置區別在port、pidfile、cluster-config-file三項
- 使⽤配置⽂件啟動redis服務
-
redis-server 7003.conf redis-server 7004.conf redis-server 7005.conf
-
- 查看進程如下圖
-
1.7.3 創建集群
-
-
- redis的安裝包中包含了redis-trib.rb,⽤於創建集群
- 接下來的操作在192.168.56.100機器上進⾏
- 將命令複製,這樣可以在任何⽬錄下調⽤此命令
-
sudo cp /usr/share/doc/redis-tools/examples/redis-trib.rb /usr/local/bin/
- 安裝ruby環境,因為redis-trib.rb是⽤ruby開發的
-
sudo apt-get install ruby
- 在提示資訊處輸⼊y,然後回⻋繼續安裝
- 運⾏如下命令創建集群
-
redis-trib.rb create --replicas 1 192.168.56.100:7000 192.168.56.100:7001 192.168.56.100:7002 192.168.56.100:7003 192.168.56.100:7004 192.168.56.100:7005
- 執⾏上⾯這個指令在某些機器上可能會報錯,主要原因是由於安裝的 ruby 不是最 新版本!
- 天朝的防⽕牆導致⽆法下載最新版本,所以需要設置 gem 的源
- 解決辦法如下
-
-- 先查看⾃⼰的 gem 源是什麼地址 gem source -l -- 如果是//rubygems.org/ 就需要更換 -- 更換指令為 gem sources --add //gems.ruby-china.com/ --remove //rubygems.org/ -- 通過 gem 安裝 redis 的相關依賴 sudo gem install redis -- 然後重新執⾏指令
-
redis-trib.rb create --replicas 1 192.168.56.100:7000 192.168.56.100:7001 192.168.56.100:7002 192.168.56.100:7003 192.168.56.100:7004 192.168.56.100:7005
- 提示如下主從資訊,輸⼊yes後回⻋
- 提示完成,集群搭建成功
-
1.7.4 數據驗證
-
-
- 根據上圖可以看出,當前搭建的主伺服器為7000、7001、7002,對應的從伺服器是7003、7004、7005
- 在192.168.56.100機器上連接7002,加參數-c表示連接到集群
-
redis-cli -h 172.16.179.131 -c -p 7002
- 寫⼊數據
-
set name itheima
- ⾃動跳到了7003伺服器,並寫⼊數據成功
-
在7003可以獲取數據,如果寫入數據又重定向到7000(負載均衡)
-
1.7.5 在哪個伺服器上寫數據:CRC16
-
-
- redis cluster在設計的時候,就考慮到了去中⼼化,去中間件,也就是說,集群中 的每個節點都是平等的關係,都是對等的,每個節點都保存各⾃的數據和整個集 群的狀態。每個節點都和其他所有節點連接,⽽且這些連接保持活躍,這樣就保 證了我們只需要連接集群中的任意⼀個節點,就可以獲取到其他節點的數據
-
-
-
- Redis集群沒有並使⽤傳統的⼀致性哈希來分配數據,⽽是采⽤另外⼀種叫做哈希 槽 (hash slot)的⽅式來分配的。redis cluster 默認分配了 16384 個slot,當我們 set⼀個key 時,會⽤CRC16演算法來取模得到所屬的slot,然後將這個key 分到哈 希槽區間的節點上,具體演算法就是:CRC16(key) % 16384。所以我們在測試的 時候看到set 和 get 的時候,直接跳轉到了7000端⼝的節點
-
-
-
- Redis 集群會把數據存在⼀個 master 節點,然後在這個 master 和其對應的salve 之間進⾏數據同步。當讀取數據時,也根據⼀致性哈希演算法到對應的 master 節 點獲取數據。只有當⼀個master 掛掉之後,才會啟動⼀個對應的 salve 節點,充 當 master
-
-
-
- 需要注意的是:必須要3個或以上的主節點,否則在創建集群時會失敗,並且當存 活的主節點數⼩於總節點數的⼀半時,整個集群就⽆法提供服務了
-
1.7.6 與python交互
-
-
-
from rediscluster import * if __name__ == '__main__': try: # 構建所有的節點,Redis會使⽤CRC16演算法,將鍵和值寫到某個節點上 startup_nodes = [ {'host': '192.168.56.100', 'port': '7000'}, {'host': '192.168.56.100', 'port': '7001'}, {'host': '192.168.56.100', 'port': '7002'}, {'host': '192.168.56.100', 'port': '7003'}, {'host': '192.168.56.100', 'port': '7004'}, {'host': '192.168.56.100', 'port': '7005'}, ] # 構建StrictRedisCluster對象 src=RedisCluster(startup_nodes=startup_nodes,decode_responses=True) #decode_responses=True 返回的內容自動decode一下 # 設置鍵為name、值為itheima的數據 result=src.set('name','zhangsan') print(result) # 獲取鍵為name name = src.get('name') print(name) except Exception as e: print(e) #1、存儲的位置不需要管 因為它是通過哈希自動分配到一個伺服器上 #2、現在我們開發只是要求高性能 還沒 # 有高可用 崩潰了之後 有崩潰的處理方式 高可用交給運維去做
redis_cluster.py
-
-