Database

Redis - SUBSCRIBE、PSUBSCRIBE、UNSUBSCRIBE、PUNSUBSCRIBE 訂閱功能介紹

Redis - SUBSCRIBE、PSUBSCRIBE、UNSUBSCRIBE、PUNSUBSCRIBE 訂閱功能介紹

SUBSCRIBE 訂閱

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

使用 PSUBSCRIBE 訂閱一個或多個頻道時,可以透過一些模式,來訂閱

? : 表示任一字元

  • : 表示多個任意字元 [nnnn] : 表示在這其中任一字元

例如: H?llo 會包含 Hello, Hallo, Hbllo, Hcllo, ……. H*llo 會包含 Heeeeello, Hllo, Hxllo…… H[ae]llo 會包含 Hello, Hallo (但不包括 Hllo)

Continue Reading

Redis - pipeline 簡介

Redis - pipeline 簡介

Redis 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 ,可以透過拆分來完成減少單次大小

Pipeline 代理

通常為了讓Redis可以有更好的負載能力,都會在 Redis 前面外加一個代理,例如: Codis Pipeline 緩存默認10K,3.1則是1024,Jedis 緩存默認為 8192

Continue Reading

MySQL - 取得十分鐘內、一小時內、一天內 的資料

MySQL 取得指定分鐘、指定小時或指定天數內的資料

方式介紹:

Continue Reading

MySQL - 取得平均為 NULL 如何轉為0、以及計算總數方法

MySQL 取得平均級總數的方式,可以直接用現成的方法

AVG 以及 COUNT

這裡會另外再分享一個小技巧,說明如何將 AVG 取得結果為 NULL 如何轉為零

Continue Reading

MySQL - 取得目前時間、日期,日期加一個月,日期加一年

這裡記錄如何透過MySQL內建的函式來處理時間

非常實用,在處理會員延長有效期限

要延長一個月或一年等狀況,就能透過這些方式,很輕鬆的就將資料處理好。

Continue Reading

終端機操作 MySQL(MariaDB) 指令~

平時習慣透過介面方式來管理資料庫,趁著假日期間再來玩一下指令操作模式,

順道記錄一些透過終端機介面操作MySQL (or mariaDB) 的方式,便於之後再參考

(如果在windows 環境,請先將 mysql (…\mysql\bin) 加入環境變數中)

在這裡著重在操作及設定方面,不會提到太多CRUD相關操作

Continue Reading

Redis 介紹

Redis 介紹

Redis 是一個開源的 (BSD licensed) in-memory 的資料存放結構,可以被使用作為 Database,快取,訊息媒介。支援豐富的資料型態,包括: strings, hashes, lists, sets, stored sets, bitmaps, hyperloglogs 以及 geospatial indexes 儲存格式。

Redis 功能包括 replication, Lua scripting, LRU eviction, transactions,不同層級的 on-disk persistence(定時寫入硬碟,保持持久性), Redis Sentinel 的高可用性功能,以及 Redis Cluster 自動分區

你可以將上面的結構進行 atomic operations (原子操作。原子意思是不可分割的最小粒子,原子操作意思為不可中斷的一系列操作) ,例如: appending to a string incrementing the value in a hash pushing an element to a list computing set intersection, union and difference getting the member with highest ranking in a sorted set.

為了能有出色的執行效能,Redis 使用了 in-memory dataset 的方式來運作。並且能依照你習慣的方式,可以每次都將資料儲存在硬碟中,或者將每一個指令都寫入 log。如果你需要的是功能豐富、散播快且以記憶體的方式快取,就可以關掉持久性的寫入硬碟設定。

Redis 同時支援更細節的設定 主從異步複製(master-slave asynchronous replication),具有快速的非阻斷式優先同步、對於傳輸過程遺失部分片段,可採自動重新連結的方式,將網路節點中的小部分資料再重新同步。

其他還包括下列特性:

你可以從這個連結查看有哪些程式語言能使用 Redis Clients

Continue Reading

SQL Joins

A LEFT JOIN B: 左外聯結,取得兩個資料表中,與A有關的資料。 A RIGHT JOIN B: 右外聯結,取得兩個表單中,與B有關的資料。 A INNER JOIN B: 將兩者匹配的資料取出來,即取得AB交集。 A OUTER JOIN B: 將兩者匹配及沒匹配的資料都取出來,即取得AB聯集。

Continue Reading

MySQL - Text 和 Blob 特性探討

簡介

MySQL 儲存格式中,常用TEXT或BLOB來儲存長字串

兩者之間的差異主要為: TEXT 只能儲存字元資料,BLOB 可以保存二進位資料(圖片..)

通常,根據內文預期的長度來挑選適當的類型

  Type |         Bytes | English words | Multi-byte words

———–+—————+—————+—————– TINYTEXT or TINYBLOB | 255 | ±44 | ±23 TEXT or BLOB | 65,535 | ±11,000 | ±5,900 MEDIUMTEXT or MEDIUMBLOB | 16,777,215 | ±2,800,000 | ±1,500,000 LONGTEXT or LONGBLOB | 4,294,967,295 | ±740,000,000 | ±380,000,000

缺點

兩者在刪除之後,仍會占用空間,長期或大量執行刪除動作時,會產生大量空洞空間,引起性能問題。

定期最佳化表格

透過 OPTIMIZE TABLE 將資料表進行磁碟重組,將空洞空間釋放出來,改善效能。

>OPTIMIZE TABLE 資料表名稱

搜尋

對於 TEXT 與 BLOB 內容進行搜尋,效能較差

Continue Reading

如何調整 MySQL 上傳資料庫檔案大小限制 [紀錄]

php 預設都會有檔案上傳大小、傳輸時間等等限制

雖然一般資料庫都是由DBA負責維運,但有時在維護特殊的專案時,

也可能需要用到匯入測試,進而需要調整一些設定,

所以直接把常用的參數記錄起來,也可方便於日後查詢

Continue Reading

MySQL - 浮點數與定點數

一般對於數字應用上,多數還是以整數為主

實際應用時,通常會先考量數字長度,並且通常都不會有問題

但是遇到與金融交易時,常常會牽涉到小數點的問題,也就是這裡要談的議題 - 定點數與浮點數

浮點數

具有小數點,插入的資料若小數點超過預設長度,則會實施四捨五入 在MySQL中,float, double( or real) 都可以用來儲存浮點數

在使用時,可能會有誤差的問題

定點數

字串形式存放數值,若插入的數值長度超過預設長度,會回報錯誤 (在SQLMode 預設情況仍會四捨五入後,插入資料)

在 MySQL 中,decimal (or numberic) 都可以用來儲存定點數

對於精確度要求較高的資料,都要使用定點數來儲存

範例

我們直接來建立一個浮點數及定點數的資料表

MariaDB [example]> CREATE TABLE float_and_decimal(flo float(10,2), deci decimal(10,2));

Query OK, 0 rows affected (0.07 sec)

接下來,插入三筆資料

MariaDB [example]>INSERT INTO float_and_decimal VALUES(0.3456, 0.3456);
MariaDB [example]>INSERT INTO float_and_decimal VALUES(0, 0);
MariaDB [example]>INSERT INTO float_and_decimal VALUES(131072.32, 131072.32);

查看結果,前兩筆資料都能符合預期,但是第三筆資料,131072.32 會因為浮點數誤差而產生差異 原因是 float 浮點數在±131072(65536×2)以內的時候,仍會保持精確,但是超出範圍就會開始有偏差 (詳細原因可以參考這裡)

MariaDB [example]> select * from float_and_decimal;
+-----------+-----------+
| flo       | deci      |
+-----------+-----------+
|      0.35 |      0.35 |
|      0.00 |      0.00 |
| 131072.31 | 131072.32 |
+-----------+-----------+
3 rows in set (0.00 sec)

Continue Reading

MySQL - 檢視表 (View)

檢視表是一個虛擬的資料表,從MySQL 5.0.1 版本即開始支援

在使用時,設計者可自行將多個表格進行關聯、篩選,製作成一份獨立的檢視表

使用上,具有以下優點

  • 簡單明瞭: 使用者不需要理解整個資料結構,直接呼叫檢視表就能取得整合完成的資料
  • 安全: 使用者僅能看到檢視表允許查詢的部分
  • 獨立: 檢視表結構會彙整關聯的資料表,當關聯資料表新增資料時,也能同時取得;僅有當關聯表修改列名時,才需要調整檢視表的結構對應名稱

建立檢視表

CREATE OR REPLACE VIEW user_view AS SELECT * FROM user;
Query OK, 0 rows affected (0.01 sec)

刪除檢視表

DROP VIEW user_view
Query OK, 0 rows affected (0.00 sec)

查看檢視表

SELECT * FROM user_view;
+-------+------------+
| names | join_date  |
+-------+------------+
| a    | 2018-01-01 |
| adam  | 2018-02-01 |
| adam  | 2018-02-01 |
+-------+------------+
3 rows in set (0.00 sec)

更新檢視表

檢視表對於更新資料有諸多限制, 在一般單純 SELECT 的檢視表,可執行 UPDATE 功能 但是有用到 sum, min, max,count, distinct, group by, having, union…. 等函式,都無法執行更新

在這裡還是建議,檢視表盡量僅用於檢視功能,如果需要進一步的操作,應該使用其他方式

UPDATE user_view set names='aa' WHERE names='a';
Query OK, 1 row affected (0.00 sec)

SELECT * FROM user_view;
+-------+------------+
| names | join_date  |
+-------+------------+
| aa    | 2018-01-01 |
| adam  | 2018-02-01 |
| adam  | 2018-02-01 |
+-------+------------+
3 rows in set (0.00 sec)

查看檢視表定義

SHOW TABLE STATUS LIKE 'user_view' \G
*************************** 1. row ***************************
           Name: user_view
         Engine: NULL
        Version: NULL
     Row_format: NULL
           Rows: NULL
 Avg_row_length: NULL
    Data_length: NULL
Max_data_length: NULL
   Index_length: NULL
      Data_free: NULL
 Auto_increment: NULL
    Create_time: NULL
    Update_time: NULL
     Check_time: NULL
      Collation: NULL
       Checksum: NULL
 Create_options: NULL
        Comment: VIEW
1 row in set (0.00 sec)

檢視表中建立檢視表

在MySQL 檢視表的定義存在一些限制,包括 FROM 之後不能有子查詢,使用 sum, min, max,count, distinct, group by, having, union…. 等函式,都無法執行更新..等

Continue Reading

GraphCool 介紹

安裝 GraphQL Server 教學

這裡會紀錄 GraphQL 也稱 GraphCool 的操作

安裝

首先,用管理員權限開啟 cmd,安裝graphcool

安裝 graphcool

npm install -g graphcool

初始化graphcool專案

接著,前往專案資料夾,建立 local 端的graphcool管理初始化

graphcool init

Deploy

安裝完畢後,會看到選項 graphcool deploy, 將你的Graphcool server發布在線上 graphcool local up, 開始你的本地端Graphcool graphcool add-template facebook-auth, 加入facebook 驗證

我們先選擇線上發布

graphcool deploy

線上管理介面

接著,會自動開啟瀏覽器,前往 https://console.graph.cool/graphql/schema 這時,開啟本地端的 types.graphql 會發現裡面的 schema 已經被發佈到線上

現在,新增一個 Test types.graphql

type User @model {
  id: ID! @isUnique
  name: String
  dateOfBirth: DateTime

  # Uncomment below - you can declare relations between models like this

  # posts: [Post!]! @relation(name: "UserPosts")
}

type Test @model {
  id: ID! @isUnique
  namesss: String
  dateOfBirth: DateTime

  # Uncomment below - you can declare relations between models like this

  # posts: [Post!]! @relation(name: "UserPosts")
}

再輸入發布指令

Continue Reading

MySQL - InnoDB 簡介

MySQL 5.0 之後的版本支援的儲存引擎包括 MyISAM, InnoDB, MEMORY, CSV …等

其中 InnoDB 屬於交易安全表(支持交易,行級鎖定,外鍵和表加密)

MyISAM、MEMORY、CSV則屬於非交易安全表。

將目前支援的儲存引擎列出來,就能看到個引擎的支援狀況:

> SHOW ENGINES \G
...
*************************** 2. row ***************************
      Engine: InnoDB
     Support: DEFAULT
     Comment: Percona-XtraDB, Supports transactions, row-level locking, foreign keys and encryption for tables
Transactions: YES
          XA: YES
  Savepoints: YES
*************************** 3. row ***************************
      Engine: MEMORY
     Support: YES
     Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 4. row ***************************
      Engine: MyISAM
     Support: YES
     Comment: MyISAM storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
...
8 rows in set (0.00 sec)

在 MySQL 5.5 之前,預設的儲存引擎是 MyISAM

Continue Reading

MySQL - ENUM 與SET 類型比較

ENUM 列舉陣列 與 SET 集合 非常類似

底下分別說明兩者類型,以及舉例說明:

ENUM

ENUM 最多可預設 65535 個成員

1-255個成員 (佔1位元) 255-65535個成員 (佔2位元)

存取資料時,只允許從預設的成員之中,挑選其中單一值

也可以用數字代表,1就代表第一個成員..以此類推

範例:

> CREATE TABLE enum_demo (name VARCHAR(10), gender ENUM('M','F'));

回應:
Query OK, 0 rows affected (0.05 sec)

接下來我們插入多筆資料,並且試著插入

  • 正常的ENUM值
  • 非ENUM預設的數字值
  • 非ENUM預設的英文字母
  • 插入多個值
> INSERT INTO enum_demo (name,gender) VALUES ('jenny','F'), ('joe','M'), ('way',0), ('grown',1), ('bang',2), ('rown',100), ('honer',NULL), ('tank',''), ('show','F,M');

回應:
Query OK, 9 rows affected, 4 warnings (0.00 sec)
Records: 9  Duplicates: 0  Warnings: 4

從回應來看,可以看到插入9筆資料,但有3筆警示

檢查內容如下:

> SELECT * FROM enum_demo;

回應
+-------+--------+
| name  | gender |
+-------+--------+
| jenny | F      |
| joe   | M      |
| way   |        |
| grown | M      |
| bang  | F      |
| rown  |        |
| honer | NULL   |
| tank  |        |
| show  |        |
+-------+--------+
9 rows in set (0.00 sec)

SET

SET 預設值最多可以包含 64個成員

Continue Reading

MySQL 內建功能函數 - IP 格式轉換處理與天數計算

這裡特別介紹MySQL內建的功能函數

分別說明如下:

Continue Reading

SQL 資料庫設計 - 讓產品支援多國語系的四種方式

一、單列方式 (Column Approach)

在單一列,設定多個語系欄位

優點: - 簡單 - 易於實施 - 輕鬆查詢 - 無需JOIN - 沒有重複 - 沒有重複的內容(每個記錄只有一行,只有語言列被重複) 缺點: - 很難維護 - 如果只有2-3種語言會很容易維護,但當您有很多欄或很多語言時,它變得非常龐大且不容易維護 - 很難添加新語言 - 添加新語言時,有設定多國語言的欄位都要進行新增調整(以及db用戶的特殊訪問權限) - 佔用空間 - 如果不是所有的項目都必需翻譯(例如在某些地方,只需使用默認語言),它可能會導致冗餘數據或空的db字段 - 需要建立檢視判斷 - 需要依照目前語系環境決定要撈出哪一列,還需額外判斷才能達成

CREATE TABLE app_product (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `date_created` datetime NOT NULL,
  `price` decimal(10,2) unsigned NOT NULL DEFAULT '0.00',
  `title_en` varchar(255) NOT NULL,
  `title_es` varchar(255) NOT NULL,
  `title_fr` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
);

透過很簡單的Query就能取出資料

<?php
// Retrieve titles for all languages
$sql = "SELECT * FROM `app_product` WHERE 1";
if($result = mysqli_query($link, $sql)){
    if($row = mysqli_fetch_assoc($result)){
        echo "English: ".$row["title_en"]."<br>";
        echo "Spanish: ".$row["title_es"]."<br>";
        echo "French: ".$row["title_fr"]."<br>";
    }
}

// Retrieve appropriate title according to the chosen language in the system
$sql = "SELECT `title_".$_SESSION['current_language']."` as `title`
        FROM `app_product`";
if($result = mysqli_query($link, $sql)){
    if($row = mysqli_fetch_assoc($result)){
        echo "Current Language: ".$row["title"];
    }
}
?>

二、多列方式(Multirow Approach)

方法與第一種很像,但不是透過欄位的方式來建立多國語系,而透過一個語系欄位且不同列的方式來處理 優點: - 簡單 - 易於實施 - 輕鬆查詢 - 無需JOIN 缺點: - 難以維護 - 每個語言的所有列中必須更改未翻譯的每一列。例如,改變單一產品的價格需要對所有語言重複此操作 - 很難添加新語言 - 需要針對每個產品項目進行重複插入操作(從默認的語系作為模板進行複製)

Continue Reading

Juila language 應用篇

DataFrames

讀取csv 說明

先安裝 DataFrames http://juliastats.github.io/DataFrames.jl/stable/ 在julia終端機介面輸入下指令即可安裝

Pkg.add("DataFrames")

Continue Reading

Julia language 入門

Julia 是一種科學計算語言,具有以下特性:

  • 免費且開源 (MIT licensed)
  • 使用者可定義types的方式,增加效率
  • 不須為了增加效能而特別編譯程式碼,直接寫效能就已經很快
  • 適用於平行運算及分布試運算
  • 輕量綠色版
  • 強大的types系統
  • 可以優雅的對數字和其他類型進行轉換和拓展
  • 支援Unicode(當然包含UTF8)
  • 可以直接呼叫C的functions(不須額外加載或特定API)
  • 強大的類shell功能,用於管理其他進程
  • Lisp-like macros and other metaprogramming facilities

以下是學習過程的一些紀錄:

Continue Reading

MongoDb 筆記

推薦

Antoine Girbal’s Corner

##MongoDb可視化操作介面 https://git.oschina.net/xiexiao04/mongo-exprss-master

##安裝MongoDb 安裝 http://www.mongodb.org/downloads 安裝windows 64-bit 2008 R2+ 安裝32-bit 會有2G限制

點擊Msi檔案開始安裝,安裝完成之後,可能會在下方位置 C:\Program Files\MongoDB\Server\3.0\bin

加入環境變數: PATH: ………;C:\Program Files\MongoDB\Server\3.0\bin

以終端機操作,開啟Mongodb Server

	> mongod.exe

確定啟動 前往 http://localhost:27017 預設port,如果成功啟動會顯示: It looks like you are trying to access MongoDB over HTTP on the native driver port. 打開terminal,輸入mongo 啟動database

	> mongo

預設會連結到 test 資料庫 並且是以javascript shell的方式運行,因此js與法在這裡面通常都可以執行

##資料庫 顯示目前所有資料庫

	> show dbs

建立或登入資料庫 建立跟登入資料庫,都是使用use

	> use 資料庫名稱
  
  //switched to db 資料庫名稱

顯示資料庫中所有資料表

	//先登入資料庫
	> use 資料庫名稱
  //顯示資料庫中所有資料表
	> show collections

基本CRUD (參考)

假設資料表名稱為 person

Continue Reading