Redis--部署操做

1.Redis

1.1 安裝

    wget http://download.redis.io/releases/redis-x.x.x.tar.gzhtml

    

  • step2:解壓

    tar xzf redis-x.x.x.tar.gznode

  • step3:移動,放到usr/local⽬錄下

    sudo mv ./redis-x.x.x /usr/local/redis/python

  • step4:進⼊redis⽬錄

    cd /usr/local/redis/git

  • step5:生成

    sudo makegithub

    

 

  • step6:測試,這段運⾏時間會較⻓

    sudo make test正則表達式

    

 

  • step7:安裝,將redis的命令安裝到/usr/local/bin/⽬錄

    sudo make installredis

  • step8:安裝完成後,咱們進入目錄/usr/local/bin中查看

    cd /usr/local/bin算法

    ls -all數據庫

    

    redis-server redis服務器ubuntu

    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

 

 

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 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種方式https://github.com/andymccurdy/redis-py

  • 第一種:進⼊虛擬環境,聯⽹安裝包redis
    • pip install redis
  • 第二種:進⼊虛擬環境,聯⽹安裝包redis
    • easy_install redis
  • 第三種:到中⽂官⽹-客戶端下載redis包的源碼,使⽤源碼安裝

  調用模塊

  • 引⼊模塊
    • 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
          六、ttl
          keys
        • 1、set
          2、setex
          3、mset
          4、append
          5、get
          6、mget
          七、key
          string
        • 1、hset
          2、hmset
          3、hkeys
          4、hget
          5、hmget
          6、hvals
          七、hdel
          hash
        • 1、lpush
          2、rpush
          3、linsert
          4、lrange
          5、lset
          六、lrem
          list
        • 1、sadd
          2、smembers
          三、srem
          set
        • 1、zadd
          2、zrange
          3、zrangebyscore
          4、zscore
          5、zrem
          六、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

 

      • 修改/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⽬錄下建立⽂件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
      • 總結:三個⽂件的配置區別在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⽬錄下建立⽂件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
      • 總結:三個⽂件的配置區別在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、700一、7002,對應的從服務器是700三、700四、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)
        
        
        #一、存儲的位置不須要管 由於它是經過哈希自動分配到一個服務器上
        #二、如今咱們開發只是要求高性能 還沒
        # 有高可用 崩潰了以後 有崩潰的處理方式 高可用交給運維去作
        redis_cluster.py
相關文章
相關標籤/搜索