瞭解redis及簡單使用


1.操做系統內存劃分:
    a.早期Windows內存分配:
        內存以page爲單位,默認的page大小是4kB,按page來分的,一個page只能爲一個程序服務
        三大類:
            程序所在空間--->RSS(常駐內存集)
            文件所在空間--->page cache(頁緩存)
            匿名頁
            
    b.問題
        內存碎片:對不一樣內存的需求,會產生內存碎片
        尋址:尋找空閒頁
            早期是使用便利全部內存頁的方式來尋找內存區域,這種方式是低效的
    
    c.兩大機制:
        ①.buddy system:內存管理子系統,回收內存碎片,清理內存(使一共LRU算法清理)
        ②.slab allocator
    
    
2.redis(大型集羣)
    下載:redis.io   官網
        版本:發佈版6個月以上
    
    centos7 安裝:
        yum install redis
        
        開啓服務:redis-server &
    
    啓動: src/redis-server &(&後臺運行)  
        後臺啓動:
            設置遠程訪問:
                bind  0.0.0.0
            設置在後臺運行redis,打開redis.conf,把daemonize設置爲yes
                daemonize  yes
        
        啓動命令:/usr/bin/redis-server /etc/redis.conf
        關閉命令:redis-cli shutdown
        
    
    客戶端鏈接測試:
        src/redis-cli
        set foo bar
        get foo
    
    特色:
        高速讀寫
        數據類型豐富*
        數據持久化*
        內存分配回收策略
        事務
        消息隊列,消息訂閱*
        高可用
        分佈式集羣
    
    定製配置文件
        
        vim /etc/redis.conf
    
        是否後臺運行: daemonize yes
        
        默認端口: port 6379
        
        日誌文件位置 logfile /data/6379/redis.log
        
        RDB持久化數據文件: dbfilename dump.rdb
        
        持久化數據文件指定路徑:dir /data/6379
    
    關閉:
        src/redis-cli
        shutdownnode

  

 



    配置環境變量
    
        cd /root/
        vim .bash_profile
        export PATH=$PATH:/root/redis-3.2.10/src
        source .bash_profile
    
    redis 開啓密碼驗證
        vim /etc/redis.conf
        添加:
            requirepass 123456
    
        關閉:
            redis-cli
        
            shutdown
            exit
        
        重啓redis
            redis-server /etc/redis.conf(加上配置文件)
    
    登陸:
        方法一:
            redis-cli -a 123456
        方法二:
            redis-cli
            auth 123456
    
    在線更改配置:
        只在當前啓動時生效,重啓會讀取配置文件後不生效
        CONFIG set requirepass 123
        
三、redis持久化(***)
    一、RDB:企業中通常使用此方式
        鏡像方式持久化,保存一個時間點的內存數據狀態
        一、不是實時的持久化,一段時間作一次內存鏡像到磁盤
        二、覆蓋形式的持久化方式
        三、通常這種方式的持久化用來作備份
        四、持久化的數據可能不是完整的
        
        人工觸發持久化:
            save
            
        開啓持久化:
            dbfilename dump.rdb
            dir /data/6379
            
            配置:自動save
                save 900 1
                save 300 1
                save 60 10000
                
            配置分別表示:
                • 900 秒( 15 分鐘)內有 1 個更改
                • 300 秒( 5 分鐘)內有 10 個更改
                • 60 秒內有 10000 個更改
                當達到以上定義的配置時間時,就將內存數據持久化到磁盤

    二、AOF:append only file(只追加文件)
        對於安全性要求高的選擇這個
        記錄Redis的每一條修改操做,到持久化文件中
        一、能夠是一個實時的持久化方式
        二、追加形式持久化
        三、持久化的數據多是完整的
        
        開啓持久化:
            appendonly no/yes:是否打開 aof 日誌功能
            appendfsync always:redis中有一個變化,就當即持久化一次,最安全的一種方式。
            appendfsync everysec:每秒鐘,持久化一次。性能較高可是有可能丟失1秒的數據。
            appendfsync no:至關於不開啓。
        
四、數據類型(詳見pdf的29頁)
    • String:字符串數據類型
        key:value
    
    • Hash:哈希數據類型()經常使用,用做對象存儲,好比將mysql相關的表存儲到redis中
        key  id:1 name:xx age:19
        
        表:表名:key
        F1      F2       F3     列
        id      name     age
        1        xx       19
        
    • List :列表
    
    • Set:集合
    
    • Sorted set:有序集合
        
五、全局Key操做
    • KEYS *     查看KEY支持通配符
    • DEL     刪除給定的一個或多個key
    • EXISTS     檢查是否存在
    • RENAME     變動KEY名
    • SORT     鍵值排序,有非數字時報錯
    • TYPE     返回鍵所存儲值的類型
    • DUMP     RESTORE 序例化與反序列化
    • EXPIRE\ PEXPIRE    以秒\微秒設定生存時間
    • TTL\ PTTL     以秒\微秒爲單位返回生存時間
    • PERSIST     取消生存實現設置
    • RANDOMKEY     返回數據庫中的任意鍵

六、相應數據類型的操做
    Str:  常規計數應用
        
        set
        get
        incr
        decr
        incrby
        decrby
        mset
        mget
        
        
        ——————————————————————————————
        增
        set mykey "test"               爲鍵設置新值,並覆蓋原有值
        getset mycounter 0               設置值,取值同時進行
        setex mykey 10 "hello"          設置指定 Key 的過時時間爲10秒,在存活時間能夠獲取value
        setnx mykey "hello"               若該鍵不存在,則爲鍵設置新值
        mset key3  "zyx"  key4 "xyz"      批量設置鍵
        
        刪
        del mykey                      刪除已有鍵
        改
        append mykey "hello"              若該鍵並不存在,返回當前 Value 的長度
                                      該鍵已經存在,返回追加後 Value的長度
        incr mykey                   值增長1,若該key不存在,建立key,初始值設爲0,增長後結果爲1
        decrby  mykey  5               值減小5
        setrange mykey 20 dd              把第21和22個字節,替換爲dd, 超過value長度,自動補0
        
        查  
        exists mykey                     判斷該鍵是否存在,存在返回 1,不然返回0
        get mykey                    獲取Key對應的value
        strlen mykey                  獲取指定 Key 的字符長度
        ttl mykey                     查看一下指定 Key 的剩餘存活時間(秒數)
        getrange mykey 1 20              獲取第2到第20個字節,若20超過value長度,則截取第2個和後面全部的
        mget key3 key4                   批量獲取鍵
        ---------------------
    
    hash(字典):用做對象存儲,好比須要將mysql相關的表存儲到redis中。
        
        hmset
        
        hgetall
        
        
        
        ——————————————————————————————————
        增
        hset myhash field1 "s"    
        若字段field1不存在,建立該鍵及與其關聯的Hashes, Hashes中,key爲field1 ,並設value爲s ,若存在會覆蓋原value
        hsetnx myhash field1 s    
        若字段field1不存在,建立該鍵及與其關聯的Hashes, Hashes中,key爲field1 ,並設value爲s, 若字段field1存在,則無效
        hmset myhash field1 "hello" field2 "world       一次性設置多個字段
        刪
        hdel myhash field1                       刪除 myhash 鍵中字段名爲 field1 的字段
        del myhash                              刪除鍵
        改  
        hincrby myhash field 1                  給field的值加1
        
        查
        hget myhash field1                       獲取鍵值爲 myhash,字段爲 field1 的值
        hlen myhash                               獲取myhash鍵的字段數量
        hexists myhash field1                     判斷 myhash 鍵中是否存在字段名爲 field1 的字段
        hmget myhash field1 field2 field3          一次性獲取多個字段
        hgetall myhash                           返回 myhash 鍵的全部字段及其值
        hkeys myhash                              獲取myhash 鍵中全部字段的名字
        hvals myhash                               獲取 myhash 鍵中全部字段的值
        ——————————————————————————————————————————————————————————————————————
    
    LIST(列表)
        應用場景
        消息隊列系統
        好比sina微博:
        在Redis中咱們的最新微博ID使用了常駐緩存,這是一直更新的。但
        是作了限制不能超過5000個ID,所以獲取ID的函數會一直詢問Redis。
        只有在start/count參數超出了這個範圍的時候,才須要去訪問數據庫。
        系統不會像傳統方式那樣「刷新」緩存,Redis實例中的信息永遠是一致的。
        SQL數據庫(或是硬盤上的其餘類型數據庫)只是在用戶須要獲取「很遠」的數據時纔會被觸發,
        而主頁或第一個評論頁是不會麻煩到硬盤上的數據庫了。
        
        -------------------
        增
        lpush mykey a b              若key不存在,建立該鍵及與其關聯的List,依次插入a ,b, 若List類型的key存在,則插入value中
        lpushx mykey2 e              若key不存在,此命令無效, 若key存在,則插入value中
        linsert mykey before a a1      在 a 的前面插入新元素 a1
        linsert mykey after e e2       在e 的後面插入新元素 e2
        rpush mykey a b             在鏈表尾部先插入b,在插入a
        rpushx mykey e              若key存在,在尾部插入e, 若key不存在,則無效
        rpoplpush mykey mykey2       將mykey的尾部元素彈出,再插入到mykey2 的頭部(原子性的操做)
        刪
        del mykey                      刪除已有鍵
        lrem mykey 2 a               從頭部開始找,按前後順序,值爲a的元素,刪除數量爲2個,若存在第3個,則不刪除
        改
        ltrim mykey 0 2              從頭開始,索引爲0,1,2的3個元素,其他所有刪除
        
        lset mykey 1 e               從頭開始, 將索引爲1的元素值,設置爲新值 e,若索引越界,則返回錯誤信息
        rpoplpush mykey mykey          將 mykey 中的尾部元素移到其頭部
        查
        lrange mykey 0 -1          取鏈表中的所有元素,其中0表示第一個元素,-1表示最後一個元素。
        lrange mykey 0 2            從頭開始,取索引爲0,1,2的元素
        lrange mykey 0 0            從頭開始,取第一個元素,從第0個開始,到第0個結束
        lpop mykey                  獲取頭部元素,而且彈出頭部元素,出棧
        lindex mykey 6              從頭開始,獲取索引爲6的元素 若下標越界,則返回nil
        --------------------------
    SET(集合)
    
        應用場景:
        案例:?
        在微博應用中,能夠將一個用戶全部的關注人存在一個集合中,將其全部粉絲存在一個集合。
        Redis還爲集合提供了求交集、並集、差集等操做,能夠很是方便的實現如共同關注、共同喜愛、二度好友等功能,
        對上面的全部集合操做,你還可使用不一樣的命令選擇將結果返回給客戶端仍是存集到一個新的集合中。
        
        
        sadd
        
        smembers
        
        sdiff[store]
        
        SINTER[store]
        
        sunion[store]
        
        -----------------
        增
        sadd myset a b c  
        若key不存在,建立該鍵及與其關聯的set,依次插入a ,b,若key存在,則插入value中,若a 在myset中已經存在,則插入了 d 和 e 兩個新成員。
        刪
        spop myset              尾部的b被移出,事實上b並非以前插入的第一個或最後一個成員
        srem myset a d f          若f不存在, 移出 a、d ,並返回2
        改
        smove myset myset2 a        將a從 myset 移到 myset2,
        查
        sismember myset a            判斷 a 是否已經存在,返回值爲 1 表示存在。
        smembers myset            查看set中的內容
        scard myset                獲取Set 集合中元素的數量
        srandmember myset          隨機的返回某一成員
        sdiff myset1 myset2 myset3      1和2獲得一個結果,拿這個集合和3比較,得到每一個獨有的值
        sdiffstore diffkey myset myset2 myset3      3個集和比較,獲取獨有的元素,並存入diffkey 關聯的Set中
        sinter myset myset2 myset3               得到3個集合中都有的元素
        sinterstore interkey myset myset2 myset3  把交集存入interkey 關聯的Set中
        sunion myset myset2 myset3               獲取3個集合中的成員的並集
        sunionstore unionkey myset myset2 myset3  把並集存入unionkey 關聯的Set中
        ------------------
    sort set:有序集合
    
        應用場景:
        排行榜應用,取TOP N操做?
        這個需求與上面需求的不一樣之處在於,前面操做以時間爲權重,這個是以某個條件爲權重,
        好比按頂的次數排序,這時候就須要咱們的sorted set出馬了,將你要排序的值設置成sorted set的score,
        將具體的數據設置成相應的value,每次只須要執行一條ZADD命令便可。
        
        zadd salary 10000 alex 20000 wusir
        zrange salary  0 -1 WITHSCORES
        ZREVRANGE salary 0 999 withscores
        
        
        
        
        --------------
        增
        zadd myzset 2 "two" 3 "three"           添加兩個分數分別是 2 和 3 的兩個成員
        刪
        zrem myzset one two                  刪除多個成員變量,返回刪除的數量
        改
        zincrby myzset 2 one                  將成員 one 的分數增長 2,並返回該成員更新後的分數
        查
        zrange myzset 0 -1 WITHSCORES          返回全部成員和分數,不加WITHSCORES,只返回成員
        zrank myzset one                   獲取成員one在Sorted-Set中的位置索引值。0表示第一個位置
        zcard myzset                        獲取 myzset 鍵中成員的數量
        zcount myzset 1 2                   獲取分數知足表達式 1 <= score <= 2 的成員的數量
        zscore myzset three                  獲取成員 three 的分數
        zrangebyscore myzset  1 2               獲取分數知足表達式 1 < score <= 2 的成員
        #-inf 表示第一個成員,+inf最後一個成員
        #limit限制關鍵字
        #2  3  是索引號
        zrangebyscore myzset -inf +inf limit 2 3  返回索引是2和3的成員
        zremrangebyscore myzset 1 2           刪除分數 1<= score <= 2 的成員,並返回實際刪除的數量
        zremrangebyrank myzset 0 1              刪除位置索引知足表達式 0 <= rank <= 1 的成員
        zrevrange myzset 0 -1 WITHSCORES           按位置索引從高到低,獲取全部成員和分數
        #原始成員:位置索引從小到大
              one  0  
              two  1
        #執行順序:把索引反轉
              位置索引:從大到小
              one 1
              two 0
        #輸出結果: two  
               one
        zrevrange myzset 1 3                  獲取位置索引,爲1,2,3的成員
        #相反的順序:從高到低的順序
        zrevrangebyscore myzset 3 0              獲取分數 3>=score>=0的成員並以相反的順序輸出
        zrevrangebyscore myzset 4 0 limit 1 2      獲取索引是1和2的成員,並反轉位置索引
        -----------
七、主從複製
    原理:基於RDB持久化的特性,但不是非得開啓持久化才能使用,從庫會實時去主庫請求RDB快照文件
    
    搭建過程:
        一、準備節點(或多redis實例)
            mkdir -p /data/638{0,1,2}
            
            
            ---------------------------
            vim /data/6380/redis.conf
            
            port 6380
            daemonize yes
            pidfile /data/6380/redis.pid
            loglevel notice
            logfile "/data/6380/redis.log"
            dbfilename dump.rdb
            dir /data/6380
            
            ------------------------------
            vim /data/6381/redis.conf
            
            port 6381
            daemonize yes
            pidfile /data/6381/redis.pid
            loglevel notice
            logfile "/data/6381/redis.log"
            dbfilename dump.rdb
            dir /data/6381
            ----------------------
            vim /data/6382/redis.conf
            
            port 6382
            daemonize yes
            pidfile /data/6382/redis.pid
            loglevel notice
            logfile "/data/6382/redis.log"
            dbfilename dump.rdb
            dir /data/6382
            
            啓動:
            redis-server /data/6380/redis.conf
            redis-server /data/6381/redis.conf
            redis-server /data/6382/redis.conf
    
        查看啓動狀態:netstat -lnp|grep 638
    二、開啓主從:
        分別6381/6382命令行:
        
        redis-cli -p 6381
        SLAVEOF 127.0.0.1 6380
        
        
        
        redis-cli -p 6382
        SLAVEOF 127.0.0.1 6380
    
        info replication   :查看信息
        slaveof no one  :設爲主庫
    三、Sentinel 是一個監視器,它能夠根據被監視實例的身份和狀態來判斷應該執 行何種動做
        一、監控全部的節點redis狀態
        二、自動選擇新的主庫,並切換(slaveof no one)
        三、剩餘從庫,和新主庫開啓主從複製,(SLAVEOF 127.0.0.1 6381)
        四、通知客戶端程序,工做節點發生變化了
    
        配置:
            mkdir /data/26380
            
            cd /data/26380
            
            vim /data/26380/sentinel.conf
            
            配置文件添加如下內容:
            port 26380
            dir "/tmp"
            sentinel monitor mymaster 127.0.0.1 6380 1
            sentinel down-after-milliseconds mymaster 60000
            sentinel config-epoch mymaster 0
        
        啓動
            redis-sentinel /data/26380/sentinel.conf &
        
八、Redis Cluster
    EPEL源安裝ruby支持
        yum install ruby rubygems -y
        gem sources -a http://mirrors.aliyun.com/rubygems/
    
        gem sources  --remove http://rubygems.org/
    
        gem sources -l
    安裝:
        gem install redis -v 3.3.3

    準備節點:
        ----------------------
         mkdir -p /data/700{0,1,2,3,4,5}
        
        ---------------------------
        vim /data/7000/redis.conf
        
        port 7000
        daemonize yes
        pidfile /data/7000/redis.pid
        loglevel notice
        logfile "/data/7000/redis.log"
        dbfilename dump.rdb
        dir /data/7000
        cluster-enabled yes
        cluster-config-file nodes.conf
        cluster-node-timeout 5000
        appendonly yes
        
        ------------------------------
        vim /data/7001/redis.conf
        
        port 7001
        daemonize yes
        pidfile /data/7001/redis.pid
        loglevel notice
        logfile "/data/7001/redis.log"
        dbfilename dump.rdb
        dir /data/7001
        cluster-enabled yes
        cluster-config-file nodes.conf
        cluster-node-timeout 5000
        appendonly yes
        ----------------------
        vim /data/7002/redis.conf
        
        port 7002
        daemonize yes
        pidfile /data/7002/redis.pid
        loglevel notice
        logfile "/data/7002/redis.log"
        dbfilename dump.rdb
        dir /data/7002
        cluster-enabled yes
        cluster-config-file nodes.conf
        cluster-node-timeout 5000
        appendonly yes
        ---------------------------
        vim /data/7003/redis.conf
        
        port 7003
        daemonize yes
        pidfile /data/7003/redis.pid
        loglevel notice
        logfile "/data/7003/redis.log"
        dbfilename dump.rdb
        dir /data/7003
        cluster-enabled yes
        cluster-config-file nodes.conf
        cluster-node-timeout 5000
        appendonly yes
        
        ------------------------------
        vim /data/7004/redis.conf
        
        port 7004
        daemonize yes
        pidfile /data/7004/redis.pid
        loglevel notice
        logfile "/data/7004/redis.log"
        dbfilename dump.rdb
        dir /data/7004
        cluster-enabled yes
        cluster-config-file nodes.conf
        cluster-node-timeout 5000
        appendonly yes
        ----------------------
        vim /data/7005/redis.conf
        
        port 7005
        daemonize yes
        pidfile /data/7005/redis.pid
        loglevel notice
        logfile "/data/7005/redis.log"
        dbfilename dump.rdb
        dir /data/7005
        cluster-enabled yes
        cluster-config-file nodes.conf
        cluster-node-timeout 5000
        appendonly yes
        
        
        啓動:
        redis-server /data/7000/redis.conf
        redis-server /data/7001/redis.conf
        redis-server /data/7002/redis.conf
        redis-server /data/7003/redis.conf
        redis-server /data/7004/redis.conf
        redis-server /data/7005/redis.conf
        
    啓動集羣:
        redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005


python

Redis常見問題:
    1.什麼是redis?
       Redis 是一個基於內存的高性能key-value數據庫。支持python的四種數據類型
    2.使用redis有哪些好處?
        (1) 速度快,由於數據存在內存中
        (2) 支持豐富數據類型,支持string,list,set,sorted set,hash
        (3) 支持事務,操做都是原子性,所謂的原子性就是對數據的更改要麼所有執行,要麼所有不執行
        (4) 豐富的特性:可用於緩存,消息,按key設置過時時間,過時後將會自動刪除 
       
    3.redis相比memcached有哪些優點?   
       (1) memcached全部的值均是簡單的字符串,redis做爲其替代者,支持更爲豐富的數據類型
       (2) redis的速度比memcached快不少
         (3) redis能夠持久化其數據
          
          
    4.Memcache與Redis的區別都有哪些?
            1)、存儲方式
            
                Memecache把數據所有存在內存之中,斷電後會掛掉,數據不能超過內存大小。
                Redis有部份存在硬盤上,這樣能保證數據的持久性。
            2)、數據支持類型
            
                Memcache對數據類型支持相對簡單。
                Redis有複雜的數據類型。
    
            3)value大小
                redis最大能夠達到1GB,而memcache只有1MB
                
    5.redis常見性能問題和解決方案:   
            (1) Master最好不要作任何持久化工做,如RDB內存快照和AOF日誌文件
    
            (2) 若是數據比較重要,某個Slave開啓AOF備份數據,策略設置爲每秒同步一次
    
            (3) 爲了主從複製的速度和鏈接的穩定性,Master和Slave最好在同一個局域網內
    
            (4) 儘可能避免在壓力很大的主庫上增長從庫
            
            (5) 主從複製不要用圖狀結構,用單向鏈表結構更爲穩定,即:Master <- Slave1 <- Slave2 <- Slave3...
            
            這樣的結構方便解決單點故障問題,實現Slave對Master的替換。若是Master掛了,能夠馬上啓用Slave1作Master,其餘不變。
            
            
    6. mySQL裏有2000w數據,redis中只存20w的數據,如何保證redis中的數據都是熱點數據
        相關知識:redis 內存數據集大小上升到必定大小的時候,就會施行數據淘汰策略(回收策略)。
            redis 提供 6種數據淘汰策略:
            volatile-lru:從已設置過時時間的數據集(server.db[i].expires)中挑選最近最少使用的數據淘汰
            volatile-ttl:從已設置過時時間的數據集(server.db[i].expires)中挑選將要過時的數據淘汰
            volatile-random:從已設置過時時間的數據集(server.db[i].expires)中任意選擇數據淘汰
            allkeys-lru:從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰
            allkeys-random:從數據集(server.db[i].dict)中任意選擇數據淘汰
            no-enviction(驅逐):禁止驅逐數據
            
    7.redis持久化的幾種方式?
        RDB持久化
   AOF持久化mysql

相關文章
相關標籤/搜索