A. redis2.2和redis2.8的區別
根據Redis 兩個版本的測試結果對比得出以下結論
一、Redis 2.6主從同步在網路閃斷的情況下會自動開啟新的埠進行重新鏈,同時會進行一下操作:
1、斷開鏈接的從會向主發送SYNC命令
2、然後主fork進程導出rdb文件發送到從
3、從接收到完整的數據後,清空Redis內數據然後在從RDB中恢復
但是根據測試結果發現以下問題:
1、多個主從關系同時斷開的時候,主導出RDB文件時,會佔用大量內存
2、從接收到完整數據後,恢復數據的時候,會清空數據,這時候由於Redis數據量很大,目前10G左右內存恢復速度大約1分鍾左右,這一分鍾內,很多請求無法獲取數據
3、在從RDB恢復數據的過程中,部分請求會被阻塞,導致請求超時(目前報警無法獲取數據根次有關)
二、Redis 2.8.8 沒有發現以上問題,因為Redis 2.8鏈接閃斷重新連接後,從會從斷開之前的主從同步進度開始繼續同步,不會有全量恢復的問題
三、Redis 2.8 和 Redis 2.6 在進行save操作的時候,save過程中所有的請求都會被阻塞,導致前端請求失敗,所以不要再查詢的從上進行save操作
根據以上得出建議:
1、Redis 升級到 2.8 以上,保證數據主從同步時候的可用性
2、不要直接在Redis從或主上進行save操作,可以按王彬的建議在關鍵節點增加新的從用於save備份使用
3、建議優化Redis存儲,單個埠存儲數據不要過大,這樣可以保證單個埠掛掉數據數據時候的速度,和影響面積
Redis 2.8和SSDB性能對比
SSDB 1.6.8.6
順序寫 : 1.645 ms/op 59.4 MB/s
隨機寫 : 1.679 ms/op 58.2 MB/s
順序讀 : 1.286 ms/op 75.9 MB/s
隨機讀 : 1.225 ms/op 79.7 MB/s
rpush : 1.546 ms/op 63.2 MB/s
lpop : 1.303 ms/op 74.9 MB/s
Redis 2.8.8
順序寫 : 1.617 ms/op 60.4 MB/s
隨機寫 : 1.214 ms/op 80.4 MB/s
順序讀 : 1.156 ms/op 84.5 MB/s
隨機讀 : 1.153 ms/op 84.7 MB/s
rpush : 1.222 ms/op 79.9 MB/s
lpop : 1.153 ms/op 84.7 MB/s
分類一:鍵值資料庫
Redis, Voldemort, Oracle BDB,國內的ssdb
分類二:列存儲資料庫
Cassandra, HBase
分類三:文檔型資料庫
CouchDB, MongoDb,國內的SequoiaDB
分類四:圖形(Graph)資料庫
Neo4J, InfoGrid, Infinite Graph
C. vb題len("right("student",5)")
一、Len:求字元串的長度,返回 Long,其中包含字元串內字元的數目,或是存儲一變數所需的位元組數。
語法
Len(string | varname)
Right是取指定數量的字元。返回 Variant (String),其中包含從字元串右邊取出的指定數量的字元。
語法
Right(string, length)
二、如同:yp314311所說的一樣,Dim a(9)As Intger 共有10個元素,VB數組是以0為默認下標的,從0到9一共10個。
三、用Unload來卸載手動創建的控制項,哈,沒試過,不過應該不行吧!你試試嘍。
四、用VB程序代碼建立一個數據連接(D:\DATABASE\STUDENT.MDB)並打開連接,這里有幾種方法,你試下。
第一種:
Dim rsAccess As Recordset
Dim ConnAccess As New Connection
Dim StrSQLAccess As String
Dim i As Integer
DBSeaverPath="D:\DATABASE"
ConnAccess.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=" + DBSeaverPath + IIf(Len(DBSeaverPath) > 3, "\" &
"STUDENT.MDB;", "STUDENT.MDB;") + " Jet OLEDB:Database Password=;"
StrSQLAccess = "Select * from Users order by id asc"
Set rsAccess = New Recordset
rsAccess.Open StrSQLAccess, ConnAccess, adOpenStatic, adLockOptimistic
If rsAccess.RecordCount = 0 Then End
'Do While Not rsAccess.EOF
' ComboUserName.AddItem rsAccess!Username '此處調用
' rsAccess.MoveNext
'Loop'
rsAccess.Close
Set rsAccess = Nothing
ConnAccess.Close
Set ConnAccess = Nothing
第二種:
Dim strSQL As String
Dim OldWs As Workspace, mainDb As Database, TableMain As Recordset
Condata = "D:\DATABASE\STUDENT.MDB"
SaveSetting App.EXEName, "Data", "Path", Condata
ConStr = ";UID=" & ";PWD="
Set OldWs = DBEngine.Workspaces(0)
Set mainDb = OldWs.OpenDatabase(Condata, False, False, ConStr)
'mainDb.Execute "delete Users"' '此為刪除
Set TableMain = mainDb.OpenRecordset("select * from Users" & strSearchString)
TableMain.LockEdits = False
'Do Until TableMain.EOF
' If Not IsNull(TableMain("UserName").Value) Then
' UserNameText.AddItem TableMain("UserName").Value
' End If
'TableMain.MoveNext
'Loop
TableMain.Close
Set TableMain = Nothing
mainDb.Close
Set mainDb = Nothing
第三種:
'這是直接用控制項,在窗體是放一個DATA控制項再直接用,方便!
strSQL = "select * from Users order by id asc"
Data1.DatabaseName = "D:\DATABASE\STUDENT.MDB"
Data1.RecordSource = strSQL
Data1.Refresh
第四種:
'「工程」菜單中選擇「引用」菜單選擇「Microsoft DAO 3.51 Object Library」項'
Public AcessDB As Database
Dim TableMain As RecordSet
Public Sub OpenDatabase ( )
Dim sConeect As String
SConnect = ";PWD =; UID ="
Set AcessDB = Nothing
Set AcessDB = WorksPaces (0 ).OpenDatabase ("D:\DATABASE\STUDENT.MDB",False,sConnect)
End Sub
Set TableMain = AcessDB.OpenRecordSet ( "Users",dbOpenSnapshot )
'Do While Not TableMain.EOF
' ComboUserName.AddItem TableMain!Username '此處調用
' TableMain.MoveNext
'Loop
AcessDB.Close
Set AcessDB = Nothing
TableMain.Close
Set TableMain = Nothing
五、WITH語句主要用在控制項對像多屬性設置時,在一個單一對象或一個用戶定義類型上執行一系列的語句。具體說明如下:
語法
With object
[statements]
End With
With 語句的語法具有以下幾個部分:
描述
object 必要參數。一個對象或用戶自定義類型的名稱。
statements 可選參數。要執行在 object 上的一條或多條語句。
說明
With 語句可以對某個對象執行一系列的語句,而不用重復指出對象的名稱。例如,要改變一個對象的多個屬性,可以在 With 控制結構中加上
屬性的賦值語句,這時候只是引用對象一次而不是在每個屬性賦值時都要引用它。下面的例子顯示了如何使用 With 語句來給同一個對象的幾
個屬性賦值。
With MyLabel
.Height = 2000
.Width = 2000
.Caption = "This is MyLabel"
End With
注意 當程序一旦進入 With 塊,object 就不能改變。因此不能用一個 With 語句來設置多個不同的對象。
可以將一個 With 塊放在另一個之中,而產生嵌套的 With 語句。但是,由於外層 With 塊成員會在內層的 With 塊中被屏蔽住,所以必須在
內層的 With 塊中,使用完整的對象引用來指出在外層的 With 塊中的對象成員。
重點 一般來說,建議您不要跳入或跳出 With 塊。如果在 With 塊中的語句被執行,但是 With 或 End With 語句並沒有執行,則一個包含對
該對象引用的臨時變數將保留在內存中,直到您退出該過程。
參考:Visual Basic 語言參考-函數速查
D. 如何使用SSDB的zscan命令
SSDB(LevelDB 伺服器, NoSQL 存儲方案)的 zscan 是最強大的一條命令, 因為它操作的是 zset(sorted set) 數據類型, 只需要一條 zscan 命令就能直接地表達業務邏輯, "所寫即所想". 例如, 獲取用戶的未讀消息列表, 獲取按上架時間排序的商品列表, 獲取微博 timeline...
zset 可以理解為關系資料庫里具有兩個欄位的表, 一個欄位是 key, UNIQUE 索引, 也即數據的唯一標識; 另一個欄位是浮點型 score, 每一個 key 對應的排序權重值. 在關系資料庫中, 要分頁遍歷數據, 就要執行類似的一條 SQL 查詢:
select * from table order by score, key limit start, size
每一次查詢都會進行排序, 性能非常低. 而 SSDB 的 zset 中的數據是已經排好序的, 讀取時不需要進行排序. zscan 的命令原型為:
zscan name key_start score_start score_end limit
- name: 列表的標識
- key_start: 分頁遍歷列表時, 上一次遍歷到的最大(score)的一條數據 key
- score_start: 上一次遍歷到的數據的排序權重值最大值
- score_end: 想要遍歷的數據的排序權重值最大值
- limit: 分頁返回一次的數據條數
假設購物網站中有這樣的一個商品表:
id, title, price, update_time
展示商品列表時, 有時需要按價格 price 排序, 有時需要按更新時間 update_time 排序, 用 SSDB 怎麼解決? 那就需要建兩個 zset:
#zset 1
key = id
score = price
#zset 2
key = id
score = update_time
這就是 NoSQL 的常用設計模式, 將帶有 N 欄位的關系資料庫表分解成 N-1 個每個只有 2 個欄位的資料庫表, 這樣每個表對應一個 SSDB 的 zset.
E. jmeter 控制台有summary,輸出文件沒有
一、配置java環境 1:先查看系統32/64: uname -a 根據系統的版本去Oracle官網下載jdk,下載後安裝jdk即可。 2:配置JAVA環境變數: vi /etc/profile 追加如下內容: JAVA_HOME=/opt/jdk1.6.0_20 PATH=$JAVA_HOME/bin:$PATH CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/tools.jar export JAVA_HOME export PATH export CLASSPATH 其中的JAVA_HOME為jdk的安裝路徑 3:驗證 echo $PATH 或者 java -version 二、安裝resin 下載resin後,解壓運行安裝腳本: ./resin.sh console。然後在自己pc上訪問 server ip:port 看到resin默認歡迎頁面即說明安裝成功。之後把在web項目的war包拷進 ren目錄下的webapps 文件夾內,即可在外網訪問伺服器上的web項目了。 三、 安裝jmeter 下載:同樣在jemeter官網下載 對應的安裝包,解壓後執行:./jmeter -n -t ../ssdb_test.jmx -l ../log.jtl 命令說明: a.-n 參數說明不用驗證是否安裝了圖形庫 b. .jmx文件可以在windows環境下的用jmeter圖形化生成,涉及參數以及測試結果的.csv文件路徑可以直接 用notepad++ vi 等修改.jmx文件,確保其相對於.jmx文件路徑正確。 c.log.jtl 保存測試結果 既然沒裝圖形界面庫,那麼測試結果.jtl文件就只能在windows下用jmeter來查看了。執行效果如下: [@zjm_44_250 bin]# ./jmeter -n -t ../ssdb_test.jmx -l ../log.jtl Creating summariser <summary> Created the tree successfully using ../ssdb_test.jmx Starting the test @ Mon Dec 29 18:43:20 CST 2014 (1419849800772) Waiting for possible shutdown message on port 4445 summary = 100 in 0.3s = 289.9/s Avg: 105 Min: 3 Max: 285 Err: 0 (0.00%) Tidying up ... @ Mon Dec 29 18:43:21 CST 2014 (1419849801734) ... end of run 最後,執行命令:/home/apache-jmeter-2.8/bin/jmeter -n -t download.jmx -l log.jtl linux下最好輸全路徑,不然可能報bash:jeter:command not found,找不到執行文件錯誤,參數介紹如下: -n This specifies JMeter is to run in non-gui mode -t [name of JMX file that contains the Test Plan]. -l [name of JTL file to log sample results to]. -r Run all remote servers specified in JMeter.properties (or remote servers specified on command line by overriding properties) The script also lets you specify the optional firewall/proxy server information: -H [proxy server hostname or ip address] -P [proxy server port]
F. Redis,SSDB,Memcache和MongoDB的區別
額,說一下個人意見:mongodb,一般用來存儲比較大的數據,一般都是實時的,緩存成html沒多大意義 memacahe 確實是緩存到內存的,但是不是一直在內存中,會通過機制存儲到磁碟中,生成一個文檔,可是設置隔多少時間存儲一次
G. nosql資料庫有哪些
分類一:鍵值資料庫
Redis,
Voldemort,
Oracle
BDB,國內的ssdb
分類二:列存儲資料庫
Cassandra,
HBase
分類三:文檔型資料庫
CouchDB,
MongoDb,國內的SequoiaDB
分類四:圖形(Graph)資料庫
Neo4J,
InfoGrid,
Infinite
Graph
H. 架構高可用高並發系統的設計原則
通過學習《億級流量網站架構核心技術》及《linux就該這么學》學習筆記及自己的感悟:架構設計之高可用高並發系統設計原則,架構設計包括墨菲定律、康威定律和二八定律三大定律,而系統設計包括高並發原則、高可用和業務設計原則等。
架構設計三大定律
墨菲定律 – 任何事沒有表面看起來那麼簡單 – 所有的事都會比預計的時間長 – 可能出錯的事情總會出錯 – 擔心某種事情發生,那麼它就更有可能發生
康威定律 – 系統架構師公司組織架構的反映 – 按照業務閉環進行系統拆分/組織架構劃分,實現閉環、高內聚、低耦合,減少溝通成本 – 如果溝通出現問題,應該考慮進行系統和組織架構的調整 – 適合時機進行系統拆分,不要一開始就吧系統、服務拆分拆的非常細,雖然閉環,但是每個人維護的系統多,維護成本高 – 微服務架構的理論基礎 – 康威定律https://yq.aliyun.com/articles/8611– 每個架構師都應該研究下康威定律http://36kr.com/p/5042735.html
二八定律 – 80%的結果取決於20%的原因
系統設計遵循的原則
1.高並發原則
無狀態
無狀態應用,便於水平擴展
有狀態配置可通過配置中心實現無狀態
實踐: Disconf、Yaconf、Zookpeer、Consul、Confd、Diamond、Xdiamond等
拆分
系統維度:按照系統功能、業務拆分,如購物車,結算,訂單等
功能維度:對系統功能在做細粒度拆分
讀寫維度:根據讀寫比例特徵拆分;讀多,可考慮多級緩存;寫多,可考慮分庫分表
AOP維度: 根據訪問特徵,按照AOP進行拆分,比如商品詳情頁可分為CDN、頁面渲染系統,CDN就是一個AOP系統
模塊維度:對整體代碼結構劃分Web、Service、DAO
服務化
服務化演進: 進程內服務-單機遠程服務-集群手動注冊服務-自動注冊和發現服務-服務的分組、隔離、路由-服務治理
考慮服務分組、隔離、限流、黑白名單、超時、重試機制、路由、故障補償等
實踐:利用Nginx、HaProxy、LVS等實現負載均衡,ZooKeeper、Consul等實現自動注冊和發現服
消息隊列
目的: 服務解耦(一對多消費)、非同步處理、流量削峰緩沖等
大流量緩沖: 犧牲強一致性,保證最終一致性(案例:庫存扣減,現在Redis中做扣減,記錄扣減日誌,通過後台進程將扣減日誌應用到DB)
數據校對: 解決非同步消息機制下消息丟失問題
數據異構
數據異構: 通過消息隊列機制接收數據變更,原子化存儲
數據閉環: 屏蔽多從數據來源,將數據異構存儲,形成閉環
緩存銀彈
用戶層:
DNS緩存
瀏覽器DNS緩存
操作系統DNS緩存
本地DNS服務商緩存
DNS伺服器緩存
客戶端緩存
瀏覽器緩存(Expires、Cache-Control、Last-Modified、Etag)
App客戶緩存(js/css/image…)
代理層:
CDN緩存(一般基於ATS、Varnish、Nginx、Squid等構建,邊緣節點-二級節點-中心節點-源站)
接入層:
Opcache: 緩存PHP的Opcodes
Proxy_cache: 代理緩存,可以存儲到/dev/shm或者SSD
FastCGI Cache
Nginx+Lua+Redis: 業務數據緩存
Nginx為例:
PHP為例:
應用層:
頁面靜態化
業務數據緩存(Redis/Memcached/本地文件等)
消息隊列
數據層:
NoSQL: Redis、Memcache、SSDB等
MySQL: Innodb/MyISAM等Query Cache、Key Cache、Innodb Buffer Size等
系統層:
CPU : L1/L2/L3 Cache/NUMA
內存
磁碟:磁碟本身緩存、dirtyratio/dirtybackground_ratio、陣列卡本身緩存
並發化
2.高可用原則
降級
降級開關集中化管理:將開關配置信息推送到各個應用
可降級的多級讀服務:如服務調用降級為只讀本地緩存
開關前置化:如Nginx+lua(OpenResty)配置降級策略,引流流量;可基於此做灰度策略
業務降級:高並發下,保證核心功能,次要功能可由同步改為非同步策略或屏蔽功能
限流
目的: 防止惡意請求攻擊或超出系統峰值
實踐:
惡意請求流量只訪問到Cache
穿透後端應用的流量使用Nginx的limit處理
惡意IP使用Nginx Deny策略或者iptables拒絕
切流量
目的:屏蔽故障機器
實踐:
DNS: 更改域名解析入口,如DNSPOD可以添加備用IP,正常IP故障時,會自主切換到備用地址;生效實踐較慢
HttpDNS: 為了繞過運營商LocalDNS實現的精準流量調度
LVS/HaProxy/Nginx: 摘除故障節點
可回滾
發布版本失敗時可隨時快速回退到上一個穩定版本
3.業務設計原則
防重設計
冪等設計
流程定義
狀態與狀態機
後台系統操作可反饋
後台系統審批化
文檔注釋
備份
4.總結
先行規劃和設計時有必要的,要對現有問題有方案,對未來有預案;欠下的技術債,遲早都是要還的。
本文作者為網易高級運維工程師