redis
redis理論Redis:安裝和配置redis安裝配置和使用redisRedis Cluster程序環(huán)境:命令數(shù)據(jù)類型數(shù)據(jù)類型命令redis-cli命令Server相關(guān)的命令:Redis的持久化:redis cluster暫定
理論
存儲系統(tǒng)有三類
RDMS
NOSQL
NEWSQL
NoSQL:
? ACID:
? 原子性僚稿、一致性拖陆、隔離性、持久性未巫;
? 2phase commit, 3phase comit, ...
? non SQL, Not Only SQL; Web 2.0
? www.nosql-databases.orghttps://db-engines.com/en/ranking
CAP理論:一個分布式系統(tǒng)不可能同時滿足C、A排抬、P三個特性于毙,最多可同時滿足其中兩者哥倔;對于分布式系統(tǒng)滿足分區(qū)容錯性幾乎是必須的。
Consistency小腊、Availablity谤碳、Partition tolerence
C:多個數(shù)據(jù)節(jié)點上的數(shù)據(jù)一致;A:用戶發(fā)出請求后的有限時間范圍內(nèi)返回結(jié)果溢豆;可用性P:network partition蜒简,網(wǎng)絡(luò)發(fā)生分區(qū)后,服務(wù)是否依然可用漩仙;容錯性
一般的設(shè)計只能滿足其中兩個
AP :這種情況要求弱的一致性
CP
BASE:BA搓茬,S,E队他,基于CAP演化而來
x BA:Basically Available卷仑,基本可用;S:Soft state麸折,軟狀態(tài)/柔性事務(wù)锡凝,即狀態(tài)可以在一個時間窗口內(nèi)是不同步的;E:Eventually consistency垢啼,最終一致性窜锯;
NoSQL:Not Only SQL
特性:數(shù)據(jù)量大张肾、數(shù)據(jù)變化非常快(數(shù)據(jù)增長快锚扎、流量分布變化大吞瞪、數(shù)據(jù)間耦合結(jié)構(gòu)變化快)、數(shù)據(jù)源很多驾孔;
多種數(shù)據(jù)庫
column Family:列式數(shù)據(jù)庫, hbasedocument:文檔數(shù)據(jù)庫芍秆,mongodbGraphDB:圖式數(shù)據(jù)庫,Neo4j
Multimodel Databases: 多維存儲翠勉,對象數(shù)據(jù)庫Time Series / Streaming Databases:時間序列存儲
?
?
?
Redis:
Redis:Key-value NOSQl
kv cache and store
in-memory
持久化
主從(借助于sentinel 實現(xiàn)一定意義上的HA)
Clustering(分布式)
Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker.
開源妖啥、內(nèi)存存儲、數(shù)據(jù)結(jié)構(gòu)存儲对碌;數(shù)據(jù)庫荆虱、緩存、消息隊列俭缓;
It supports data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs and geospatial indexes with radius queries.
數(shù)據(jù)結(jié)構(gòu):字符串克伊、列表(數(shù)組)、hashes(關(guān)聯(lián)數(shù)組)华坦、集合愿吹、有序集合、bitmaps惜姐、hyperloglogs犁跪、空間索引;
Redis has built-in replication, Lua scripting, LRU e viction, transactions and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster.
內(nèi)建的復(fù)制歹袁、Lua scripting坷衍、LRU、事務(wù)条舔、持久存儲枫耳、高可用(Sentinel,Redis Cluster)
REmote DIctionary Server:數(shù)據(jù)結(jié)構(gòu)服務(wù)器孟抗,k/v迁杨,數(shù)據(jù)結(jié)構(gòu);
內(nèi)存存儲:in-memroy持久化主從(sentinel)Cluster(shard)
redis-check-dump & redis-check-aof
Corrupted RDB /AOF files utilities
安裝和配置redis
安裝
進入這個網(wǎng)站:http://pkgs.org/download/redis
找尋符合的系統(tǒng)凄硼,配置yum源
yum install
配置和使用redis
所有的配置段:grep -i "^###" /etc/redis.conf
基本配置項網(wǎng)絡(luò)配置項持久化相關(guān)配置復(fù)制相關(guān)的配置安全相關(guān)配置Limit相關(guān)的配置SlowLog相關(guān)的配置INCLUDESAdvanced配置
通用配置項:
daemonize, supervised, loglevel, pidfile, logfile,
databases:設(shè)定數(shù)據(jù)庫數(shù)量铅协,默認為16個,每個數(shù)據(jù)庫的名字均為整數(shù)摊沉,從0開始編號狐史,默認操作的數(shù)據(jù)庫為0;
切換數(shù)據(jù)庫的方法:
SELECT <dbid>
網(wǎng)絡(luò)配置項:
bind IPport PORTprotected-modetcp-backlogunixsocket timeout:連接的空閑超時時長;
安全配置:
requirepass <PASSWORD> # 做認證用的rename-command <COMMAND> <NEW_CMND_NAME>
在AOF或Replication環(huán)境中骏全,不推薦使用苍柏;
Limits相關(guān)的配置:
maxclientsmaxmemory <bytes>maxmemory-policy noeviction
淘汰策略:volatile-lru(擁有過期時間的鍵,最近最少使用), allkeys-lru, volatile-random(擁有過期時間的鍵吟温,隨機), allkeys-random, volatile-ttl(按離終結(jié)時間近的進行淘汰), noeviction(不啟用淘汰機制)
maxmemory-samples 5
淘汰算法運行時的采樣樣本數(shù)序仙;
SlowLog相關(guān)的配置:
slowlog-log-slower-than 10000
單位是微秒突颊;
slowlog-max-len 128
SlowLog記錄的日志最大條目鲁豪;
ADVANCED配置:數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)域支持量
設(shè)置ziplist的鍵數(shù)量最大值律秃,每個值的最大空間爬橡;
hash-max-ziplist-entries 512 hash-max-ziplist-value 64
客戶端輸出緩沖空間的大小:
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>
Redis Cluster
?
程序環(huán)境:
配置文件:/etc/redis.conf
主程序:/usr/bin/redis-server
6379/tcp
客戶端:/usr/bin/redis-cli
Unit File:/usr/lib/systemd/system/redis.service
數(shù)據(jù)目錄:/var/lib/redis
命令
redis-cli # 安裝完成可以直接連接
?
?
help
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
數(shù)據(jù)類型
Strings, Lists, Hashs, Sets, Sorted Sets, Bitmaps, Hyperloglogs
數(shù)據(jù)類型
使用hele @下面這些value能查看詳細信息
redis:k/v:
key:直接ASCII字符串棒动;
value:strings, lists, hashes, sets, sorted sets, bitmaps, hyperloglogs
group
group: @generic, @string, @list, @...
string
@string SET GET EXISTS INCR DECR SETNX SETEX INCRBYFLOAT MGET MSET
list
@list LPUSH RPUSH LPOP RPOP LPUSHX RPUSHX LRANGE LINDEX LSET
?
set
@set SADD SPOP SREM SRANDMEMBER SINTER SUNION SDIFF
sort_set
@sorted_set ZADD ZCARD ZCOUNT ZRANK ...
?
hash
@hash HSET HMSET HGET HMGET HKEYS HVALS HDEL HGETALL ...
pubsub
@pubsub PUBLISH SUBSCRIBE UNSUBSCRIBE PSUBSCRIBE PUNSUBSCRIBE ...
?
事務(wù):
通過MULT糙申,EXEC,WATCH等命令實現(xiàn)事務(wù)功能船惨,將一個或多個命令并歸一個操作提請服務(wù)器按順序執(zhí)行的機制
MUTI:啟動一個事務(wù)
EXEC:執(zhí)行一個事務(wù)柜裸;
一次性將事務(wù)中的所有操作執(zhí)行完成后返回給客戶端;
WATCH:樂觀鎖粱锐,EXEC命令執(zhí)行前疙挺,用于監(jiān)控指定數(shù)量鍵,如果如果監(jiān)控中的某任意鍵數(shù)據(jù)被修改怜浅,則服務(wù)器拒絕執(zhí)行事務(wù)
?
?
回顧:
分布式系統(tǒng)兩個基礎(chǔ)理論:CAP/BASE
CAP:AP铐然,CP C、A恶座、P:三者其中之二搀暑; AP:可用性、分區(qū)容錯性跨琳、弱一致性自点;BASE:BA,S脉让,E BA:基本可用桂敛、S:軟狀態(tài)、E:最終一致性侠鳄;
分布式系統(tǒng):
分布式存儲:
NoSQL:
kv埠啃、document、column families伟恶、GraphDB
分布式文件系統(tǒng):文件系統(tǒng)接口
分布式存儲:API碴开,不能掛載;
分布式運算:mapreduce, ...
?
NewSQL:
PingCAP:TiDB(MySQL protocol)...
?
redis:REmote DIctionary Server
數(shù)據(jù)結(jié)構(gòu):String, List, Set, sorted_set, Hash, pubsub ...
命令
redis-cli命令
Usage: redis-cli OPTIONS]]-h HOST-p PORT-a PASSWORD-n DBID
與Connection相關(guān)命令:
help @connection
AUTH <password> ECHO <message>PING QUITSELECT dbid
清空數(shù)據(jù)庫:
FLUSHDB:Remove all keys from the current database 清空當前數(shù)據(jù)庫; FLUSHALL:Remove all keys from all databases 清空所有數(shù)據(jù)庫潦牛;
Server相關(guān)的命令:
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] INFO:服務(wù)器狀態(tài)信息查看眶掌;分為多個secion; INFO [section]
配置運行時參數(shù)
CONFIG GET # 獲取設(shè)定 CONFIG RESETSTAT #重置計數(shù)器 CONFIG REWRITE #可重寫配置為文件巴碗,讓運行時配置寫入文件 CONFIG SET # 設(shè)置 參數(shù)
?
Redis的持久化:
RDB:snapshotting, 二進制格式朴爬;按事先定制的策略,周期性地將數(shù)據(jù)從內(nèi)存同步至磁盤橡淆;數(shù)據(jù)文件默認為dump.rdb召噩;客戶端顯式使用SAVE或BGSAVE命令來手動啟動快照保存機制;
SAVE:同步逸爵,即在主線程中保存快照具滴,此時會阻塞所有客戶端請求;
BGSAVE:異步师倔;
AOF:Append Only File, fsync
記錄每次寫操作至指定的文件尾部實現(xiàn)的持久化构韵;當redis重啟時,可通過重新執(zhí)行文件中的命令在內(nèi)存中重建出數(shù)據(jù)庫趋艘;
BGREWRITEAOF:AOF文件重寫疲恢;
不會讀取正在使用AOF文件,而是通過將內(nèi)存中的數(shù)據(jù)以命令的方式保存至臨時文件中瓷胧,完成之后替換原來的AOF文件显拳;
?
1.RDB相關(guān)的配置: 快照
*save <seconds> <changes>save 900 1save 300 10save 60 10000
表示:三個策略滿足其中任意一個均會觸發(fā)SNAPSHOTTING操作;900s內(nèi)至少有一個key有變化抖单,300s內(nèi)至少有10個key有變化萎攒,60s內(nèi)至少有1W個key發(fā)生變化;
stop-writes-on-bgsave-error yes
dump操作出現(xiàn)錯誤時矛绘,是否禁止新的寫入操作請求耍休;
rdbcompression yes
是否進行文件壓縮
rdbchecksum yes
對rdb文件進行校驗
dbfilename dump.rdb
指定rdb文件名
*dir /var/lib/redis:rdb
文件的存儲路徑
?
.AOF相關(guān)的配置
appendonly noappendfilename "appendonly.aof"?appendfsync ;將數(shù)據(jù)從內(nèi)核內(nèi)存寫到磁盤上面 Redis supports three different modes: no:redis不執(zhí)行主動同步操作,而是OS進行货矮; everysec:每秒一次羊精; always:每語句一次; no-appendfsync-on-rewrite no 是否在后臺執(zhí)行aof重寫期間不調(diào)用fsync囚玫,默認為no喧锦,表示調(diào)用; auto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mb 上述兩個條件同時滿足時抓督,方會觸發(fā)重寫AOF燃少;與上次aof文件大小相比,其增長量超過100%铃在,且大小不少于64MB;
重寫過程
redis 主進程通過fork創(chuàng)建子進程
子進程根據(jù)redis內(nèi)存中的數(shù)據(jù)創(chuàng)建數(shù)據(jù)庫重建命令順序于臨時文件中
父進程繼承Client的請求阵具,并會把這些請求中的寫操作繼續(xù)追加到原本的AOF文件碍遍,額外的,這些新的寫請求還會被放置于一個緩沖隊列中
父進程用臨時文件替換老的aof文件
?
aof-load-truncated yes
注意:持久機制本身不能取代備份阳液;應(yīng)該制訂備份策略怕敬,對redis庫定期備份;
RDB與AOF同時啟用: 不建議
(1) BGSAVE和BGREWRITEAOF不會同時進行帘皿;(2) Redis服務(wù)器啟動時用持久化的數(shù)據(jù)文件恢復(fù)數(shù)據(jù)东跪,會優(yōu)先使用AOF;
redis cluster
redis的集群技術(shù):
主/從
主:rw從:read-only
客戶端分片代理分片:
主從復(fù)制
特點:
一個Master可以有多個slave主機鹰溜,支持鏈式復(fù)制虽填;
Master以非阻塞方式同步數(shù)據(jù)至slave主機;
?
配置slave節(jié)點:
redis-cli> SLAVEOF <MASTER_IP> <MASTER_PORT>redis-cli> CONFIG SET masterauth <PASSWORD>
配置參數(shù):
slaveofmasterauth ?[replication] 段的內(nèi)容slave-serve-stale-data yesslave-read-only yes*repl-diskless-sync no no, Disk-backed, Diskless
新的從節(jié)點或某較長時間未能與主節(jié)點進行同步的從節(jié)點重新與主節(jié)點通信奉狈,需要做“full synchronization"卤唉,此時其同步方式有兩種style:
Disk-backend:主節(jié)點新創(chuàng)建快照文件于磁盤中涩惑,而后將其發(fā)送給從節(jié)點仁期;
Diskless:主節(jié)占新創(chuàng)建快照后直接通過網(wǎng)絡(luò)套接字文件發(fā)送給從節(jié)點;為了實現(xiàn)并行復(fù)制竭恬,通常需要在復(fù)制啟動前延遲一個時間段跛蛋;
repl-diskless-sync-delay 5repl-ping-slave-period 10?repl-timeout 60?repl-disable-tcp-nodelay norepl-backlog-size 1mb?slave-priority 100
復(fù)制集群中,主節(jié)點故障時痊硕,sentinel應(yīng)用場景中的主節(jié)點選舉時使用的優(yōu)先級赊级;數(shù)字越小優(yōu)先級越高,但0表示不參與選舉岔绸;
min-slaves-to-write 3:主節(jié)點僅允許其能夠通信的從節(jié)點數(shù)量大于等于此處的值時接受寫操作理逊;
min-slaves-max-lag 10:從節(jié)點延遲時長超出此處指定的時長時,主節(jié)點會拒絕寫入操作盒揉;
sentinel:不能只有一個晋被,至少三個
? 主要完成三個功能:監(jiān)控、通知刚盈、自動故障轉(zhuǎn)移
? 選舉:流言協(xié)議羡洛、投票協(xié)議
配置項:
port 26379?sentinel monitor <master-name> <ip> <redis-port> <quorum>?sentinel auth-pass <master-name> <password>
<quorum>表示sentinel集群的quorum機制,即至少有quorum個sentinel節(jié)點同時判定主節(jié)點故障時藕漱,才認為其真的故障欲侮; s_down: subjectively down o_down: objectively down
sentinel down-after-milliseconds <master-name> <milliseconds>
監(jiān)控到指定的集群的主節(jié)點異常狀態(tài)持續(xù)多久方才將標記為“故障”;
sentinel parallel-syncs <master-name> <numslaves>
指在failover過程中肋联,能夠被sentinel并行配置的從節(jié)點的數(shù)量威蕉;
sentinel failover-timeout <master-name> <milliseconds>
sentinel必須在此指定的時長內(nèi)完成故障轉(zhuǎn)移操作,否則橄仍,將視為故障轉(zhuǎn)移操作失斎驼恰;
sentinel notification-script <master-name> <script-path>
通知腳本,此腳本被自動傳遞多個參數(shù)氓奈;
暫定
發(fā)布和訂閱(publish/subscribe)
頻道:消息隊列
SUBSCRIBE:訂閱一個或多個隊列
PUBLISH:向頻道發(fā)布消息
UNSUBSCRIBE:退訂此前訂閱的頻道
PSUBSCRIBE:模式訂閱
?
? ?
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>
豌豆莢:codistwitter:twemproxy
課外實踐:codis的測試和應(yīng)用翘魄;
? ? ? ? ? ?
博客作業(yè): (1) replication, sentinel (2) rdb, aof 課外實踐: (1) codis (2) redis cluster
? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?