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
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