1.Redis
1.1 安裝
- 當前ubuntu虛擬機中已經安裝好了redis,以下步驟可以跳過
- 以后自己安裝程序如下:redis下載鏈接:x 指的是版本號 http://download.redis.io/releases/redis-x.x.x.tar.gz
- step1:下載
wget http://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:https://brew.sh/
使用 brew 安裝 Redis:https://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
- 參考資料
- redis配置資訊http://blog.csdn.net/ljphilp/article/details/52934933
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鍵命令
string
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 stoplist
set型別 1)?序集合 2)元素為string型別 3)元素具有唯?性,不重復 4)說明:對于集合沒有修改操作 1、增加 1)添加元素:sadd key member1 member2 ... 2、獲取 1)回傳所有的元素:smembers key 3、洗掉 1)洗掉指定元素:srem key valuesset
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 maxzset
1.5 與python互動
安裝包
安裝Redis的有3種方式https://github.com/andymccurdy/redis-py
- 第一種:進?虛擬環境,聯?安裝包redis
- pip install redis
- 第二種:進?虛擬環境,聯?安裝包redis
- easy_install redis
- 第三種:到中?官?-客戶端下載redis包的原始碼,使?原始碼安裝
- 一步步執行 wget https://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?錄 在conf?錄下創建?件7003.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?錄下創建?件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 -- 如果是https://rubygems.org/ 就需要更換 -- 更換指令為 gem sources --add https://gems.ruby-china.com/ --remove https://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=https://www.cnblogs.com/laowang-wbh/archive/2021/01/04/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
-
-
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/244584.html
標籤:其他
上一篇:REDIS簡單動態字串


