1. 程式人生 > >redis進階 redis進階

redis進階 redis進階

redis進階

一、redis介紹

複製程式碼
redis的功能特性
    1、高速讀寫
    2、資料型別豐富
    3、支援持久化
    4、多種記憶體分配及回收策略
    5、支援事務 6、訊息佇列、redis用的多的還是釋出-訂閱模式 7、支援高可用 8、支援分散式分片叢集 linux作業系統是怎麼分配記憶體的? 答:吧記憶體分三大塊。 RSS : page cache: anno page: 程式之間進行互動的時候.....#匿名頁  linux作業系統以page進行分配記憶體,page大小預設4kb slab allocator 記憶體頁的劃分 buddy system :LRU最近最少使用的原則 怎麼保證使用連續的記憶體, slab allocator redis優勢 1、redis在單使用者(單執行緒)多併發讀寫的效能高 2、在多使用者(多執行緒)少讀寫時memache更優 3、redis是一個單核的管理機制,生產中一般是,單機多例項的框架。
複製程式碼

 

二、redis的使用

複製程式碼
下載
安裝
解壓 tar -zxvf redis-3.2.6.tar.gz 
cd redis-2.6.0
make #編譯安裝
yum install gcc*


cd /application/redis-3.2.6/src
./redis-server & #啟動redis服務端 ,&後臺執行,不然一直佔用埠
ps -ef |grep redis #檢視是否啟動
./redis-cli  #連線伺服器
複製程式碼

三、使用redis

複製程式碼
  set foo bar 
    get foo 


    基本的配置檔案
    vim /etc/redis.conf  #去編輯redis.conf檔案

    #新增配置
    daemonize  yes
    port 6379
    dbfilename dump.rdb
    dir "/application/data/6379" 
    logfile /var/log/redis.log
    ######
     mkdir -p /application/data/6379 ps -ef |grep redis ./redis-server /etc/redis.conf /application/redis-3.2.6/src/redis-server /etc/redis.conf #為了不用每次都切進去,在環境變數裡面設定一下 cd /root vim .bash_profile PATh 新增 :/application/redis-3.2.6/src :wq儲存 配置生效 source .bash_profile redis-cli 配置完成之後,可以直接在命令列呼叫redis命令 例如: redis-cli shutdown 或者 redis-server /etc/redis.conf #安全控制(也在配置檔案裡面設定) bind 10.0.0.200 #繫結ip10欄位 requirepass root #沒有使用者只有密碼,密碼為root redis-cli shutdown redis-server /etc/redis.conf 設定完成之後需要換種方式開啟: redis-cli -h 10.0.0.200 -a root #改完配置檔案每次都需要重啟,不用每次都重啟,線上變更配置:  獲取當前配置 CONFIG GET * 變更執行配置 CONFIG SET loglevel 'notice' 修改密碼 CONFIG SET requirepass "123" CONFIG GET requirepass 線上修改的配置,下次登入生效,但是重啟之後配置會丟失 #Python連結redis import redis ....
複製程式碼

四、redis的資料持久化

複製程式碼
  RDB持久化:快照,只記錄一個時刻記憶體資料狀態(快照記錄某一時刻的資料)
    AOF持久化:只追加日誌檔案的方式,記錄了redis裡面所有的修改命令

    RDB記錄某一時刻的,還可以用做備份
    AOF比較安全,但是比較囉嗦,每次都把所有的搜儲存下來了


    #如果配置持久化功能
    方式一:
    RDB 持久化配置:還是修改配置檔案
    dbfilename dump.rbd 
    dir '/application/data/6379'
    save 900 1  900秒內有一個更改
    save 300 10  300秒內有10個更改
    save 60 10000 60秒內有10000個更改 #也可以設定配置做持久化  方式二: set foo bar save 或者 bgsave #手工觸發持久化 #配置擴充套件

    stop-writes-on-bgsave-error yes
    rdbcompression yes
    rdbchecksum yes

    #AOF 配置
    appendonly yes 
    applendfsync every
複製程式碼

五、redis資料型別

複製程式碼
  計數器
       incr fensi ##你點選一下增加一下,刷點選量
       incrby fensi 10000
       DECR fensi #遞減
       DECRBY fensi 20  
    set foo bar 
    set foo ex 10
    
    
    hset stu(表) id(列) 100
    hmset stu id 100 name zhangsna lpush pengyouquan 'today is nice day' lpush pengyouquan 'today is bad day' lpush pengyouquan 'today is a day' lpop pengyouquan #刪除最後一條 lrange pengyouquan 0 -1 #檢視所有  有序集合:像是排行榜
複製程式碼

六、釋出訂閱模式

複製程式碼
  釋出訂閱模式(中間橋樑:頻道):朋友圈是很好的證明。先關注你就能看到
    開兩個埠 
    PUBLISH weibo hello 先訂閱某個頻道
    SUBSCRIBE weibo  訂閱weibo一個頻道,subscribe 
    
    PSUBSCRIBE * 一次性訂閱多個頻道(廣告類)
    PSUBSCRIBE it.* 一次性訂閱多個和it相關的頻道
    退出就取消訂閱了
複製程式碼

七、redis的事務管理

redis使用multi開啟事物
    discard  撤銷
    exec UI出
    redis 中的鎖機制
        mysql的悲觀鎖:我在做操作的時候,你別和我搶,
        redis的樂觀鎖:檢視一下,

八、redis的一些管理命令

複製程式碼
  Info
    Clinet list 客戶端連線的狀況以及對系統的使用情況
    Client kill ip:port
    config get *
    CONFIG RESETSTAT 重置統計
    CONFIG GET/SET 動態修改
    Dbsize
    FLUSHALL 清空所有資料
    select 1
    FLUSHDB 清空當前庫
    MONITOR 監控實時指令
複製程式碼

九、主從複製 

複製程式碼
假如說你訪問redis呢,訪問不了呢,資料檢視不了了,怎麼辦?    
        我們要做到一個恢復的功能,所以就有了主從複製的功能
        假如說一個機器廢了,還有另一個機器能提供資料
        至少要有兩臺伺服器
    主從複製的兩種功能
        1、可以實現故障的轉移 failover 
        2、可以分擔多節點的壓力 blance
    底層原理依賴於
        同步傳輸rbd儲存的機制
    怎麼搭建主從?
        準備2臺或以上的redis例項
            1、多配置檔案(埠、資料路徑、日誌路徑、pid)
               埠、:6380(主),6381(從)
               資料路徑:
                    /application/data/6380
                    /application/data/6381 日誌路徑 /var/log/redis6380.log /var/log/redis6381.log pid :記錄一個程式程序號的id /application/data/6380/redis.pid /application/data/6381/redis.pid 2、主從複製的配置過程 1、建立目錄 mkdir -p /application/data/6380 mkdir -p /application/data/6381 2、配置檔案準備 vim /application/data/6380/redis.conf port 6380 daemonize yes pidfile /application/data/6380/redis.pid logfile "/var/log/redis6380.log" dbfilename dump.rdb dir /application/data/6380 vim /application/data/6381/redis.conf port 6381 daemonize yes pidfile /application/data/6381/redis.pid logfile "/var/log/redis6381.log" dbfilename dump.rdb dir /application/data/6381 3、啟動兩個例項 redis-server /application/data/6380/redis.conf redis-server /application/data/6381/redis.conf 4、構建主從 redis-cli -p 6381 slaveof 127.0.0.1 6380 5、驗證主從 登入主庫: redis-cli -p 6380 set foo bar 登入主庫: redis-cli -p 6381 get 6、主從複製狀態檢視。 role info replication 7、主從複製,手工切換 slaveof no one 傳統主從的缺陷 1、沒有自動監控機制 2、沒有自動切換的功能 3、對於應用不透明 sentinel 功能 1、自動監控redis所有節點狀態 2、發現主庫故障,自動選主切換 3、自動通知應用端 準備,1主2從結構比較合適。 新增6382節點: mkdir -p /application/data/6382 vim /application/data/6382/redis.conf port 6382 daemonize yes pidfile /application/data/6382/redis.pid logfile "/var/log/redis6382.log" dbfilename dump.rdb dir /application/data/6382 redis-server /application/data/6382/redis.conf redis-cli -p 6382 slaveof 127.0.0.1 6380 sentinel配置 mkdir -p /application/data/26380 vim /application/data/26380/sentinel.conf port 26380 dir "/application/data/26380" sentinel monitor mymaster 127.0.0.1 6380 1 sentinel down-after-milliseconds mymaster 60000 sentinel config-epoch mymaster 0 啟動 redis-sentinel /application/data/26380/sentinel.conf
複製程式碼

十、Python sentinel

複製程式碼
>>> from redis.sentinel import Sentinel  
>>> sentinel = Sentinel([('127.0.0.1', 26380)], socket_timeout=0.1)  
>>> sentinel.discover_master('mymaster')  
('127.0.0.1', 6379)  
>>> sentinel.discover_slaves('mymaster')  
[('127.0.0.1', 6380)] >>> master = sentinel.master_for('mymaster', socket_timeout=0.1) >>> slave = sentinel.slave_for('mymaster', socket_timeout=0.1) >>> master.set('foo', 'bar') >>> slave.get('foo') 'bar'
複製程式碼

 

一、redis介紹

複製程式碼
redis的功能特性
    1、高速讀寫
    2、資料型別豐富
    3、支援持久化
    4、多種記憶體分配及回收策略
    5、支援事務 6、訊息佇列、redis用的多的還是釋出-訂閱模式 7、支援高可用 8、支援分散式分片叢集 linux作業系統是怎麼分配記憶體的? 答:吧記憶體分三大塊。 RSS : page cache: anno page: 程式之間進行互動的時候.....#匿名頁  linux作業系統以page進行分配記憶體,page大小預設4kb slab allocator 記憶體頁的劃分 buddy system :LRU最近最少使用的原則 怎麼保證使用連續的記憶體, slab allocator redis優勢 1、redis在單使用者(單執行緒)多併發讀寫的效能高 2、在多使用者(多執行緒)少讀寫時memache更優 3、redis是一個單核的管理機制,生產中一般是,單機多例項的框架。
複製程式碼

 

二、redis的使用

複製程式碼
下載
安裝
解壓 tar -zxvf redis-3.2.6.tar.gz 
cd redis-2.6.0
make #編譯安裝
yum install gcc*


cd /application/redis-3.2.6/src
./redis-server & #啟動redis服務端 ,&後臺執行,不然一直佔用埠
ps -ef |grep redis #檢視是否啟動
./redis-cli  #連線伺服器
複製程式碼

三、使用redis

複製程式碼
  set foo bar 
    get foo 


    基本的配置檔案
    vim /etc/redis.conf  #去編輯redis.conf檔案

    #新增配置
    daemonize  yes
    port 6379
    dbfilename dump.rdb
    dir "/application/data/6379" 
    logfile /var/log/redis.log
    ######
     mkdir -p /application/data/6379 ps -ef |grep redis ./redis-server /etc/redis.conf /application/redis-3.2.6/src/redis-server /etc/redis.conf #為了不用每次都切進去,在環境變數裡面設定一下 cd /root vim .bash_profile PATh 新增 :/application/redis-3.2.6/src :wq儲存 配置生效 source .bash_profile redis-cli 配置完成之後,可以直接在命令列呼叫redis命令 例如: redis-cli shutdown 或者 redis-server /etc/redis.conf #安全控制(也在配置檔案裡面設定) bind 10.0.0.200 #繫結ip10欄位 requirepass root #沒有使用者只有密碼,密碼為root redis-cli shutdown redis-server /etc/redis.conf 設定完成之後需要換種方式開啟: redis-cli -h 10.0.0.200 -a root #改完配置檔案每次都需要重啟,不用每次都重啟,線上變更配置:  獲取當前配置 CONFIG GET * 變更執行配置 CONFIG SET loglevel 'notice' 修改密碼 CONFIG SET requirepass "123" CONFIG GET requirepass 線上修改的配置,下次登入生效,但是重啟之後配置會丟失 #Python連結redis import redis ....
複製程式碼

四、redis的資料持久化

複製程式碼
  RDB持久化:快照,只記錄一個時刻記憶體資料狀態(快照記錄某一時刻的資料)
    AOF持久化:只追加日誌檔案的方式,記錄了redis裡面所有的修改命令

    RDB記錄某一時刻的,還可以用做備份
    AOF比較安全,但是比較囉嗦,每次都把所有的搜儲存下來了


    #如果配置持久化功能
    方式一:
    RDB 持久化配置:還是修改配置檔案
    dbfilename dump.rbd 
    dir '/application/data/6379'
    save 900 1  900秒內有一個更改
    save 300 10  300秒內有10個更改
    save 60 10000 60秒內有10000個更改 #也可以設定配置做持久化  方式二: set foo bar save 或者 bgsave #手工觸發持久化 #配置擴充套件

    stop-writes-on-bgsave-error yes
    rdbcompression yes
    rdbchecksum yes

    #AOF 配置
    appendonly yes 
    applendfsync every
複製程式碼

五、redis資料型別

複製程式碼
  計數器
       incr fensi ##你點選一下增加一下,刷點選量
       incrby fensi 10000
       DECR fensi #遞減
       DECRBY fensi 20  
    set foo bar 
    set foo ex 10
    
    
    hset stu(表) id(列) 100
    hmset stu id 100 name zhangsna lpush pengyouquan 'today is nice day' lpush pengyouquan 'today is bad day' lpush pengyouquan 'today is a day' lpop pengyouquan #刪除最後一條 lrange pengyouquan 0 -1 #檢視所有  有序集合:像是排行榜
複製程式碼

六、釋出訂閱模式

複製程式碼
  釋出訂閱模式(中間橋樑:頻道):朋友圈是很好的證明。先關注你就能看到
    開兩個埠 
    PUBLISH weibo hello 先訂閱某個頻道
    SUBSCRIBE weibo  訂閱weibo一個頻道,subscribe 
    
    PSUBSCRIBE * 一次性訂閱多個頻道(廣告類)
    PSUBSCRIBE it.* 一次性訂閱多個和it相關的頻道
    退出就取消訂閱了
複製程式碼

七、redis的事務管理

redis使用multi開啟事物
    discard  撤銷
    exec UI出
    redis 中的鎖機制
        mysql的悲觀鎖:我在做操作的時候,你別和我搶,
        redis的樂觀鎖:檢視一下,

八、redis的一些管理命令

複製程式碼
  Info
    Clinet list 客戶端連線的狀況以及對系統的使用情況
    Client kill ip:port
    config get *
    CONFIG RESETSTAT 重置統計
    CONFIG GET/SET 動態修改
    Dbsize
    FLUSHALL 清空所有資料
    select 1
    FLUSHDB 清空當前庫
    MONITOR 監控實時指令
複製程式碼

九、主從複製 

複製程式碼
假如說你訪問redis呢,訪問不了呢,資料檢視不了了,怎麼辦?    
        我們要做到一個恢復的功能,所以就有了主從複製的功能
        假如說一個機器廢了,還有另一個機器能提供資料
        至少要有兩臺伺服器
    主從複製的兩種功能
        1、可以實現故障的轉移 failover 
        2、可以分擔多節點的壓力 blance
    底層原理依賴於
        同步傳輸rbd儲存的機制
    怎麼搭建主從?
        準備2臺或以上的redis例項
            1、多配置檔案(埠、資料路徑、日誌路徑、pid)
               埠、:6380(主),6381(從)
               資料路徑:
                    /application/data/6380
                    /application/data/6381 日誌路徑 /var/log/redis6380.log /var/log/redis6381.log pid :記錄一個程式程序號的id /application/data/6380/redis.pid /application/data/6381/redis.pid 2、主從複製的配置過程 1、建立目錄 mkdir -p /application/data/6380 mkdir -p /application/data/6381 2、配置檔案準備 vim /application/data/6380/redis.conf port 6380 daemonize yes pidfile /application/data/6380/redis.pid logfile "/var/log/redis6380.log" dbfilename dump.rdb dir /application/data/6380 vim /application/data/6381/redis.conf port 6381 daemonize yes pidfile /application/data/6381/redis.pid logfile "/var/log/redis6381.log" dbfilename dump.rdb dir /application/data/6381 3、啟動兩個例項 redis-server /application/data/6380/redis.conf redis-server /application/data/6381/redis.conf 4、構建主從 redis-cli -p 6381 slaveof 127.0.0.1 6380 5、驗證主從 登入主庫: redis-cli -p 6380 set foo bar 登入主庫: redis-cli -p 6381 get 6、主從複製狀態檢視。 role info replication 7、主從複製,手工切換 slaveof no one 傳統主從的缺陷 1、沒有自動監控機制 2、沒有自動切換的功能 3、對於應用不透明 sentinel 功能 1、自動監控redis所有節點狀態 2、發現主庫故障,自動選主切換 3、自動通知應用端 準備,1主2從結構比較合適。 新增6382節點: mkdir -p /application/data/6382 vim /application/data/6382/redis.conf port 6382 daemonize yes pidfile /application/data/6382/redis.pid logfile "/var/log/redis6382.log" dbfilename dump.rdb dir /application/data/6382 redis-server /application/data/6382/redis.conf redis-cli -p 6382 slaveof 127.0.0.1 6380 sentinel配置 mkdir -p /application/data/26380 vim /application/data/26380/sentinel.conf port 26380 dir "/application/data/26380" sentinel monitor mymaster 127.0.0.1 6380 1 sentinel down-after-milliseconds mymaster 60000 sentinel config-epoch mymaster 0 啟動 redis-sentinel /application/data/26380/sentinel.conf
複製程式碼

十、Python sentinel

複製程式碼
>>> from redis.sentinel import Sentinel  
>>> sentinel = Sentinel([('127.0.0.1', 26380)], socket_timeout=0.1)  
>>> sentinel.discover_master('mymaster')  
('127.0.0.1', 6379)  
>>> sentinel.discover_slaves('mymaster')  
[('127.0.0.1', 6380)] >>> master = sentinel.master_for('mymaster', socket_timeout=0.1) >>> slave = sentinel.slave_for('mymaster', socket_timeout=0.1) >>> master.set('foo', 'bar') >>> slave.get('foo') 'bar'
複製程式碼