1. 程式人生 > 實用技巧 >mac 下nginx的預設nginx.conf檔案

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分數,通過分數排序,分數可重複

獲得常見型別操作命令

http://redisdoc.com

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);
      //很可能獲取不到(主從關係沒建立)太快了,再次執行即可
      

Jedispool