您好,登錄后才能下訂單哦!
CAP定理:
C:Consistency 一致性,分布式系統中數據備份節點都需要實時保持數據一致性;
A:Availability 可用性,集群中有節點發生故障,并不影響整個集群對外提供服務;
P:Partition tolerance 分區容錯性,系統數據部分丟失后,仍能提供服務。
在一個分布式系統中,CAP三者不能兼得;高可用、數據一致是很多系統設計的目標,但是分區的現象是不可避免的事情:
CA:分區的現象是始終存在的,一般得CA系統指的是在各分區后的子分區內保持CA;
CP:系統保持強一致性,在同步各節點之間數據中,無法做到多外提供服務,在關系型數據庫事務中,就能體現CP的特性;
AP:保證高可用,就必須放棄強一致性。一旦集群中發生分區現象,每個節點都能使用自己的本地數據對外提供服務,但是這樣會導致全局數據的不一致性,NoSQL都基本數據此特性。
由于網絡硬件等問題,造成延遲丟包的現象肯定會發生,所以分區容忍性是我們必須要實現的。在設計分布式系統中,只能在一致性和可用性之間做權衡。
BASE方案:
BA(Basically Available) 基本可用,分布式系統出現故障時,允許損失部分可用性,保證核心可用;
S(Soft state) 軟狀態,指允許系統出現中間狀態,不會影響系統整體可用性;
E(Eventually consistent) 最終一致,系統中所有數據副本經過一段時間后,最終能夠達到一致的狀態。
NoSQL主要的四種技術流派:
K/V存儲:key-value,如Dynamo、Redis;
Column Family:列式數據庫,如HBase;
Document:文檔數據庫,如mongoDB;
GraphDB:圖式數據庫。
Redis:Remote DICtionary Server:數據結構服務器。
Redis的特點:
(1) 完全開源免費,遵守BSD協議;
(2) 支持數據持久化存儲;
(3) 支持數據備份。
Redis的優勢:
(1) 性能高— 110000次/s的讀速度,81000次/s的寫速度;
(2) 支持的數據類型多— 有字符串(String),哈希(Hash),列表(List),集合(Sets),有序集合(Sorted sets)等類型的值。
(3) 原子性— 所有的操作都是原子性的;
(4) 特性豐富— 支持publish/subscribe、通知、key過期等特性。
Redis安裝:3.0以上版本,需要到官網下載rpm包。
安裝Redis的rpm包需要依賴到jemalloc安裝包,所以需要配置好epel的yum源:
yum install ./redis-3.2.3-1.el7.x86_64.rpm
Redis配置:
Redis的配置文件為/etc/redis.conf,默認的監聽端口為TCP的6379,通過rediscli可以登錄交互式命令行界面:
[root@node7 ~]# systemctl start redis.service
[root@node7 ~]# redis-cli
127.0.0.1:6379>
Redis數據類型:
Redis支持五中數據類型:字符串(String),哈希(Hash),列表(List),集合(Sets),有序集合 (Sorted sets)。
(1) 字符串(String)
127.0.0.1:6379> SET name 'hisen' #設置一個字符串的key為name,value為hisen
OK #設置結果狀態為OK
127.0.0.1:6379> GET name #獲取key為name的值
"hisen" #獲取的結果
注意:一個鍵最大能存儲512MB。
(2) 哈希(Hash)
Hash類型為一鍵多值型,一個鍵對應一個集合的值,命令HMSET、HGETALL。
127.0.0.1:6379> HMSET hisen id name age gender
OK
127.0.0.1:6379> HGETALL hisen
1) "id"
2) "name"
3) "age"
4) "gender"
每個hash可以存儲2^32-1個鍵值對。
(3) 列表(List)
列表類型值,可以從左邊或者右邊加入字符串列表中,命令LPUSH、RPUSH、LRANGE:
127.0.0.1:6379> LPUSH friends he
(integer) 1
127.0.0.1:6379> LPUSH friends tao
(integer) 2
127.0.0.1:6379> LPUSH friends ying
(integer) 3
127.0.0.1:6379> RPUSH friends yu
(integer) 4
127.0.0.1:6379> RPUSH friends zhen
(integer) 5
127.0.0.1:6379> LRANGE friends 0 4
1) "ying"
2) "tao"
3) "he"
4) "yu"
5) "zhen"
每個列表最多可存儲2^32-1個元素。
(4) 集合(Sets)
Set是string類型的無序集合,命令SADD 、SMEMBERS。
添加一個String元素,成功返回1,如果插入的元素與集合中某元素相同,則返回0。
127.0.0.1:6379> SADD animals cat
(integer) 1
127.0.0.1:6379> SADD animals pig
(integer) 1
127.0.0.1:6379> SADD animals dog
(integer) 1
127.0.0.1:6379> SADD animals panda
(integer) 1
127.0.0.1:6379> SADD animals dog
(integer) 0
127.0.0.1:6379> SMEMBERS animals
1) "pig"
2) "panda"
3) "cat"
4) "dog"
(5) ZSET 有序集合 (Sorted sets)
ZSET也是string類型元素集合,而且不重復;
每個元素加入集合中時都會關聯一個double類型的分數,Redis就是通過分數來對集合元素進行從大到小的排序,分數可以相同。
127.0.0.1:6379> ZADD animals 0 pig
(integer) 1
127.0.0.1:6379> ZADD animals 2 cat
(integer) 1
127.0.0.1:6379> ZADD animals 4 dog
(integer) 1
127.0.0.1:6379> ZADD animals 6 panda
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE animals 0 10
1) "pig"
2) "cat"
3) "dog"
4) "panda"
Redis 配置:
Redis的配置文件為安裝目錄下的redis.conf文件,也可以通過命令行來查看:
127.0.0.1:6379> CONFIG GET *
1) "dbfilename"
2) "dump.rdb"
3) "requirepass"
4) "hisen"
5) "masterauth"
6) ""
7) "unixsocket"
8) ""
9) "logfile"
10) "/var/log/redis/redis.log"
11) "pidfile"
12) "/var/run/redis/redis.pid"
13) "slave-announce-ip"
14) ""
15) "maxmemory"
16) "0"
17) "maxmemory-samples"
18) "5"
19) "timeout"
20) "0"
21) "auto-aof-rewrite-percentage"
22) "100"
23) "auto-aof-rewrite-min-size"
24) "67108864"
25) "hash-max-ziplist-entries"
26) "512"
27) "hash-max-ziplist-value"
28) "64"
29) "list-max-ziplist-size"
30) "-2"
31) "list-compress-depth"
32) "0"
…
redis.conf 配置文件項:
bind 0.0.0.0 #監聽端口
protected-mode yes
port 6379 #默認監聽端口
tcp-backlog 511
timeout 0 #超時時間,0為不超時
tcp-keepalive 300
daemonize no #是否以守護方式運行
supervised no
pidfile /var/run/redis/redis.pid #存放pid的文件
loglevel notice #日志記錄級別:debug、verbose、notice、warning
logfile /var/log/redis/redis.log #日志存放的文件
databases 16 #數據庫數量
save 900 1 #指定900s內,有1次更新,就將數據同步到磁盤文件中
save 300 10 #指定300s內,有10次更新,就將數據同步到磁盤文件中
save 60 10000 #指定60s內,有10000次更新,就將數據同步到磁盤文件中
stop-writes-on-bgsave-error yes
rdbcompression yes #本地數據是否壓縮
rdbchecksum yes
dbfilename dump.rdb #本地數據庫名,默認為dump.rdb
dir /var/lib/redis #本地數據庫存放路徑
slaveof <masterip> <masterport> #本機為slave時,指定的master地址及端口號
masterauth <master-password> #slave連接master的密碼
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
requirepass foobared #設置redis連接密碼
maxclients 10000 #同一時間最大客戶端連接數
maxmemory <bytes> #指定redis最大可使用內存空間
appendonly no #指定是否在每次更新操作后進行日志記錄
appendfilename "appendonly.aof" #更新日志文件名
appendfsync everysec #指定更新日志條件:no表示等操作系統進行數據緩存同步到磁盤;always每次更新操作后手動低啊用fsync()將數據寫進磁盤;everysec每秒同步一次
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
Redis 發布訂閱
Redis 發布訂閱分為發送消息端(pub),接收信息端(sub)。
示例:
(1) 創建一個訂閱頻道WeChat:
127.0.0.1:6379> SUBSCRIBE WeChat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "WeChat"
3) (integer) 1
(2) 另外開啟一個客戶端,并對WeChat頻道進行信息發布:
127.0.0.1:6379> PUBLISH WeChat "Today is a funny day!"
(integer) 1
127.0.0.1:6379> PUBLISH WeChat "I Love Linux!"
(integer) 1
(3) 返回訂閱客戶端查看:
127.0.0.1:6379> SUBSCRIBE WeChat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "WeChat"
3) (integer) 1
1) "message"
2) "WeChat"
3) "Today is a funny day!"
1) "message"
2) "WeChat"
3) "I Love Linux!"
命令 | 描述 |
PSUBSCRIBE pattern [pattern ...] | 訂閱一個或多個符合模式的頻道 |
PUBSUB subcommand [argument [argument ...]] | 查看訂閱與發布系統狀態 |
PUBLISH channel message | 將信息發送給指定頻道 |
PUNSUBSCRIBE [pattern [pattern ...]] | 退訂所有給定模式的頻道 |
SUBSCRIBE channel [channel ...] | 訂閱給定的一個或多個頻道信息 |
UNSUBSCRIBE [channel [channel ...]] | 退訂給定的頻道 |
Redis 事務:
事務隔離性:一個事務中的所有命令都會按順序執行,執行事務時不會被其他客戶端發來的命令打斷;
事務原子性:事務中的命令,要么全部執行,要么全部不執行。
示例:
MULTI是開啟一個事務的標識,之后多個命令會在事務中列隊,等執行EXEC時,列隊中的所有命令再依次執行。
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET name hisen
QUEUED
127.0.0.1:6379> GET name
QUEUED
127.0.0.1:6379> SADD xingshi zhao qiao sun li
QUEUED
127.0.0.1:6379> SMEMBERS xingshi
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) "hisen"
3) (integer) 4
4) 1) "qiao"
2) "li"
3) "sun"
4) "zhao"
命令 | 描述 |
DISCARD | 取消事務 |
EXEC | 執行事務 |
MULTI | 開始一個事務 |
UNWATCH | 取消對所有key的監控 |
WATCH key [key ...] | 監控key,如果在事務執行前key被更改,事務將會被打斷 |
Redis 安全:
設置服務連接密碼,可以通過配置文件,也可以通過命令行設置:
(1)查看Redis是否啟用密碼驗證:
127.0.0.1:6379> CONFIG GET requirepass
1) "requirepass"
2) "" #空字符串代表沒設置驗證密碼
(2)設置Redis密碼驗證:
127.0.0.1:6379> CONFIG SET requirepass "hisen" #設置密碼為hisen
OK
127.0.0.1:6379> CONFIG GET requirepass #查看密碼
1) "requirepass"
2) "hisen" #密碼已設置,為hisen
(3)驗證密碼有效性:
127.0.0.1:6379> GET name #沒輸密碼前,試圖獲取數據
(error) NOAUTH Authentication required. #顯示沒有認證的錯誤
127.0.0.1:6379> AUTH hisen #輸入認證密碼
OK #狀態為OK
127.0.0.1:6379> GET name #再次獲取數據
"hisen" #正確返回數據
Redis 性能測試工具之redis-benchmark
redis-benchmark [option] [option value]
redis-benchmark選項:
選項 | 描述 | 默認值 |
-h | 指定主機名 | 127.0.0.1 |
-p | 指定端口 | 6379 |
-s | 服務器socket | |
-c | 并發連接數 | 50 |
-n | 請求數 | 10000 |
-d | 以字節的形式指定SET/GET值的數據大小 | 2 |
-k | 1=keep alive 0=reconnect | 1 |
-r | SET/GET/INCR使用隨機key,SADD使用隨機值 | |
-P | 通過管道傳輸<numreq>請求 | 1 |
-q | 強制退出redis。僅顯示query/sec值 | |
--csv | 以CSV格式輸出 | |
-l | 生成循環,永久執行測試 | |
-t | 僅運行以逗號分隔的測試命令列表 | |
-l | ldle模式,僅打開N個idle連接并等待 | |
-a | 指定認證密碼 | |
-dbnum | 選擇數據庫號 | 0 |
-e | 標準輸出server回復的錯誤信息 |
示例:
[root@node7 ~]# redis-benchmark -h 127.0.0.1 -p 6379 -t set,lpush -c 100 -n 10000
====== SET ======
10000 requests completed in 0.07 seconds
100 parallel clients
3 bytes payload
keep alive: 1
98.23% <= 1 milliseconds
100.00% <= 1 milliseconds
147058.81 requests per second
====== LPUSH ======
10000 requests completed in 0.07 seconds
100 parallel clients
3 bytes payload
keep alive: 1
99.51% <= 1 milliseconds
100.00% <= 1 milliseconds
147058.81 requests per second
[root@node7 ~]# redis-benchmark -h 127.0.0.1 -p 6379 -t set,lpush -c 100 -n 10000 -q
SET: 144927.55 requests per second
LPUSH: 151515.16 requests per second
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。