Redis

Redis:redis

KV cache and store算法

in-memory 全部工做在內存中進行,數據庫

支持持久化vim

支持主從(藉助於sentinel實現必定意義上的HA)centos

支持Clustering(分佈式集羣)服務器

 

Redis數據類型app

String(字符串), List(列表), Hash(哈希值), Set(集合), Sorted Set(有序集合), Bitmap, HyperLoglog 異步


Redis的組件:tcp


Redis守護進程:分佈式

監聽端口:6379/tcp

 

Strings:

SET key value [EX #] [NX|XX]

GET

INCR

DECR

EXIST

 

Lists:

LPUSH

RPUSH

LPOP

RPOP

LINDEX

LSET

 

Sets:

SADD

SINTER

SUNION

SPOP

SISMEMBER

 

Sorted Sets:

ZADD

ZRANGE

ZCARD

ZRANK

 

Hashes:

HSET

HSETNX

HGET

HKEYS

HVALS

HDEL

 

Bitmaps, HyperLogLog

 

認證明現方法:

(1) redis.conf

requirepass PASSWORD

 

(2) redis-cli

AUTH PASSWORD

 

清空數據庫:

FLUSHDB:清空當前庫

FLUSHALL:清空全部庫

 

事務:

經過MULTI, EXEC, WATCH等命令實現事務功能;將一個或多個命令歸併爲一個操做提請服務器按順序執行的機制;不支持回滾操做;

MULTI啓動一個事務;

EXEC: 執行事務;

一次性將事務中的全部操做執行完成後返回給客戶端; 

WATCH樂觀鎖;在EXEC命令執行以前,用於監視指定數量鍵;若是監視中的某任意鍵數據被修改,則服務器拒絕執行事務;

 

Connection(鏈接端)相關的命令:

wKiom1cST06x4Y7eAABl8JZMh0k255.jpg

 

Server(服務端)相關的命令:

CLIENT SETNAME connection-name

CLIENT GETNAME

CLIENT KILL ip:port

 

CONFIG GET

CONFIG RESETSTAT

CONFIG SET parameter value

CONFIG REWRITE 

DBSIZE

  

BGSAVE

SAVE

LASTSAVE

 

發佈與訂閱(publish/subscribe)

頻道:消息隊列 

SUBSCRIBE訂閱一個或多個隊列;

PUBLISH向頻道發佈消息;

UNSUBSCRIBE:退訂此前訂閱的頻道;

PSUBSCRIBE:模式訂閱

 

Redis的持久化2種方式:

RDBAOF


RDB: snapshot,二進制格式;按事先定製的策略,週期性地將數據保存至磁盤;數據文件默認爲dump.rdb; 

客戶端也可顯式使用SAVABGSAVE命令啓動快照保存機制;

          SAVE同步,在主線程中保存快照;此時會阻塞全部客戶端請求;

          BGSAVE:異步,


RDB # vim /etc/redis.conf  相關參數

快照觸發條件 

SAVE 900 1             //900秒1個key

SAVE 300 10           //300秒  10個KEY 

SAVE 60 10000     // 60 秒  1萬個KEY 

stop-writes-on-bgsave-error yes    //異步錯誤時中止寫操做

rdbcompression yes                        //壓縮

rdbchecksum yes

dbfilename dump.rdb

dir /var/lib/redis                             //dump.rdb 文件的保存目錄 



AOFAppend Only File

記錄每一次寫操做至指定的文件尾部實現持久化;當redis重啓時,可經過從新執行文件中的命令在內存重建數據庫;

              BGREWRITEAOFAOF文件重寫;

不會讀取正在使用AOF文件,而經過將內存中的數據以命令的方式保存到臨時文件中,完成以後替換原來的AOF文件; 

AOF:

重寫過程:

(1) redis主進程經過fork建立子進程;

(2) 子進程根據redis內存中的數據建立數據庫重建命令序列於臨時文件中;

(3) 父進程繼承client的請求,並會把這些請求中的寫操做繼續追加至原來AOF文件;額外地,這些新的寫請求還會被放置於一個緩衝隊列中;

(4) 子進程重寫完成,會通知父進程;父進程把緩衝中的命令寫到臨時文件中

(5) 父進程用臨時文件替換老的aof文件;

 

相關參數:

appendonly no                                     //尚未打開aof, 改成yes 啓用

appendfilename "appendonly.aof"       

appendfsync {always|everysec|no}            //同步時選項,建議用everysec

no-appendfsync-on-rewrite no                    

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

 

注意:持久自己不能取代備份;還應該制定備份策略,對redis數據庫按期進行備份;

假如RDBAOF同時啓用:

(1) BGSAVEBGREWRITEAOF不會同時執行;

(2) Redis服務器啓動用於恢復數據時,會優先使用AOF

 ========================================================================================================

redis的複製:

特色:

一個Master能夠有多個Slave

支持鏈式複製;

Master以非阻塞方式同步數據至slave

 

slave 服務器鏈接

> SLAVAOF MASTER_IP MASTER_PORT

 

注意:若是master使用requirepass開啓了認證功能,從服務器要使用masterauth <PASSWORD>來連入服務請求使用此密碼進行認證;

 

sentinel(哨兵監控機)用來管理多個redis服務實現HA

監控

通知

自動故障轉移

流言協議,投票協議

 

程序:

redis-sentinel /path/to/file.conf

redis-server  /path/to/file.conf --sentinel

 

(1) 服務器自身初始化,運行redis-server中專用於sentinel功能的代碼;

(2) 初始化sentinel狀態,根據給定的配置文件,初始化監控的master服務器列表;

(3) 建立連向master的鏈接;

 

專用配置文件:/etc/redis-sentinel.conf

 

             指明要被監控的主節點

(1) # sentinel monitor <master-name> <ip> <redis-port> <quorum>

sentinel monitor mymaster 127.0.0.1 6379 2   2爲法定票數

 

             判斷某個節點的超時時長      

(2) sentinel down-after-milliseconds <master-name> <milliseconds>

               sentinel down-after-milliseconds mymaster 30000

 

             剛剛上線的主服務器,被容許有幾個從服務器鏈接請求

(3) sentinel parallel-syncs <master-name> <numslaves>

 sentinel parallel-syncs mymaster 1

 

             故障轉移的操時時間

(4) sentinel failover-timeout <master-name> <milliseconds>

   sentinel failover-timeout mymaster 180000

 

 主觀下線,客觀下線:

 主觀下線:一個sentinel實例判斷出某節點下線;

 客觀下線:多個sentinel節點協商後判斷出某節點下線;

 

 專用命令:

 SENTINEL masters

 SENTINEL slaves <master name>

 SENTINEL get-master-addr-by-name <master name>

 SENTINEL reset

 SENTINEL failover <master name>

 

 Clustering

 分佈式數據庫,經過分片機制進行數據分佈,clustering內的每一個節點僅數據庫的一部分數據;

 每一個節點持有全局元數據,但僅持有一部分數據;

 

 

做爲一種基數統計算法,好比統計一個千萬級別以上的訪問日誌文件中不一樣IP出現的次數,傳統實現方式是把文件中的全部IP取出並存儲到hash set中,計算總數便可。不過,處理海量數據的時,對內存的佔用量將會特別大,所以就有了所謂的位圖法。位圖能夠快速、準確地獲取一個給定輸入的基數。位圖的基本思想是使用哈希函數把數據集映射到一個bit位,每一個輸入元素與bit位是一一對應。這樣Hash將沒有產生碰撞衝突,並減小須要計算每一個元素映射到1bit的空間。雖然Bitmap大大節省了存儲空間,但當統計很高的基數或很是大的不一樣的數據集,它們仍然有問題。好在基數統計做爲一個新興的領域,業已出現很多開源算法,基數統計算法的思想是用準確率換取空間,準確率能夠稍稍差一點點,可是能夠大大的縮減佔用的空間。例如,目前3個比較有表明的算法是:Java HashSetLinear Probabilistic Counter以及一個Hyper LogLog Counter

 

redis 試驗

192.168.2.46 主服務器

192.168.2.26 從服務器

192.168.2.100 從服務器

 

192.168.2.24 監控服務器

 

第一步:

(1)從服務器192.169.2.26 的配置文件redis.conf

     bind 192.168.2.26   監聽本身

     slaveof 192.168.2.46 6379   改成鏈接的主服務器IP,   持久鏈接

 

(2)進入從服務器鏈接鏈接主服務器:

# redis-cli -h 192.168.2.26

192.168.2.26:6379> SLAVEOF 192.168.2.46 6379   鏈接主服務器

OK

192.168.2.26:6379> INFO REPLICATION

# Replication

role:slave

master_host:192.168.2.46

master_port:6379

master_link_status:up

master_last_io_seconds_ago:5

master_sync_in_progress:0

slave_repl_offset:15

slave_priority:100

slave_read_only:1

connected_slaves:0

master_repl_offset:0

repl_backlog_active:0

repl_backlog_size:1048576

repl_backlog_first_byte_offset:0

repl_backlog_histlen:0

 

(3)測試:主服務器添加一個KEY測試。

192.168.2.46:6379> set mykey hello

OK

192.168.2.46:6379> keys *

1) "mykey"

192.168.2.46:6379> 

 

(4)從服務器查看

192.168.2.26:6379> KEYS *

1) "mykey"

 

第二步

 (1)從服務器192.169.2.100 的配置文件redis.conf

     bind 192.168.2.100   監聽本身

     slaveof 192.168.2.46 6379   改成鏈接的主服務器IP,會持久鏈接

 

 (2)鏈接從服務器,後鏈接主服務器192.168.2.46 端口爲6397

[root@centos ~]# redis-cli -h 192.168.2.100

192.168.2.100:6379> SLAVEOF 192.168.2.46 6379

OK Already connected to specified master

192.168.2.100:6379> INFO REPLICATION

# Replication

role:slave

master_host:192.168.2.46

master_port:6379

master_link_status:up

master_last_io_seconds_ago:4

master_sync_in_progress:0

slave_repl_offset:295

slave_priority:100

slave_read_only:1

connected_slaves:0

master_repl_offset:0

repl_backlog_active:0

repl_backlog_size:1048576

repl_backlog_first_byte_offset:0

repl_backlog_histlen:0

 (3)查看同步的KEY

192.168.2.100:6379> keys *

1) "mykey"

 

注意若是主服務器使用了requirepass 開始了認證功能,那從服務器要使用masterauth <password> 來鏈接

 

 

主服務器查看加入進的從服務器 

[root@test1 ~]# redis-cli -h 192.168.2.46

192.168.2.46:6379> INFO REPLICATION

# Replication

role:master

connected_slaves:2

slave0:ip=192.168.2.100,port=6379,state=online,offset=421,lag=1

slave1:ip=192.168.2.26,port=6379,state=online,offset=421,lag=1

master_repl_offset:421

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:2

repl_backlog_histlen:420

192.168.2.46:6379> 

 

上面顯示 192.168.2.100     192.168.2.26 已經鏈接爲從服務器

 

第三步: 監控服務器  編輯redis-sentinel.conf

 

# vim /etc/redis-sentinel.conf 

sentinel monitor mymaster 192.168.2.46 6379 1

sentinel down-after-milliseconds mymaster 5000

sentinel failover-timeout mymaster 60000

sentinel config-epoch mymaster 1

 

啓動redis-sentinel服務

# service redis-sentinel restart

 

# redis-cli -h 192.168.2.24 -p 26379

192.168.2.24:26379> sentinel masters  查看主服務器地址

192.168.2.24:26379> SENTINEL slaves mymaster   查看主服務器的從節點

                                       mymaster 爲主從這個組的名,能夠本身改

 

若是主服務192.168.2.46 下線,會自已選一個從服務器變成主。192.168.2.46在次上線仍是爲從,只有本身手動改成主。

相關文章
相關標籤/搜索