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(鏈接端)相關的命令:
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種方式:
RDB和AOF
RDB: snapshot,二進制格式;按事先定製的策略,週期性地將數據保存至磁盤;數據文件默認爲dump.rdb;
客戶端也可顯式使用SAVA或BGSAVE命令啓動快照保存機制;
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 文件的保存目錄
AOF:Append Only File
記錄每一次寫操做至指定的文件尾部實現持久化;當redis重啓時,可經過從新執行文件中的命令在內存重建數據庫;
BGREWRITEAOF:AOF文件重寫;
不會讀取正在使用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數據庫按期進行備份;
假如RDB與AOF同時啓用:
(1) BGSAVE和BGREWRITEAOF不會同時執行;
(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將沒有產生碰撞衝突,並減小須要計算每一個元素映射到1個bit的空間。雖然Bitmap大大節省了存儲空間,但當統計很高的基數或很是大的不一樣的數據集,它們仍然有問題。好在基數統計做爲一個新興的領域,業已出現很多開源算法,基數統計算法的思想是用準確率換取空間,準確率能夠稍稍差一點點,可是能夠大大的縮減佔用的空間。例如,目前3個比較有表明的算法是:Java HashSet、Linear 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在次上線仍是爲從,只有本身手動改成主。