Redis

1、NoSQL:

   ACID:
            原子性,一致性,隔離性,持久性; 
                2phase commit,3phase commit,...
  non SQL,Not Only SQL;Web 2.0
              
                www.nosql-databases.org
                https://db-engines.com/en/ranking
   特性:數據量大,數據變化非常快(數據增長快,流量分布變化大,數據間耦合結構變化快),數據源很多
         
          CAP,BASE
               CAP:
                    C:多個數據節點上的數據一致;
                    A:用戶發出請求后的有限時間范圍內返回結果;
                    P:network partition,網絡發生分區后,服務是否依然可用
            CAP理論:一個分布性系統不可能同時滿足C、A、P三個特性,最多可同時滿足其兩者,對于分布式系統滿足分區容錯性幾乎是必須的。
                AP: 
                    C:弱一致性;
                CP: 一旦出現故障就降級到可讀
                    
        BASE:BA,S,E,基于CAP演化而來
            BA:Basically Available,基本可用;
            S:Soft state,軟狀態/柔性事務,即狀態可以在一個時間窗口內是不同步的;
            E:Eventually consistency,最終一致性;
    
NoSQL:Not Only SQL 
    Key Value / Tuple Store:鍵值存儲數據庫,DynamoDB, redis 
    Wide Column Store / Column Families:列式數據庫, hbase
    Document Store:文檔數據庫,mongodb,Elastic
    Graph Databases:圖式數據庫,Neo4j
    
    Multimodel Databases:多模型數據庫
    Object Databases:面向對象數據庫
    Time Series / Streaming Databases:時間序列存儲

2、Redis:

    開源、內存存儲、數據結構存儲;
    可用作:數據庫、緩存、消息隊列;
    
    數據結構:字符串、列表(數組)、hashes(關聯數組)、集合、有序集合、bitmaps、hyperloglogs、空間索引;
    內建的復制、Lua scripting、LRU、事務、持久存儲、高可用(Sentinel,Redis Cluster)

REmote DIctionary Server:數據結構服務器,k/v,數據結構;
    內存存儲:in-memroy
    持久化
    主從(sentinel)
    Cluster(shard)
    
數據結構服務器:
    Strings, Lists, Hashs, Sets, Sorted Sets, Bitmaps, Hyperloglogs
    PUB/SUB

單進程:
    CPU并非瓶頸;
    
持久化:
    snapshotting

Replication:(復制 )
    主/從
        主:rw
        從:read-only
        
Redis Cluster

3、程序環境

    配置文件:/etc/redis.conf
    主程序:/usr/bin/redis-server
                    6379/tcp
    客戶端:/usr/bin/redis-cli
    Unit File:/usr/lib/systemd/system/redis.service
    數據目錄:/var/lib/redis
redis:k/v
       key:直接ASCII字符串;
      value:strings, lists, hashes, sets, sorted sets, bitmaps, hyperloglogs
        
            To get help about Redis commands type:
                "help @<group>" to get a list of commands in <group>
                "help <command>" for help on <command>
                "help <tab>" to get a list of possible help topics
                "quit" to exit      
        
        group:
            @generic, @string, @list, @...

4、redis-cli命令:

    Usage: redis-cli [OPTIONS] [cmd [arg [arg ...]]]
        
        -h HOST
        -p PORT
        -a PASSWORD
        -n DBID
image.png
    Server相關的命令:
         CLIENT GETNAME
         *CLIENT KILL
            CLIENT KILL [ip:port] [ID client-id] [TYPE normal|master|slave|pubsub] [ADDR ip:port] [SKIPME yes/no]
         *CLIENT LIST
         CLIENT PAUSE
            CLIENT PAUSE timeout
         CLIENT REPLY               
         CLIENT SETNAME:Set the current connection name
         
          SHUTDOWN [NOSAVE|SAVE]
          
         配置參數可運行時修改:
         
            CONFIG GET
            CONFIG RESETSTAT
            CONFIG REWRITE
            CONFIG SET
         
         INFO:服務器狀態信息查看;分為多個secion;
            INFO [section]
@string
            SET 創建一個鍵值
            GET 獲取鍵的值
            EXISTS
            INCR 自增 在Redis中數值是當做字符串處理
            DECR 自減
            SETNX  如果鍵值不存在則創建
            SETEX   指定一個鍵的過去時間
            INCRBYFLOAT 一次增加多少
            MGET  獲取多個鍵的值
            MSET  創建多個鍵值
            APPEND 在之前的鍵上加上其他的字符
image.png
@list 
            LPUSH 入棧
            RPUSH
            LPOP 左彈(彈棧)
            RPOP 右彈
            LPUSHX 
            RPUSHX 
            LRANGE
            LINDEX 此時是列表
            LSET
image.png
@hash 
            HSET
            HMSET
            HGET
            HMGET 
            HKEYS
            HVALS
            HDEL 刪除
            HGETALL 獲取所有鍵值對
                         HSTRLEN  獲取指定元素的長度 
            ...
             members --> {name:Jerry, age:17, gender:Female }
                                  HKEYS:取出所有鍵
                                  HVALS:取出所有值
image.png
@pubsub 發布訂閱
            PUBLISH 像一個頻道內放入一則消息
            SUBSCRIBE 訂閱頻道(隊列)
            UNSUBSCRIBE 取消訂閱
            PSUBSCRIBE 基于模式來訂閱
            PUNSUBSCRIBE 取消訂閱
            PUBSUB 獲取發布一個序列信息
                         ...
image.png

打開另一個終端


image.png

5、與Connection相關命令:

        help @connection
        
        AUTH <password> 
        ECHO <message>
        PING 
        QUIT
        SELECT dbid
        
    清空數據庫:
         FLUSHDB:Remove all keys from the current database
            清空當前數據庫;
         FLUSHALL:Remove all keys from all databases
            清空所有數據庫;

6、配置和使用Redis:

    基本配置項
    網絡配置項
    持久化相關配置
    復制相關的配置
    安全相關配置
    Limit相關的配置
    SlowLog相關的配置
    INCLUDES
    Advanced配置
    
    通用配置項:
        daemonize, supervised, loglevel, pidfile, logfile, 
        databases:設定數據庫數量,默認為16個,每個數據庫的名字均為整數,從0開始編號,默認操作的數據庫為0;
        切換數據庫的方法:
             SELECT <dbid>
             
    網絡配置項:
        bind IP
        port PORT
        protected-mode
        tcp-backlog
        unixsocket 
        timeout:連接的空閑超時時長; 
        
    安全配置:
        requirepass <PASSWORD>
        rename-command <COMMAND> <NEW_CMND_NAME>
            在AOF或Replication環境中,不推薦使用;
![image.png](http://upload-images.jianshu.io/upload_images/6854899-813a7c23ac2e1e18.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
image.png

Limits相關的配置:
maxclients
maxmemory <bytes>
maxmemory-policy noeviction
淘汰策略:volatile-lru, allkeys-lru, volatile-random, allkeys-random, volatile-ttl, noeviction
maxmemory-samples 5
淘汰算法運行時的采樣樣本數;


image.png
    SlowLog相關的配置:
        slowlog-log-slower-than 10000
            單位是微秒;
        slowlog-max-len 128
            SlowLog記錄的日志最大條目;
            
    ADVANCED配置:
        hash-max-ziplist-entries 512
        hash-max-ziplist-value 64   
        
            設置ziplist的鍵數量最大值,每個值的最大空間; 
        
        client-output-buffer-limit normal 0 0 0
        client-output-buffer-limit slave 256mb 64mb 60
        client-output-buffer-limit pubsub 32mb 8mb 60
            <hard-limit>
            <soft-limit>
            <soft-limit seconds>

7、Redis的持久化:

    RDB:snapshotting, 二進制格式;按事先定制的策略,周期性地將數據從內存同步至磁盤;數據文件默認為dump.rdb;
        客戶端顯式使用SAVE或BGSAVE命令來手動啟動快照保存機制;
            SAVE:同步,即在主線程中保存快照,此時會阻塞所有客戶端請求;
            BGSAVE:異步;
    AOF:Append Only File, fsync
        記錄每次寫操作至指定的文件尾部實現的持久化;當redis重啟時,可通過重新執行文件中的命令在內存中重建出數據庫;
           BGREWRITEAOF:AOF文件重寫;
    不會讀取正在使用AOF文件,而是通過將內存中的數據以命令的方式保存至臨時文件中,完成之后替換原來的AOF文件; 
                
    RDB相關的配置:
        *save <seconds> <changes>
        
            save 900 1
            save 300 10
            save 60 10000
            
            表示:三個策略滿足其中任意一個均會觸發SNAPSHOTTING操作;900s內至少有一個key有變化,300s內至少有10個key有變化,60s內至少有1W個key發生變化;
            
        stop-writes-on-bgsave-error yes
            dump操作出現錯誤時,是否禁止新的寫入操作請求;
            
        rdbcompression yes
        rdbchecksum yes
        
        dbfilename dump.rdb:指定rdb文件名
        *dir /var/lib/redis:rdb文件的存儲路徑
        
    AOF相關的配置
        *appendonly no
        appendfilename "appendonly.aof"
        
        *appendfsync 
            Redis supports three different modes:
                no:redis不執行主動同步操作,而是OS進行;
                everysec:每秒一次;
                always:每語句一次;
                
        no-appendfsync-on-rewrite no
            是否在后臺執行aof重寫期間不調用fsync,默認為no,表示調用;
            
        auto-aof-rewrite-percentage 100
        auto-aof-rewrite-min-size 64mb  
            上述兩個條件同時滿足時,方會觸發重寫AOF;與上次aof文件大小相比,其增長量超過100%,且大小不少于64MB; 
            
        aof-load-truncated yes
        
    注意:持久機制本身不能取代備份;應該制訂備份策略,對redis庫定期備份;
    
    RDB與AOF同時啟用: 
        (1) BGSAVE和BGREWRITEAOF不會同時進行;
        (2) Redis服務器啟動時用持久化的數據文件恢復數據,會優先使用AOF;
        
復制:
    特點:
        一個Master可以有多個slave主機,支持鏈式復制;
        Master以非阻塞方式同步數據至slave主機;
        
    配置slave節點:
        redis-cli> SLAVEOF <MASTER_IP> <MASTER_PORT>
        redis-cli> CONFIG SET masterauth <PASSWORD>
        
    配置參數:
        *slaveof
        *masterauth 
        
        slave-serve-stale-data yes
        slave-read-only yes
        *repl-diskless-sync no
            no, Disk-backed, Diskless
            
            新的從節點或某較長時間未能與主節點進行同步的從節點重新與主節點通信,需要做“full synchronization",此時其同步方式有兩種style:
                Disk-backend:主節點新創建快照文件于磁盤中,而后將其發送給從節點;
                Diskless:主節占新創建快照后直接通過網絡套接字文件發送給從節點;為了實現并行復制,通常需要在復制啟動前延遲一個時間段;
        
        repl-diskless-sync-delay 5
        repl-ping-slave-period 10
        
        *repl-timeout 60
        
        repl-disable-tcp-nodelay no
        repl-backlog-size 1mb
        
        *slave-priority 100
            復制集群中,主節點故障時,sentinel應用場景中的主節點選舉時使用的優先級;數字越小優先級越高,但0表示不參與選舉; 
        
        min-slaves-to-write 3:主節點僅允許其能夠通信的從節點數量大于等于此處的值時接受寫操作;
        min-slaves-max-lag 10:從節點延遲時長超出此處指定的時長時,主節點會拒絕寫入操作;
        
sentinel:
    主要完成三個功能:監控、通知、自動故障轉移
    
        選舉:流言協議、投票協議
        
    配置項:
        port 26379
        sentinel monitor <master-name> <ip> <redis-port> <quorum>
        sentinel auth-pass <master-name> <password>
        
            <quorum>表示sentinel集群的quorum機制,即至少有quorum個sentinel節點同時判定主節點故障時,才認為其真的故障;
                s_down: subjectively down
                o_down: objectively down
        
        sentinel down-after-milliseconds <master-name> <milliseconds>
            監控到指定的集群的主節點異常狀態持續多久方才將標記為“故障”;
            
        sentinel parallel-syncs <master-name> <numslaves>
            指在failover過程中,能夠被sentinel并行配置的從節點的數量;
            
        sentinel failover-timeout <master-name> <milliseconds>
            sentinel必須在此指定的時長內完成故障轉移操作,否則,將視為故障轉移操作失敗;
            
        sentinel notification-script <master-name> <script-path>
            通知腳本,此腳本被自動傳遞多個參數;
            
        redis-cli -h SENTINEL_HOST -p SENTINEL_PORT 
            redis-cli> 
                SENTINEL masters
                SENTINEL slaves <MASTER_NAME>
                SENTINEL failover <MASTER_NAME>
                SENTINEL get-master-addr-by-name <MASTER_NAME>

8、CLuster:

    集群相關的配置:

        cluster-enabled 是否開啟集群配置
        cluster-config-file 集群節點集群信息配置文件,每個節點都有一個,由redis生成和更新,配置時避免名稱沖突
        cluster-node-timeout 集群節點互連超時的閥值,單位毫秒
        cluster-slave-validity-factor 進行故障轉移時,salve會 申請成為master。有時slave會和master失聯很久導致數據較舊,這樣的slave不應該成為master。這個配置用來判斷slave是否和master失聯時間過長。
        
    配置過程:
        (1) 設置配置文件,啟用集群功能;
        (2) 啟動redis后為每個節點分配slots;
            CLUSTER ADDSLOTS
            注意:每個slot要獨立創建;
        (3) 設定集群成員關系;
            CLUSTE MEET

redis的集群技術:
    客戶端分片
    代理分片:
        豌豆莢:codis
        twitter:twemproxy
    redis cluster               
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容