mac 下nginx的預設nginx.conf檔案
概述
(redis.memcache(記憶體資料庫,快取記憶體),mongodb(文件資料庫))
入門概述
-
Nosql(not noly sql) 資料之間無關係,容易擴充套件 速度快:讀11w,寫8w
-
RDBMS VS NOSQL
- Rdbms:acid
- Nosql:cap定理,鍵值對儲存,
- 組成:Kv,Cache,Persistence
3v+3高
-
海量volume
-
多樣variety
-
實時velocity
-
高併發,
-
高擴充套件,
-
高效能
Nosql的經典應用
阿里sql 與nosql商品資訊的存放
-
第一代1999:Perl,CGI,Oracle
-
2000java時代:JAVA,servlet
-
2001-2004:EJB(SLSB,CMP,MDB) pattern(servletLocator,Delegate,Façade,DAO,DTO)
-
2005-2007:EJB重構:spring+ibatis+webx,antx(struts前身)
- 底層架構:iSearch,MQ+ESB,資料探勘,CMS
-
2008-2009:Memcached叢集,mysql+資料切分=cobar
-
2010:安全,映象,應用伺服器升級,秒殺,nosql,SSD
-
第四代:解決效能和海量資料問題
- 大規模memcached叢集,高效能伺服器,kv,cnd
- 安全問題:映象站
-
第五代2011:敏捷,開放,體驗
去IOE(去除IBM小型機,oracle資料庫,EMC儲存裝置)-雲端計算
Nosql資料模型簡介
- Kv鍵值
- Bson
- 列簇
- 圖形
Nosql資料庫的四大分類
-
Kv鍵值
- 新浪:Berkeley+redis
- 美團:redis+tair
- 阿里,百度:memcache+redis
-
文件資料庫
- bson:mongodb
-
列儲存資料庫
- Cassandra,Hbase,分散式檔案系統
-
圖關係資料庫
- 社交網路,關係圖,neo4j,infoGrid
在分散式資料庫中CAP原理
-
ACID
- A(Atomicity)原子性
- C(Consistency)一致性
- I(Isolation)獨立性
- D(Durability)永續性
-
CAP
- C(Consistency)強一致性
- A(Availability)可用性
- P(Partition tolerance)分割槽容錯性
-
CAP的3選2(注意)不能同時滿足三個
- CA:單點叢集,一致性,可用性
- CP:一致性,分割槽容錯,效能不是特別高
- AP:可用性,分割槽容錯,對一致性要求低:用的較多
-
經典CAP圖
-
Base
- 基本可用(Basically Available)
- 軟狀態(Soft state)
- 最終一致(Eventually consistent)
- 放鬆某時刻一致性的要求,由base解決
-
分散式+叢集簡介
- 分散式:不同伺服器:不同服務模組
- 叢集:不同伺服器:相同服務模組
Redis入門介紹
是什麼
-
Remote dictionary server(遠端字典服務)
-
c語言編寫,遵守BSD協議
-
Kv分散式儲存資料庫,基於記憶體執行,資料結構伺服器
-
特點
-
支援持久化
-
不僅支援kv,還提供list,set,zset,hash等
-
支援資料備份,即master-slave模式資料備份
-
做什麼
-
支援非同步將記憶體資料寫入硬碟,
-
釋出,訂閱系統訊息mq+nq:訊息中介軟體
-
定時器,計數器
-
最新的訊息放在記憶體中list.
怎麼做
-
資料型別,基本操作,配置
-
持久化,複製,RDB/AOF
-
事務控制
- 靈活性高,有時候事務回滾
- 例如3條語句,回滾2條錯的,另一個不會滾,與RDMS不同
-
複製
Redis安裝
下載地址:https://github.com/dmajkic/redis/downloads
Redis啟動後雜項基礎知識講解
-
單程序以epoll包裝.linux下多路複用io
-
預設16個數據庫,類似陣列下標從0開始.初始預設0號庫
-
Select命令切換資料庫 select 7選擇7號庫
-
Dbsize檢視當前資料庫key數量
-
Flushdb:清空當前庫
-
Flushall通殺全部庫
-
統一密碼管理,16個庫都是同樣密碼,要麼ok,要麼都連不上
-
Redis索引都是從0開始
-
預設埠6379->鍵盤6379->merz
-
Keys d* 顯示d開頭的key
Redis資料型別
Redis五大資料型別string,hash,list,set,zset
-
String:一個key一個value,二進位制安全,可包含任何資料,比如圖片,序列化物件,value最多512M
-
Hash:類似java中Map, 是一個string型別的filed和value的對映表,適合儲存物件
-
List:字串連結串列,按照插入順序,可以新增元素到頭部,尾部
-
Set:實際上是map,string型別無序集合,hashtable實現
-
Zset:string型別集合,不重複,每個元素關聯一個double分數,通過分數排序,分數可重複
獲得常見型別操作命令
Redis key
-
Key * 檢視所有
-
Exist key 判斷是否存在key(返回0表示無)
-
Move key db 當前庫就沒了,剪貼
-
Expire key 秒 設定過期時間
-
Ttl key 檢視還有多少時間過期 -1 不過期 -2 已過期(移除)
-
Type key 檢視key型別
-
Del key刪除型別(一般是設定過期時間)
-
Set key 多次會覆蓋
Redis String
-
單值單value
-
Set/get/del/append/strlen:拼接字元,返回長度
-
Incr/decr/incrby/decrby,一定要是數字才能進行加減
- Incdecrr k2:把k2的值加1,減1
- Incrby/decrby k2 步長x:每次加減x
-
Getrange/setrange:獲取指定區間的值,類似between and
- Getrange key 0 3:獲取key的0-3個字元
- Setrange key 2 x:設定第下標2開始到最後為x
-
Setex(set with expire)鍵秒值/setnx(set if not exist)
- Setx key time value;帶時間設定
- Setnx key value:如果存在不再新增
-
Mset/mget/msetnx
- Mset k1 v1 k2 v2 k3 v3:一次設定多個
- Mget k1 k2 k3:獲取,注意不能超出k4
- Msetnx k1 v1 k2 v2 k3 v3 k4 v4:存在的不再插入,不存在的也不再插入
-
Getset(先get再set)
Redis list
-
單值多value(l在上,r在下)
-
Lpush/rpush/lrange(已存在是新增是append)
Lpush list 0 1 2 3 4 5:0-5左邊新增list, 正進反出
lrange list 0 -1:輸出
rpush list 0 1 2 3 4 5:5-0右邊新增list,正進正出
- Lpop/rpop
Lpop list:返回輸出第一個,切彈出
Rpop lsit: 返回輸出第一個,切彈出
- Lindex:按照索引下標獲得元素
Lindex list 2:獲取下標2元素
-
Llen list:長度
-
Lrem key n v1:刪除n個v1元素
-
Ltrim key start end:擷取指定範圍給再給key(包括end):擷取後賦給自己
-
Rpoplpush 源列表 目的列表:把源列表頭 給目的列表
-
Lset key index value:設定下標index的值
-
Linsert key before/after v1:v1前後插入v1
-
若值全部移除,對應鍵也就消失,頭尾操作極高,中間較慢
Redis set
-
單值多value
-
Sadd/smembers/sismember
- Sad set01 1 1 2 2 3 3:只插入3 個,自己會去重
- Smember set:檢視
- Sismember set01 2:判斷是否存在
-
Scard:獲得集合裡面元素個數
-
Srem key value:刪除元素value
-
Srandmember key 3:
-
Spop key:隨機彈出一個
-
Smove key1 key2 numINkey1:將key1中的某個值移入key2
-
數學集合類
- 差集:sdiff sdiff set1 set2:返回差集(在第一個裡面,不再第二個裡面)
- 交集:sinter ......
- 並集:sunion.....
Redis hash
-
Kv模式不變,但v是一個鍵值對
-
Hset/hget/hmset/hmget/hgetall/hdel
- Hset user id 11: key -->user value ->id 11
- Hget user id:獲取;
- Hmset:設定多個
- Hmget:得到多個
- Hgetall:得到所有
- Hdel key value:刪除
-
Hlen:返回長度
-
Exists user id:判斷是否存在
-
Hkeys/hvals
- Hkeys user:得到所有的 key (id name)
- Hvals user:得到對應值
-
Hincrby/hincrbyfloat
- Hincrby user id 2:使id 加2
- Hincrbyfloat ....:改小數的值屬性
-
Hsetnx:新增,若不存在
Redis zset(sorted set)有序集合
Set k1 v1 k2 v2
Zset k1 score1(分數) v1 k2 score2 v2(比set多一個分數,用來排序)
-
Zadd/zrange:兩個值是一個整體
- Zrange key 0 -1:取出(v1 v2)
- Zrange key 0 -1 withscores:取出(v1 socre1 v2 score2)
-
Zrangebyscore key score1 score2 小到大:返回範圍內的(v1..不帶score)
- score1 score2:都包含
- (score1 (score2:都不包含
-
Limit 2 5:在返回的結果進行擷取(從結果下標2開始擷取5個)
-
Zrem key v1:刪除v1
-
Zcard key:返回數量 v的數量 不帶分數
-
Zcount key score1 score2:統計分數內個數
-
Zrank key v1:返回v1下標
-
Zscore key v1:返回v1的score
-
Zrevrank key v1:逆序獲得下標值
-
Zrevrange key 0 -1:逆序輸出 v1 v2
-
Zrevrangebyscore key 90 60(大到小):返回v2 v1
Units單位
- 1k=1000bytes;1kb=1024bytes;
- 不區分大小寫;不支援bit;
配置檔案
- Window不用更改,linux要改為yes:守護程序
- 程序管道id檔案 windows沒有
-
Port 6379
-
Tcp-backlog 511
windwos中在network部分設定tcp的backlog ,是一個連線佇列,佇列總和=未完成3次握手+已完成三次握手在高併發環境下需要一個高backlog值,避免客戶端連線緩慢,注意:linux核心會將這個值減小到/proc.sys/net/core/somacconn的值所以需要確認增大somaxconn和tcp_syn_backlog兩個值來達到效果
- 繫結的網絡卡埠
-
Timeout 0; 空閒多少秒後關閉空閒連線 0表示不斷
-
Tcp-keepalive:單位為s 設定為0不進行keepalive檢測,建議60s,每隔60秒檢查一下狀態是否良好
-
Loglevel:日誌級別預設四個
- debug (最詳細:a lot of information, useful for development/testing)
- verbose (many rarely useful info, but not a mess like the debug level)
- notice (moderately verbose, what you want in production probably)
- warning (最少:only very important / critical messages are logged)
-
Logfile "":日誌檔案
-
Syslog-enabled no:系統日誌開關
-
Syslog-ident redis:系統日誌檔名
-
Syslog-facility local0(值可以是user或local0到local7) window沒有
-
Database 16 :16個數據庫
-
存記憶體資料到硬碟
-
備份條件:Save time 修改次數(save "")不備份
- 15min內至少一個key變化
- 5min內10個key變化
- 1min內10000key變化
-
執行shutdown時會執行備份
-
手動備份save命令
-
Fushall也會執行save
-
Stop-writes-on-bgsave-error 備份出錯停止寫入,
-
Rdbchecksum:壓縮校驗crc64演算法,10%效能損耗
-
rdbcompression:是否啟動壓縮
Replication複製
-
Config get requirepass 獲得當前使用者密碼串,此時應為""空串
-
Config get dir :獲取服務啟動路徑(dir 配置檔案中)
- 當前路徑
- 當配置完path或用完整路徑時,即返回的是那個目錄路徑
-
Config set requirepass "123456",(立即加驗證)此時再次ping報錯
-
Auth 123456 即可
-
Maxmemory-policy:對於那些不常用的資料,佔記憶體:過期策略
- volatile-lru(最近最少使用:這對設定了過期時間的建) -> remove the key with an expire set using an LRU algorithm
- allkeys-lru -> remove any key according to the LRU algorithm
- volatile-random(隨機過期的鍵刪除:對有過期時間的有效) -> remove a random key with an expire set
- allkeys-random -> remove a random key, any key
- volatile-ttl(有限時間內:移除ttl只最小的,即即將過期的) -> remove the key with the nearest expire time (minor TTL)
- noeviction (預設永不過期,針對寫操作,會返回錯誤資訊)-> don't expire at all, just return an error on write operations
-
Maxmemory-samples
- 設定樣本數量:lru演算法最小ttl演算法都是非精確的,設定樣本大小,redis會預設檢查這麼多個key並選擇其中lru的那個..
Append only mode追加比rdb較好
- 開關,改變後啟動時會有appendonly.aof:記錄所有寫操作
-
最後一秒:故障.可能日誌檔案損壞,
- 兩者可同時存在,先載入aof,若失敗
- 就會載入dump.rdb
-
修復aof: redis-check-aof --fix appendonly.aof
-
Appendfilename:日誌檔名字
-
Appendfsync
- Always:同步化持久,每次改變立即記錄(效能差)
- Everysec:出廠設定,非同步操作每秒記錄,會損失1秒
- No:
-
No-appendfsync-on-rewrite:重寫時是否運用appendfsync 用no即可保證資料安全
-
Auto-aof-rewrite-min-size:設定重寫的基準值
-
Auto-aof-rewrite-percentage:設定重寫的基準值
常見配置redis.conf介紹
- Redis 守護程序啟動 daemonize no->yes
- 一守護程序方式啟動時 pid會寫入/var/run/redis.pid prefile / var/run/redis.pid指定
- Port 6379
- Bind 127.0.0.1
- Timeout 300
- Loglevel 日誌級別 debug,verbose,notice,warning 預設 verbose
- Logfile stdout:標準輸出路徑
- Database 16
- Dir ./:變值
- Requirepass ...
- Maxclient xxx:最大連線數
- Maxmemory xx:啟動時,載入資料,達到最大,嘗試清除將到期,或已到期key處理後,
- 又達到最大,無法寫,仍可讀.對於新的vm機制,會把key放入記憶體value放在swap區
Redis持久化
RDB(Redis DataBase)
-
是什麼
- 在指定時間內將資料寫入磁碟,即snapshot快照,恢復時寫入記憶體
- Redis會單獨建立(fork)子程序進行持久化,會先將資料寫入到臨時檔案,等待持久化過程結束,再用臨時檔案替換上次的檔案,整個過程主程序不需要io
- 大規模資料恢復,資料完整性不是很敏感,rdb比aof更高效,
- 缺點最後一次持久化資料可能丟失(每5min備份一次,可能最後一次備份時故障)
-
Fork
- 複製一個與當前程序一樣的程序,所有基本資料與原程序一致,但作為它的子程序執行
-
Rdb儲存的是dump.rdb檔案
-
配置位置 redis.conf
-
如何觸發rdb快照
- 配置檔案中預設的快照配置
- 命令save或是bgsave
- Save:只管儲存其他不管,全部阻塞
- Bgsave:非同步快照,備份同時可以響應請求,可以lastsave獲取最後一次成功快照時間
- 執行flushall 也會產生備份,但是空檔案,無意義
-
如何恢復
- 將備份檔案移入 redis安裝目錄
-
優勢
- 適合大規模資料恢復,對資料一致性完整性要求不高
-
劣勢
- 最後一次可能丟失,fork的時候記憶體資料克隆,效能問題
-
如何停止
- Redis-cli config set save ""
-
小總結
AOF(Append Only File:修復最後一次讀寫)
-
是什麼
- 以日誌形式記錄每個寫操作,
- 日誌只追加檔案,redis啟動會讀取檔案重新構建資料,
- 重啟根據日誌內容再次執行以完成恢復工作
-
Aof儲存的是appendonly.aof
-
配置位置
-
Aof啟動/恢復/修復
- 正常恢復:
- 啟動設定為appendonly no->yes
- 將所有資料aof檔案複製到對應目錄(config get dir)
- 重啟
- 異常恢復:
- 啟動:設定yes
- 找到被寫壞的aof檔案
- 修復:redis-check-aof --fix name
- 恢復:重啟
- 正常恢復:
-
Rewrite
- 是什麼?
- Aof採用追加方式,檔案越來越大,增加重寫
- 當檔案大小超過所設閾值時,aof內容壓縮
- 只保留可以恢復資料的最小指令集,使用命令
- Bgrewriteaof
- 重寫原理
- Aof增加,會fork新程序將檔案重寫:注意不是讀取aof,
- 讀取記憶體中資料重寫了一個aof,與快照類似
- 觸發機制
- 記錄上次重寫時aof大小,切大於64M
- 是什麼?
-
優勢
- 每秒同步,每修改同步,不同步
-
劣勢
- Aof檔案遠大於rdb,回覆速度慢
- 執行效率慢,儘量使用美妙同步策略,若不同步,效率與rdb相同
-
小總結
總結which one
-
官網建議:完整性低,快速->rdb
-
只做快取:可以不使用任何備份,不用持久化
-
同時開啟兩種:先aof,aof比rdb完整.建議保留rdb
Redis的事務
-
是什麼:一次多個命令,所有命令都會序列化,按順序序列
-
能幹嘛:一個佇列中,一次性,順序性,排他性,
-
怎麼做
-
常用命令
- Case 1:正常執行
- Case 2:放棄事務
- Case 3:全體連坐
- Case 4:冤頭債主
- Case 5:watch監控
- 悲觀鎖/樂觀鎖/cas(check and set)
- 悲觀鎖:修改時上鎖
- 樂觀鎖:不會上鎖,更新時判斷有沒有他人更新過資料,用版本號機制
- 提交版本必須大於記錄當前版本才能執行更新
-
小結
- Watch類似樂觀鎖
- 監控的資料被改,exec命令會被拋棄,返回nullmulti-bulk通知失敗
3階段
- Multi開啟事務
- 命令入隊
- 執行exec
3特性
-
單獨的隔離操作:不會被其他客戶端命令打斷
-
沒有隔離級別
-
不保證原子性:冤頭債主:全體連坐
Redis的釋出訂閱(瞭解)
- 是什麼:程序間的一種訊息通訊模式,傳送者pub傳送,訂閱者sub接受
- 命令
源->channel->client
案例
Redis的複製
-
是什麼
- Replication:主從複製,主機更新後,根據配置策略,自動同步到備機的matser/salver機制
- Master:寫;slave:讀
-
能幹嘛
- 讀寫分離
- 容災恢復
-
怎麼做
- 配從庫不配主庫
- 從庫配置:slaveof主庫ip主庫埠
- 每次master斷開之後都要重新連線,除非配置進redis.conf
- 修改配置檔案(不同的幾個庫)
- 拷貝多個redis.conf
- 開啟daemonize yes
- Pid檔名字
- 指定埠
- Log檔名字
- Dump.rdb名字
-
常用三招(以不同配置檔案啊啟動資料庫)
- 一主二僕
- 分別連線資料庫
- :Info replication//顯示狀態 都是master
- :主機新增資料v1
- :叢機:slaveof 主機ip port (全量複製,從機變為slave:只能讀)
- :主機:又加資料v2
- :叢機 get v2可以獲得,注意也能get v1
- 當主機故障:從機連線狀態down,從機原地待命,主機隨時連線
- 從機故障:再次恢復時:身份變為master,再次slaveof
- 薪火相傳
- 上一個slave可以使下一個slaver的master,slaver同樣可以接受其他slaves的連結和同步請求,和減少主庫的壓力
- 中途變更轉向:會清除之前資料.
- 中間的slave的身份:還是slave ,擔有連線的slave
- 反客為主
- 從機:Slaveof no one:狀態變為master
- 其他主機要同步時:要再次slaveof......
- 一主二僕
複製原理
-
Slave啟動後連線到master 會發送sync命令同步
-
Master接到後,若此時有修改資料命令,完成後再處理同步
-
全量複製:slave接收到資料庫檔案後
-
增量複製:master繼續將新資料傳給slave時,但只要是重新連線都會一次同步所有
哨兵模式sentinel
自動的反客為主:
-
調整結構:一主二僕
-
自定義/myredis目錄下新建sentinel.conf檔案,名字不能錯
-
主機配置哨兵sentinel.conf(可監控多個master)
- Sentinel monitor 資料庫名字(自己起) 127.0.0.1 6379 1(選擇主機方案,票數高的作為主機)
-
啟動redis-sentinel sentinel.conf
- 此時 主機故障, 一段時間後 會在從機中選出一個作為主機,(不用手動更改)
- 主機恢復時:slave:變為新主機的slave(有延遲)
複製的缺點
複製延時,slave多問題更嚴重
Redis的java客戶端(jedis)
Jedis常用操作
- 測試
Jedis jedis = new Jedis("127.0.0.1",6379);
System.out.println(jedis.ping());
Set jedis.set("k1","v1");
Get jedis.get("k1")
Set<String> listSet = jedis.keys("*");
-
事物提交
若事物執行時資料被更改,在執行exec時不會報錯,只是事物內容不再執行
-
主從複製
-
兩個庫,先各自獨立
-
Jedis jedis_M = new Jedis("127.0.0.1",6379); Jedis jedis_S = new Jedis("127.0.0.1",6380); jedis_S.slaveof("127.0.0.1", 6379); jedis_M.set("k", "v"); String result=jedis_S.get("k"); System.out.println(result); //很可能獲取不到(主從關係沒建立)太快了,再次執行即可
-