Redis - PUBSUB、PUBLISH 介紹
Redis - PUBSUB、PUBLISH 介紹
PUBSUB
查詢訂閱狀態與發佈系統的狀態
> PUBSUB xxxchanne
PUBLISH
將訊息發送到指定的 channel
> PUBLISH xxxchanne "Message Say Hi"
Marketing, SEO, Web trends, Programming tutorial, Web design, and Life event...
查詢訂閱狀態與發佈系統的狀態
> PUBSUB xxxchanne
將訊息發送到指定的 channel
> PUBLISH xxxchanne "Message Say Hi"
Subscribe 允許 client 端訂閱一個或多個 channels
> SUBSCRIBE channel [channel ...]
當 client 端 subscribe 某個 channels 之後,
除了subscribe相關指令(subscribe, psubscribe, unsubscribe, punsubscribe ),
一律不允許使用其他 commands
> SUBSCRIBE xxxchannel
Reading messages...(press Ctrl-C to quit)
1) "subscribe"
2) "xxxchannel"
3) (integer) 1
1) "message"
2) "xxxchannel"
3) "a"
使用 PSUBSCRIBE 訂閱一個或多個頻道時,可以透過一些模式,來訂閱
? : 表示任一字元
例如: H?llo 會包含 Hello, Hallo, Hbllo, Hcllo, ……. H*llo 會包含 Heeeeello, Hllo, Hxllo…… H[ae]llo 會包含 Hello, Hallo (但不包括 Hllo)
Continue ReadingRedis client 每次發送一筆 command 都會經過 發送命令> 命令列隊(排隊)> 執行 > 返回結果 ,這期間所需要的時間,就稱為RTT(Round Trip Time, 往返時間)
Redis 通常可以執行在微秒等級,但是在不同網路環境,就會因網路本身的傳輸限制而有所差異,因此才有Redis 性能瓶頸就是網路 一說
pipeline 可以將多筆資料同時發送出去,
如果不使用 pipelining,每一個command 從訪問資料結構、取得回覆,看起來耗費的流量都非常小,
但對於 socket I/O 而言,每個訪問都執行一次comman,占用的效能成本就相當大
當使用 pipelining,可以將多個指令組成一次發送出去,讓系統只需讀取一次 read(),並且將多個回覆內容也組成一次輸出 write()
雖然 pipeline 可以減少 RTT,減少IO調用次數
但是直接發送 command 只需要 Redis server 端處理,
透過 pipeline 則需要 server 端-client端 共同實現
因此仍須注意 pipeline 大小,是否會超過 Client端的緩存限制,若超過則緩存刷新或直接發送,可能會發生無法預期的問題
通常對於過大的 pipeline ,可以透過拆分來完成減少單次大小
通常為了讓Redis可以有更好的負載能力,都會在 Redis 前面外加一個代理,例如: Codis Pipeline 緩存默認10K,3.1則是1024,Jedis 緩存默認為 8192
Continue Reading台灣證券交易所規範了FIX通訊協定作業平台,簡稱FIX
證交所TCP/IP資訊網路透過MPLS架構,讓證交所與每個券商主機之間都設定了點對點固定IP VC(Virtual Circuit)連線
通常發起端為證券商,建立連線之後傳送登入訊息讓證交所驗證,
FIX協定為非同步傳輸方式,可連續傳送委託單
基本介紹如下:
FIX tag 組成包括:
Header 固定開頭為:
8=FIX.4.4<SOH>
Body 是要傳送的內容,基本格式為:
Key=Value<SOH>....
Trailer 結束使用的格式為: 其中 nnn 是透過 CheckSum 計算出的數值
10=nnn<SOH>
FIX Session 主要用於登入、交換訊息、登出:
發起端無傳送登入訊息 當發起端原本應該傳送登入訊息給接收端,超過60秒未傳送登入訊息,連線就會主動中斷 這時發起端就要再重新連線
接收端驗證 接收端會驗證登入訊息,若驗證成功會立即回覆 Logon 登入訊息,若驗證失敗會回覆 Logout 登出信息
開始同步 發起端接收到 Logon 登入訊息後,就能開始傳送其他訊息
Continue Reading電腦世界處理的基礎是 0 跟 1,我們稱之為二進位(binary)
二進位可以在組成十進位 0~9
不同的系統或程式對於十六進位都有不同的描述方式,但是基本概念如下:
十六進位則是由 09 AF 組成
十六進位剛好是 4^2 ,轉二進位相當容易
例如: 二進位 01011110101101010010 可直接轉十六進位 5EB52
另外是 Byte 共 8 Bit
其中將 4 個 Bit 剛好可儲存一個16進位
各種場合帶入16進位方式
| 環境 | 格式 | 備註 |
|---|---|---|
| URL | %hex | |
| XML,XHTML | &#xhex | |
| HTML,CSS | #hex | 6位,用於表示顏色 |
| Unicode | U+hex | 6位,表示字符編碼 |
| MIME | =hex | |
| Modula-2 | #hex | |
| Smalltalk,ALGOL 68 | 16rhex | |
| Common Lisp | #xhex或#16rhex | |
| IPv6 | 8個hex用:分隔 |
ASCII(American Standard Code for Information Interchange,美國標準資訊交換碼)是由美國國家標準局(ANSI)訂定的字元標準
並且已經被國際標準組織(ISO)公認為國際標準,現今多數語系編碼都會都會參考 ASCII 的格式
接下來介紹如何從2進位轉10進位來取得參照值
1 Byte = 8 Bit
每一個 Bit 都可以存取一個二進位 (即 0, 1)
可以試想,1Byte提供了8個空間 [][][][][][][][]
,每一個空間都可以塞一個2進位值,例如: [0][0][0][0][0][0][0][0]
接下來,計算從2進位轉10進位方式:
例如 n 表示為 0或1
[2^7n]+[2^6n]+[2^5n]+[2^4n]+[2^3n]+[2^2n]+[2^1n]+[2^0n]
其 [0][0][0][0][0][0][0][1] 就可以計算程 [2^70]+[2^60]+[2^50]+[2^40]+[2^30]+[2^20]+[2^10]+[2^01] = 1 其 [0][0][0][0][0][0][1][0] 就可以計算程 [2^70]+[2^60]+[2^50]+[2^40]+[2^30]+[2^20]+[2^11]+[2^00] = 2 其 [0][0][0][0][0][0][1][1] 就可以計算程 [2^70]+[2^60]+[2^50]+[2^40]+[2^30]+[2^20]+[2^11]+[2^01] = 3
根據這些每一個10進位狀態,可以對應到一個字母
可直接參考下方 ASCII 編碼表


資料傳輸常見Json, XML 的方式傳送,但這裡我們要說明的是在細節一點的格式傳輸方式
一般各種格式的資料,傳輸前都必須轉為 byte 格式
例如,數字、字串… 轉為 byte ,再用 byte 格式傳送
證券即時行情、各類統計資訊傳輸,都相當要求速度及品質
因此國內證交所即採用 FIX(Financial Information eXchange) 傳輸協定搭配FAST資料流壓縮技術,來達到一定的效率
例如,證交所資料伺服器(MDS, Market Data Server) 主要負責Fix/Fast資料處理
處理後會透過內網分送到不同 VM DAP-RT (Data Access Point Real-Time)
每一個界接資訊的用戶,都可以連線到專屬的 DAP-RT
FIX 基本格式為 Tag=Value Tag=Value….
FIX 雖然可讀性高,但是純字串格式傳輸效能並不好
因此,會再將此字串透過 FAST 壓縮成二進位,提升資料傳輸速度
除此外,FAST 資料格式會在第一個 bit 作為判別是否還有其他資料(1:有, 0:結束)
前面提到的 byte 轉換方式,可以結合FIX 的格式來建立資料
將FIX字串轉換為 byte 格式,接著就可以透過 Socket…各種方式將資料傳送出去
//傳送byte資料
string transferData = "001=Adam 002=0999888777 003=Male 004=Tw";
byte[] buff = Encoding.Default.GetBytes(transferData);
接收方 byte 格式資料後,可將轉換為字串 在依照兩方溝通的FIX對照方式,參照資料意義
Continue Reading二進位 (binary, bin) 主要由 0, 1 構成
十進位 (Octal, oct) 即 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
十六進位 (Hexadecimal, hex) 即 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F
其中 AF 即 1015
C# 二進位轉十進位
Console.WriteLine(Convert.ToInt32("1111", 2).ToString("D"));//Binary To Decimal
> Output: 15
C# 二進位轉十六進位
Console.WriteLine(Convert.ToInt32("1111", 2).ToString("X"));//Binary To Hexadecimal
> Output: F
C# 十進位轉二進位
Console.WriteLine(Convert.ToString(15, 2));//Decimal To Binary
C# 十進位轉十六進位
Continue ReadingC# 有兩個類別可以用來調控執行緒
AutoResetEvent.WaitOne 方法可以讓執行緒進入 Join (WaitSleepJoin) 暫停狀態
AutoResetEvent.Set 方法可以讓暫停狀態的執行緒恢復運作 ManualResetEvent 則需要呼叫 .Set 與 .Reset
這裡舉例,在 A B 兩個任務類別中
在 任務A 執行了 WaitOne() 先讓 任務A 進入 WaitSleepJoin Block 狀態
當 任務B 執行到偶數時,就執行 Set() 將 A任務 恢復運作
class Program
{
private Thread MissionA_Thread;
private Thread MissionB_Thread;
private static AutoResetEvent _AutoResetEvent = new AutoResetEvent(false);
static void Main(string[] args)
{
Program mProgram = new Program();
mProgram.ProvideMission();
Console.ReadKey();
}
private void ProvideMission()
{
//指定委派A物件
ThreadStart MissionA_Tg = new ThreadStart(MissionA);
//建立A任務執行緒
MissionA_Thread = new Thread(MissionA_Tg);
//指定委派B物件
ThreadStart MissionB_Tg = new ThreadStart(MissionB);
//建立B任務執行緒
MissionB_Thread = new Thread(MissionB_Tg);
//啟動執行緒
MissionA_Thread.Start();
MissionB_Thread.Start();
}
//任務A
private void MissionA()
{
for (int i = 0; i < 10; i++)
{
_AutoResetEvent.WaitOne();
Console.WriteLine("A" + i);
Thread.Sleep(1000);
}
}
//任務B
private void MissionB()
{
for (int i = 0; i < 10; i++)
{
if (i % 2 == 0)
{
_AutoResetEvent.Set();
}
Console.WriteLine("B" + i);
Thread.Sleep(2000);
}
}
}
若是 ManualResetEvent 則需要再多加一次 Reset()
Continue ReadingC# 可以實作 ping 網路連線檢查
實作方式如下:
class Program
{
static void Main(string[] args)
{
//INIT PING OBJECT
System.Net.NetworkInformation.Ping objPing = new System.Net.NetworkInformation.Ping();
//設定測試連線及逾時時間
System.Net.NetworkInformation.PingReply PingResult = objPing.Send("www.google.com.tw", 5000);
//取得結果
string pingMsg = (PingResult.Status == System.Net.NetworkInformation.IPStatus.Success) ? "連線成功" : "無法連線";
Console.WriteLine(pingMsg);
Console.ReadKey();
}
}
C# Thread 執行緒
程式都會有一個主處理序
例如,在同一個主處理序,可能同時會需要送出多筆訂單、讀取大型檔案等項目要排隊
在這主要的處理序,可以額外建立新的執行緒,可以將指定的任務交給新的執行緒獨立處理
通常,需要長時運算、 等待回應的流程,就會透過建立新的執行緒來獨立運算,避免影響到其他流程
Continue Reading首先安裝 Redis 環境
下載Redis壓縮,解壓縮後,make執行安裝
wget http://download.redis.io/releases/redis-4.0.10.tar.gz
tar xzf redis-4.0.10.tar.gz
cd redis-4.0.10
make
src/redis-server
src/redis-cli
接著就能測試新增及取得一筆資料
> set name helloworld
OK
> get name
"helloworld"
在測試新增及取得資料時,已經有使用過 SET 以及 GET 的方法
在 SET 資料時,可以透過冒號 : 來輔助設計key
例如,建立 admin 相關資料時,可以這樣做
set admin:name adam
set admin:id 1
set admin:phone 0912345678
get admin:name
get admin:id
get admin:phone
透過 DEL, INCR 來針對數值遞增或遞減
Continue Reading通常,MACOS Sierra都會預設安裝PHP5.6版本
這裡針對升級到更高階PHP版本流程進行說明:
可以透過brew 或者 curl 兩種方式來安裝 Brew
brew update && brew upgrade
brew tap homebrew/dupes
brew tap homebrew/versions
brew tap homebrew/homebrew-php
brew unlink php56
brew install php72
(如果要從7.1升級到7.2,作法如下:)
brew tap homebrew/homebrew-php
brew unlink php71
brew install php72
brew install php72-xdebug
在這過程中,如果php5.6不是透過 brew 安裝,很可能會發生錯誤
這時仍可以繼續透過 CRUL的方式來安裝
curl -s http://php-osx.liip.ch/install.sh | bash -s 7.2
安裝完畢後,可以透過下方語法檢查PHP版本
php -v
如果還無法取得到PHP7版本,可以透過輸入下面的指令來更新路徑,來取得正確版本
vim ~/.profile
# 將下面這行加入~/.profile 最後一行
export PATH=/usr/local/php5/bin:$PATH
# 離開後,接著執行
source ~/.profile
上方的路徑,可能要依照你的環境來進行調整 如果上方指令仍無法運作,最後可以再試試這個方式
export PATH="$(brew — prefix homebrew/php/php72)/bin:$PATH"
祝安裝順利,也別忘了幫我按個讚
Continue Reading
React Native 官方在6/14發布一則訊息 為了使React Native更輕量化並更好地適應現有的應用程式,官方正式宣布,正式啟動重構專案
React Native 每天都在更新,在去年有超過500個開發者貢獻了超過2500次提交。
在過去的5年中,發現最初的原則,造成了後續維護上的難處,並且無法靈活的與其他本地API溝通。因此,他們已經開始研究React Native的大規模重構方式,希望能讓架構更加靈活,並更好地支援JavaScript與本地API集成。
Continue ReadingC# 如何產生 GUID?
可以直接透過內建方法,產生 GUID:
Guid guid = Guid.NewGuid();
MessageBox.Show("GUID1:"+guid);
guid = Guid.NewGuid();
MessageBox.Show("GUID2:"+guid);
guid = Guid.NewGuid();
MessageBox.Show("GUID3:"+guid);
Panel 通常會使用 Control 來控制內部元件,例如:
MainPanel.Controls.Find("TGNAME", true)[0].Text
這裡說明如何透過 panel 來清除表單群組,
製作一個清除欄位內容(TextBox, CheckBox, RichTextBox, ComboBox, MaskedTextBox) 的方法
Continue Reading在設計表單時,針對單一元件執行單一事件,可以直接在事件下拉選單直接選取
如果要在同一元件(textbox, combobox, numericupdown…)執行多個事件,做法:
開啟表單 .cs 檔案,可以設定多個事件
Continue Reading範例說明下列情況:
如何在 combobox 賦予 items 預設值, 如何從DB取值再加入combobox items 如何設定 combobox key value 值
Continue Reading