主頁 > 資料庫 > redis隨筆

redis隨筆

2020-09-12 00:58:46 資料庫

redis
    redis的安裝一
        安裝的準備
            首先得買一個服務器(我買的阿里云ecs輕量級);
            再下載遠程客戶端(我用的Xshell,Xftp);
            打開Xftp將下載好得redis壓縮包傳輸Xftp中,在進入Xshell中Linux命令安裝;
        rides安裝
            下載地址:https://redis.io/
            安裝:
                1,Linux進入redis所在目錄;
                2,執行命令:tar -zxvf redis-3.2.10.tar.gz        //個人建議將軟體安裝在/usr/local目錄下,執行命令:tar -zxvf redis-3.2.10.tar.gz -C /usr/local/redis,當然解壓完了move也可以;
                3,進入解壓后的目錄進行編譯,cd redis-3.2.10. 執行命令:make    ,make命令后可能報錯,如果報錯,解決如下:
                    報錯一:那可能是沒有gcc (linux下的一個編譯器,是c,c++程式的編譯器)
                        使用命令yum進行安裝,yum -y install gcc
                    報錯二:error:jemalloc/jemalloc.h:No such file or disectoty    //可能找不到c語言中的頭檔案
                        執行 make MALLOC = libc
                4,安裝完gcc之后,make distclean 清理下上次make后產生的檔案,再make

            redis啟動:
                方式一:前端啟動模式,前端模式啟動的缺點是ssh命令視窗關閉則redis-server程式結束,而且當前命令視窗處于一種阻塞狀態,想要執行其它命令需要重新開啟一個新命令視窗
                    執行命令:cd /usr/local/redis/redis-3.2.10/bin
                    再執行命令:./redis-server
                    //ps -f | grep redis     查看行程        kill pid(行程號)        殺掉行程
            
                方式二:后臺啟動模式,./redis-server &        //建議后臺啟動
                             后臺啟動并輸出日志到 nohup.out 檔案:nohup /usr/local/redis-3.2.10/src/-server &
                             再回車確定
                             ls查看檔案會發現出現一個nohup.out檔案
                             cat nohup.out   就會將日志打在此檔案中
            redis關閉:./redis -cli shutdown
    
    redis的安裝二
        https://www.jb51.net/article/146751.htm

    redis客戶端
        redis命令列客戶端:redis -cli (./redis -cli -h 127.0.0.1 -p 6379)    //redis自帶基于命令列得redis客戶端

        Redis Desktop Manager(遠程客戶端):                //要下載
            遠程連接redis需要修改redis主目錄下的redis.conf組態檔:
                1,bind ip 系結ip注釋掉
                2,protected-mode yes 保護模式改為no;
            可以進入目錄組態檔改,也可以命令改,命令如下:
                進入目錄:cd /usr /local /redis-3.2.10 /
                進入檔案:vim redis.conf  回車確定
                注釋bind ip;protected-mode yes 保護模式改為no;回車確定
                ps -ef | grep redis    //查看行程
                kill  pid        //殺掉當前行程再重啟
                nohup /usr/local/redis-3.2.10/src/redis - server  /usr/local/redis-3.2.10/redis.conf &        //重啟行程并打出日志檔案
            進入下載好的遠程客戶端:
                Connection 連接自己的遠程服務器地址;        //這里一定要填自己的遠程ip,不能填本地
                ok

        phpRedisAdmin(遠程客戶端):
            需要安裝php運行環境
            php開發自行下載xampp

        redis編程客戶端:
            redis的Java客戶端:
                jedis:
                    jedis原始碼:https://github.com/xetorhio/jedis
                    api檔案:http://xetorthio.geihub.io/jedis/

    redis的使用
        基礎命令:
            1, ./redis -cli    //啟動
                輸入ping,redis會回傳PONG表示服務運行正常
            2,redis默認16個庫,但是可以再redis.conf中修改,        //可進檔案改,也可命令改
                進入檔案:vim redis.conf  回車確定
                找到databases 16                //可改
            3,redis默認使用0號庫,select db                //切換庫    例:select 2
            4,洗掉
                洗掉所有庫資料 : flushall
                洗掉當前庫資料 : flushdb
            5,獲取redis的所有配置 :config get *
            6,退出連接:exit / quit
            7,查看當前資料庫中key的數目:dbsize
            8,查看redis服務器的統計資訊:info

        命令與使用檔案:
            命令:
                key命令
                字串型別 :string
                哈希型別 :hash
                串列型別 :list
                集合型別 :set
                有序集合型別 :zset(sorted set)
            檔案:
                中文:https://redis.io/commands
                英文:https://redisdoc.com/
        redis常用命令 :
            keys *                //列出所有key
            exists key              //檢查某個key是否存在
            set key value            //存入key值    例:set k1  v1
            move key db             //將當前的key移動到給定的庫db中,例:move k1 2
            expire key seconds            //設定key值過期時間        例:expire k1 8
            ttl key (time to live)            //查看是否過期,-1永不過期,-2 已過期或key不存在
            type key                //查看key所存盤值得型別
            del key                //洗掉key
        redis更多使用方法請移步菜鳥教程:https://www.runoob.com/redis/redis-install.html

        redis5中資料型別命令
            字串型別 String(可以存盤任何形式的字串)
                set key value            將字串值value設定到key中
                get key                獲取key中的value
                incr key                將key中存盤的數字加一,若key不存在,key得值先被初始化為0,再執行incr操作(只對存盤的數字有用)
                decr key                將key中存盤的數字減一,若key不存在,key得值先被初始化為0,再執行incr操作(只對存盤的數字有用)
                setex key seconds value        設定key值及過期時間(set expire)
                setnx key value            給無值或者不存在的key給值,有值則不設定值
                getset key value            給key設定新值并回傳舊值
                strlen key                回傳key所存盤字串長度
                append key value            若key存在且為字串,則追加(跟jquery一樣);key不存在將追加的設為新值
                incrby key increment            將key所存盤的值加上增質量(自定義量),若key不存在,則key的值初始化為0,再執行incrby
                decrby key increment        將key所存盤的值減去增質量(自定義量),若key不存在,則key的值初始化為0,再執行incrby
                getrange key start end        截取key中字串值,從star開始,end結束(類似subString)
                setrang key offset value        從字串指定位置替換value,例:k1值為helloworld,執行setrang k1  5(第五個位置) redis  則輸出:helloredis
                mset key1 value key2 value2 ...        同時設定多個key-value
                mget key1 key2 keyn ...        同時獲取多個key-value
                msetnx key1 value key2 value2 ...    同時設定多個key-value,當且僅當所有給定key都不存在時才能設定成功,有一個key存在值都不行

            哈希型別hash(String型別的映射,適合存盤物件)
                hset key field value            將哈希表key中的域field的值設定為value    例:hset k1 id 1001
                hget key field            取值        例:hget k1 id
                hmset key1 field value ...        同時設定多個值    例:hmset k2 id 1002 name likauhua age 10 pwd 123 ...
                hmget key field ...            同時取多個值    例:hmget k2 id name age
                hgetall key            查詢哈希表key里所有值
                hdel key                洗掉哈希表key中一個或多個指定值field
                hkeys key                查看哈希表key中所有field域(查詢所有欄位)
                hvals key                查看哈希表key中所有域的值(欄位所對應的值)
                type key                查案key存盤的資料型別
                hlen key                查看哈希表key中域field的個數(欄位個數)
                hexists key            查看哈希表key中,給定域field是否存在(欄位是否存在還)例:hexists k1 id
                hincrby key field increment        為哈希表key中的域的值加上增量        例:hincrby k1 id 5
                hincrbyfloat key field increment    為哈希表key中的域的值加浮點數上增量    
                hsetnx key field value        將哈希表key中的域field的值設為value,當且僅當field不存在時才設定,否則不設定    例:hsetnx k1 age(這個欄位不存在時才能設定)  18

            串列型別list(簡單的字串串列,按照插入排序,元素可重復)
                lpush key value1 value2 value3        將一個或多個值value插入到串列key的表頭(最左邊)    例:lpush k1 1 2 3 4 5
                rpush key    value1 value2 value3        將一個或多個值value插入到串列key的表尾(最右邊)    例:lpush k1 7 8 9 10 11
                lrange key start stop            獲取表key中指定區間內元素,0為第一元素,-1為倒數第一元素, 例:lrange key 0 -1    (區間所有元素)
                lpop key                從左邊獲取串列key的第一個元素,并將該元素移除
                rpop key                從右邊獲取串列key的第一個元素,并將該元素移除
                lindex key index            獲取串列key中下標為指定index元素    例:lindex key 3
                llen key                獲取串列key的長度
                lrem key count value            從左至右洗掉串列中指定個數與指定value值相等的value    例:lrem k1 1 4    4這個元素被洗掉了
                 ltrim key start stop            洗掉指定區域外的元素
                rpoplpush source destination        將串列source中的尾元素插入到串列destination中,作為頭元素    例:rpoplpush k1 k2    (將本串列尾元素放另一個串列當頭元素)
                lset key index value            將串列key下標為index的元素設為value    例:lset k1 0 222(將0下標下的元素替換成22)
                linsert key before|after pivot value    將值插入到指定值之前或之后    例:linsert k1 before  5 100(將k1域內值5前插入100,元素非下標)


            集合型別 set(redis的Set時String型別的無序集合,成員唯一,集合中不重復)
                sadd key member member ...        將一個或多個member元素加入集合key中,已存在集合的member元素不加入      例:sadd k1 1 2 3 4
                smembers key             獲取聚合key中所有元素
                sismember key member        判斷member是否是集合key的成員    例:sismember k1  1
                scard  key                獲取聚合中元素個數
                srem key member            洗掉聚合中一個或多個元素(指定洗掉某個元素)    例:srem k1 2
                srandmemner key [count]        隨機回傳集合中一個或多個元素  count 是回傳的個數            
                spop key                隨機洗掉集合中的一個元素
                smove source destination member    將member元素從一個集合移到另一個集合    例:smove k1 k2 2(將元素2從k1 移到k2)

            有序聚合zset(sorted set):跟set差不多,不同的是zset得每個元素都會關聯一個分數(分數可重復),redis通過分數來為集合中的成員進行排序
                zadd key score member        將一個或多個member元素及其score值加入到有序集合        例:zadd k1 100 likaihua 90 likaihua2
                zrange key start stop        獲取有序集合key中,指定區間的成員,按score大小排序    例:zrange k1 0 -1
                zrevrange key start stop        獲取有序集合key中,指定區間的成員,按score小大排序    例:zrange k1 0 -1
                zrem key member            洗掉有序集合key中得一個或多個成員        例:zrem k1 likaihua
                zcard key                獲取集合個數
                zrank key member            獲取有序集合key中,成員member排名,有序集成員按score值從小到大排列    例:zrank k1 likaihua
                zrevrank key member        獲取有序集合key中,成員member排名,有序集成員按score值從大到小排列
                zrangebyscore key start stop        獲取有序集合key中,所有score值介于min和max之間的成員    例:zrange k1 100 90
                zrevrangebyscore key start stop    獲取有序集合key中,所有score值介于max和min之間的成員
                zcount key min max            獲取有序集合key中,所有score值介于min和max之間的成員個數    例:zcount k1 10 100
                score(分數)    
                
            Table鍵        補全命令
            官方命令檔案:redisdoc.com
        

    redis的發布和訂閱
        發布訂閱:redis發布訂閱(pub/sub)是一種訊息通信模式;也稱為生產者模式,實作訊息佇列的一種方式
        訊息佇列三要素:1,生產者(producer)2,消費者(consumer)3,訊息服務(broker)
        三者關系:1 (producer)——>3 (redis在次充當consumer)——>2(consumer)
        一個訊息發布者,多個訊息訂閱者
        
        命令實作:1,開啟4個redis客戶端,三個作為訊息訂閱者,一個作為訊息發布者:./redis-cli
            2,訊息訂閱者:subscribe channel
                // 如果是訂閱匹配模式:psubscribe chan *    表示匹配以chan開頭的頻道主題都能拿到
            3,訊息發布者:publish channel message    
                //就跟扶貧一樣,國家把錢給政府干部,干部(干部===訊息發布者)發錢,帶有精準扶貧這個標識人就可以憑此去拿錢(貧困戶==訊息訂閱者)

        jedis編程實作:
            訂閱者:
                public void onMessage(String channel, String message){        //封裝的回呼函式
                    System.out.println("頻道"+channel+"發布了訊息"+message);
                }

                public static void main (String [ ] arg){
                    Jedis jedis = new Jedis ("192.168.0.1" ,6379);    //連接redis
                    Sub sub = new Sub();            //創建訂閱者物件
                    jedis.subscribe(sub, "channel");
                }
            發布者:
                public static void main (String [ ] arg){
                    Jedis jedis = new Jedis ("192.168.0.1" ,6379);    //連接redis
                    jedis.publish("channel", "hello world");        //發布訊息
                    jedis.close();                
                }

        redis事務(redis中的事務是一組命令集合,至少兩條以上命令,redis事務保證這些命令被執行時不會被其他操作打斷)
            正常流程:1,MULTI:該命令告訴redis接下來的命令暫不執行,將其暫存(開啟事務)
                2,SADD "user1" 第一天命令進入等待佇列
                3,SADD "user2"第二條命令進入等待佇列
                4,EXEC 告知redis執行暫存的命令(提交事務)    //放棄事務:DISCARD,不執行,事務放棄
                    
                    //就跟坐客車(事務 == 大客車)一樣,單個不走,包車不準,等人多了,包圓兒了一塊走,
                命令示例:
                    MULTI
                    set  k2(key)  v2(value)
                    set  k3(key)  v3(value)
                    EXEC
                也存在例外和例外情況:1,語法錯誤,事務回滾不執行
                            2,語法正常,邏輯錯誤,例如incr給一個字符加1,或者不給值,能夠入隊,但提交事務后會顯示該陳述句存在錯誤
                
            
            鎖:
                悲觀鎖:當有人讀取資料時會被認為要更改資料,因此每次在讀取資料時會先上鎖,直到這個執行緒拿到鎖為止,(本執行緒結束后其他執行緒才能進來讀取資料,就跟上廁所似的,進去先鎖門,自己拉完了別人才能進來拉)
                
                樂觀鎖:當有人讀取資料時不會被認為更改資料,不上鎖,但在更新時會判斷在此期間是否有人更改資料,一般用版本號機制進行判斷,

                    悲觀鎖的判斷機制:大多數基于資料版本號機制實作,版本號?:即為資料增加一個版本標識,
                                     一般通過為資料庫表添加“version”欄位來實作讀取資料時,也將此版本一同讀出,之后來讀取資料的人提交資料更新時,會對此版本號加1,
                                     此時提交資料的版本號與資料庫表對應記錄的當前版本號對比,若提交資料版本號大于資料庫表當前版本號,則準予更新(資料庫當前版本號只會更新一次)
                    
                        示例:
                            1,A操作員將用戶資料讀取(version=1),進行修改操作,
                            2,B操作員將用戶資料讀取(version=1),進行修改操作,
                            3,A完成操作,提交資料時(version +1 =2),提交更新,此時提交資料版本號大于資料庫記錄的當前版本號,準許提交,
                            4,B完成操作,提交資料時(version +1 =2),提交更新,但是此時的資料庫記錄的版本號已經被A提交資料后更新為2了,所以B提交的版本號不大于資料庫記錄的當前版本號,則不準予提交資料更新,
                            因為資料庫記錄的版本號只更新一次,誰快先更新了,版本號就變了,必須等上一個執行緒完成后再進去操作,(就爭媳婦似的的,誰下手快生了娃,誰就穩了)

                    redis的watch機制實作樂觀鎖(監視一個或多個key,如果在事務exec執行之前這個key被其他命令更改,那么該事務將會被打斷)
                        命令如下:
                            set k1 1                //設k1為1
                            watch k1                //監視k1
                            set k1 2                //k1值在被監視時被更改為2,另外人開客戶端更改也一樣
                            multi                //開始事務
                            set k1 3                //將k1值改為3
                            exec                //提交事務
                            輸出null,事務被放棄,檢測到k1也被更改為2,不再是1了,
                            (就像本來你跟你女朋友快要結婚了,但是結婚前一天在你爸媽的眼皮子底下決定跟別人私奔,你爹媽知道了不想讓你背鍋,在你們結婚時強行拆散,唉,真慘,)
                            
        redis的持久化機制
            持久化概述:持久化==存盤,就一直存著可以,
            redis持久化:redis資料存盤在記憶體中,記憶體是瞬時的,如果發生宕機或者系列糟糕情況,記憶體會丟失,redis提供兩者持久化機制
                
                //就跟男人一樣,要持久,持之以恒,堅定不移,

            RDB方式:在指定的時間間隔內將記憶體中的資料快照寫入磁盤,資料恢復時將快照檔案直接再讀到記憶體
                   步驟:在redis.conf檔案中配置
                配置格式:save <seconds><changes>
                    save 900 1                //900秒內一次資料更改會保存一次
                    save 3000 10
                    save 6000 20

                組態檔redis.conf中搜索SNAPSHTTING:dbfilename:設定RDB檔案名,默認檔案名為dump.rdb        //就是可以修改保存檔案的名字
                                dir:指定RDB和AOF的檔案目錄                //修改保存檔案的指定目錄
                    //修改redis.conf檔案后要重啟一下redis

            AOF方式:redis每收到一條修改命令時,它將命令寫道一個AOF檔案中(不記錄讀命令),當redis重啟時,再通過AOF中的所有命令在恢復
                   步驟:rdis.conf檔案中搜索APPEND ONLY MODE
                       1,將append only改為yes,默認no;

                  AOF相關設定: 1,appengfilename:AOF檔案名,可改,默認:appendonly.aof        
                        ////查看aop檔案存盤的命令:1,ll *.aop;2,cat  appendonly .aof
                              2,appendfsync:配置向aof檔案寫命令資料策略:
                                1,append fsync always        每次執行寫入都會執行同步,慢且安全
                                2,append fsync  everysec        每秒執行一次同步操作
                                3,append fsync  no            不主動進行同步操作,交給系統來做,30秒一次,快但不且不安全

                             3,auto-aof-rewrite-percentage(例如:100):設定當目前aof檔案大小超過上一次重寫時aof檔案大小的百分之多少時,將再次進行重寫;若之前未進行重寫,則以啟動時最小aof檔案大小為依據;
                        //進行檔案優化,例:set k1 1 后再執行 set k1 2,那么set k1 1則不被記錄,只記錄有用的命令
                             4,auto-aof-rewtite-min-size(例如:64mb):設定允許重寫的最小aof檔案大小
        總結:可以同時使用兩種方式,默認優先加載aof



    redis集群
           主從復制
        主從復制(master/slave):
            簡介:redis做集群,為保證單點故障,就將資料復制多芬島多臺不同服務器,即使其中一臺出現故障,其他服務仍可運行,
            實作:部署多臺redis,并在組態檔中指定之間的主從關系,主負責寫,同時將寫入資料實時同步到從機器,即主從復制,master/slave,redis默認master用于寫,slave用于讀,

        配置方式一:修改組態檔,啟動時,服務器讀取組態檔,自動成為指定服務器的從服務器,構成主從復制關系,
            主服務器(master)
                include /usr/local/redis-5.0.3/redis.conf
                daemonize yes
                port 6380
                pidfile /var/run/redis6380.pid
                logtile 6380.log
                dbfilename dump6380.rdb

            從服務器(slave)
                include /usr/local/redis-5.0.3/redis.conf
                daemonize yes
                port 6381
                pidfile /var/run/redis6380.pid
                logtile 6381.log
                dbfilename dump6381.rdb
                slaveof 127.0.0.1 6380

        示例:(由于只有一臺服務器,因此在一個redis中啟三個實體,一個master兩個slave)方便觀看就開4個客戶端視窗,
            以下為客戶端視窗 1,
            bin目錄下
            cp redis.conf redis6380.conf        //復制原來redis6379.conf組態檔,并生成新的redis6380.conf組態檔
            ll                //出現redis6380.conf檔案
            >redis6380.conf            //滯空redis6380.conf檔案
            vim redis6380.conf            //進入redis6380.conf檔案,添加主服務的配置
                  配置master    
                include /usr/local/redis-5.0.3/redis.conf
                daemonize yes
                port 6380
                pidfile /var/run/redis6380.pid
                logtile 6380.log
                dbfilename dump6380.rdb
                :wq                        //如果無法保存退出,就按下esc鍵再,:wq a.txt

            配置從slave
                cp redis6380.conf redis6381.conf            //復制redis6380.conf檔案
                vim redis6381.conf                    //進組態檔配置從
                    include /usr/local/redis-5.0.3/redis.conf
                    daemonize yes                //表示后臺啟動
                    port 6380
                    pidfile /var/run/redis6380.pid
                    logtile 6380.log
                    dbfilename dump6380.rdb
                    slaveof 127.0.0.1 6380            //設定是6380的從服務器
                    :wq                    //如果無法保存退出,就按下esc鍵再,:wq a.txt

                cp redis6380.conf redis6382.conf            //復制redis6380.conf檔案
                vim redis6381.conf                    //進組態檔配置從
                    include /usr/local/redis-5.0.3/redis.conf
                    daemonize yes
                    port 6380
                    pidfile /var/run/redis6380.pid
                    logtile 6380.log
                    dbfilename dump6380.rdb
                    slaveof 127.0.0.1 6380            //設定是6380的從服務器
                    :wq                        //如果無法保存退出,就按下esc鍵再,:wq a.txt
            
            客戶端視窗2
            ./redis-server ../redis6380.conf            //后臺啟動master        
            ./redis-server ../redis6381.conf            //后臺啟動slave
            ./redis-server ../redis6382.conf            //后臺啟動slave
            ps -ef | grep redis                //查看這三個行程是否啟動
            如果已經有三個行程的了,也可以檢查各個埠所處角色
            ./redis -cli -p 6380                //開啟6381客戶端
            info replication                //插看服務器角色命令
                查看的資訊:
                role:master(主)            //角色master
                connected_slaves:2            //兩個從,埠號分別為
                slave0:port:6381            
                slave1:port:6382
        
                客戶端視窗3
            ./redis -cli -p 6381                //開啟6381客戶端
            info replication                //插看服務器角色命令
            查看的資訊:
                role:slave(從)            //角色slave
                master_host:127.0.0.1        //主是本地的
                master_port:6380            //埠號為6380            
                master_link_status:up        //開啟狀態

               客戶端視窗4
            ./redis -cli -p 6382                //開啟6381客戶端
            info replication                //插看服務器角色命令
            查看資訊與3一樣

        配置完成可測驗
            1,回到master所在客戶端視窗
                set k1 v1
                set k2 v2                //設定兩個值,在從服務器去取,看是否能讀取值
            
            2,回到任意一個slave所在客戶端視窗
                get k1
                get k2
            3,看能否讀到值,讀到即配置成功
                get k3                //讀master為設定的值看是否能讀到
                輸出null,未讀到;
            
            4,回到master所在客戶端視窗
                set k3 v3                //設定k3,再去slave讀,看是否能讀取

            5,回到任意一個slave所在客戶端視窗
                get k3
            輸出:v3                    //讀取成功
        主從關系配置完成

    如果現在出現問題了,master服務器宕機了,關閉了,主沒了,只有從了,怎么辦?
        引入新的處理方式
            容災處理(冷處理):當master服務出現故障后,需要手動將slave中的一個提升為master,將剩下的slave重新掛至新的master上;
                  命令如下:
                slaveof no one :將一臺slave服務器提升為master
                slaveof 127.0.0.1 6381(新提上slave埠號):將slave掛至新的master上

        操作示例:
            1,在master所在服務器客戶端
                shutdown                //關閉master,模擬master出故障
                ps -ef | grep redis            //查看redis6380.conf行程是否被關閉

            2,在任意一個slave所在服務器客戶端
                slaveof no one             //提升為主
                info replication            //查看所處角色即從服務
                顯示資訊
                    role:master        //角色為主
                    connected_slaves:0        //沒有從服務器

            3,在另外slave中的任意一個slave所在服務器客戶端
                slaveof 127.0.0.1 6381        //將本slave掛至新的master上去
                info replication            //查看角色及主服務
                顯示資訊
                    role:slave
                    master_host:127.0.0.1
                    master_port:6381        //掛在了新的master上了

            4,假如現在原來的master6380服務器修好
                ./redis-server  ../redis6380.conf        //后臺啟動
                ps -ef | grep redis            //查看行程是否被啟動
                ./redis-cli -p 6380            //進入redis
                info replication            //查看角色
                顯示資訊
                    role:master        //角色為master
                    connected_slaves:0        //slaves為0
                原來master重啟后,默認角色為master現在將它掛至新的6381master上去

                slaveof 127.0.0.1 6381        //將本slave掛至新的master上去

            總結:
                1,使用到的相關命令:
                    ./redis-cli -p 6380        進入指定客戶端埠
                    info replication        查看redis服務器所處角色
                    如果不配置啟動,默認為master
                2,master下線,寫請求無法執行;slave下線,讀請求處理性能下降
                3,master故障,需要手動提升一個slave為master,其他的slave要重新掛至新的master上去
                4,主從復制模式的故障轉移需要手動操作,需要實作自動化處理,就再次引入Sentine哨兵,實作故障自動轉移


        哨兵模式(熱處理)
        作用:Sentine哨兵可以來監控多個redis服務實體運行情況
        Sentinel配置:
            1,復制三份檔案:sentinel26380.conf,sentinel26381.conf,sentinel26382.conf;
            2,修改每個組態檔
                port 26380;port 26381;port 26382;
                sentinel monitor mymaster 127.0.0.1 6380 2
                Sentinel會根據master的配置自動發現master和slave,Sentinel默認埠是26379
            3,啟動三個實體
                 ./redis-sentinel  ../sentinel26380.conf
                 ./redis-sentinel  ../sentinel26380.conf
                 ./redis-sentinel  ../sentinel26380.conf    
                啟動三個實體后,會創建三個監視master服務的Sentinel實體
            4,哨兵模式已啟動;    

        操作示例:
               redis6379客戶端視窗
            1, cd usr/local/redis-5.0.3/bin            //進入bin檔案夾
            2,ll                    //會看到一個
                //    redis-sentinel            哨兵可執行檔案,讀取組態檔,站崗
                //    sentinel.conf            哨兵組態檔
              3,復制三個sentinel.conf組態檔
                cp  sentinel.conf  sentinel26380.conf        //復制sentinel26379組態檔生成新的sentinel26380檔案
            cp  sentinel.conf  sentinel26381.conf
            cp  sentinel.conf  sentinel26382.conf

               4,逐個修改sentinel.conf檔案
            vim  sentinel26380.conf
                port 26380 (進哪個埠改那個)
                sentinel  monitor  mymaster  127.0.0.1   6381  2
                    //  2  投票數:這個投票數就是哨兵的投票數,檢測master的這個哨兵發現這個master掛了,但它不能直接確定,
                    //會讓其他的哨兵也來檢測這個master,認為掛了的哨兵就投一票,等票數過半了,就確定真掛了,
                :wq    //保存退出
            
            vim  sentinel26381.conf
                port 26381 (進哪個埠改那個)
                sentinel  monitor  mymaster(可修改檔案名)  127.0.0.1   6381(主服務埠號,上面新提升的slave) 2(投票數)
                :wq    //保存退出

            vim  sentinel26382.conf
                port 26382 (進哪個埠改那個)
                sentinel  monitor  mymaster(可修改檔案名)  127.0.0.1   6381(主服務埠號,上面新提升的slave) 2(投票數)
                :wq    //保存退出

                     /*
                       決議:
                sentinel  monitor  mymaster(檔案名可修改)  127.0.0.1(本地地址)   6381(master,主服務埠號)  2(投票數)
                      2  投票數:這個投票數就是哨兵的投票數,檢測master的這個哨兵發現這個master掛了,但它不能直接確定master掛了,
                        會讓其他的哨兵也來檢測這個master,認為掛了的哨兵就投一票,等票數過半了,就確定真掛了,

                    */

                5,ls                        //查看檔案會看到三個sentinel.conf檔案
                     ./redis-sentinel  ../sentinel26380.conf        //啟動檔案

                6,在新建兩個客戶端視窗方便啟動,1視窗,2,視窗
            1視窗
            ./redis-sentinel ../sentinel26381.conf
            2視窗
            ./redis-sentinel ../sentinel26382.conf

                7,回到之前的master客戶端視窗,關閉master,演示故障轉移
            shutdown
            ps -ef | gerp redis            //查看行程,redis6381是否被關閉

               8,看1,2視窗,是否列印的日志資訊
            ...
            # + failover-end master mymaster 127.0.0.1 6381                //6381行程end
            # + switch-master mymaster 127.0.0.1 6381  127.0.0.1 6380            //master6381替換成6380

               9,回到6380客戶端視窗查看角色
            info replication
            資訊顯示
                role:slave            //角色slave
                master-port:6380            //它的master是6380
            
               10,回到6381(被停掉的master服務器),重啟服務看看
            ./redis-server  ../redis6381.conf            //重啟服務
            ./redis -cli -p 6381                //進入redis客戶端
            info replication
            顯示資訊
                role:slave            //角色slave
                master-port:6380            //它的master是6380
               示例完成;

        總結:哨兵模式你補了容災處理需要手動處理的缺陷,哨兵監控master主服務,當它發現master掛了的時候會自動進行古故障轉移,
                  自動將其中的slave與掛了的master進行角色交換,而后就算掛了的master服務重啟后也不再是master,而是自動修改成新master服務的slave服務,
        
        

    redis相關安全
        redis設定密碼:redis.conf檔案配置中 requirepass    123456
            操作示例:
                cd usr/local/redis-5.0.3
                vim redis.conf            //進入配置修改
                找到requirepass去掉注釋,后面加上密碼    123456
                :wq
                kill 6379                //殺掉行程重啟
                ./redis-server ../redis.conf &        //啟動后臺
                ./redis -cli -p 6379            //啟動6379客戶端
                AUTH 123456
            在jedis連接客戶端時也要密碼
                jedis.auth("123456");

        系結ip:#bin 127.0.0.1 去點注釋,127.0.0.1換成你允許連接的ip.表示只允許這個ip進行訪問;

        命令禁止和重命名(也是在redis.conf配置中進行):
            rename-command FLUSHALL  del    重命名flushall命令為del
                注意:這里重命名前提是appendonly.aof檔案中沒有flushall命令,否則服務器無法啟動
                //因為redis.conf配置里改名了,appendonly.aof檔案中還存在flushall命令,那會沖突,無法識別del新命令
            
            rename-command FLUSHALL  ""    禁用flushall    //flushall      清空本庫所有資訊
            rename-command FLUSHDB  ""    禁用flushdb    //flushdb        清空所有庫所有資訊
            rename-command CONFIG   JIJJMKXW        重命名config命令
            rename-command CONFIG   ""            禁用config命令        //config查看所有配置   config get *


        redis特點:
            簡單穩定;支持豐富的記憶體結構;讀寫速度快;有持久化支持;支持部分事務操作;

    總結:紙上得來尚覺淺,絕知此事要躬行;

    set k1 "加油!"
https://www.bilibili.com/video/BV1Q4411N7u4/?p=28

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/8787.html

標籤:NoSQL

上一篇:【趙強老師】使用MongoDB的Web控制臺

下一篇:【Redis】集群NetCore實戰

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more