lua web快速開發指南(6) - Cache、DB介紹

"數據庫"與"緩存"的基本概念

數據庫與緩存是服務端開發人員的必學知識點.redis

數據庫

"數據庫"是一種信息記錄、存取的虛擬標記地點的集合統稱. 好比現實生活中, 咱們常常會用到文件櫃、書桌等等數據存取容器.數據庫

在對容器進行數據存取的時候, 咱們會爲每一層打上一個標籤表示一種分類項. 而這種在數據庫中劃分子分類造成了的概念. 這就是咱們一般所說的結構化數據庫.數組

因爲一般數據表之間可能會存在依賴關係, 某一(或者多)層一般可能會用於同一種用途. 這種用途將一層劃分爲索引表, 二層劃分爲分類表, 三層劃分爲數據表.緩存

實現這種功能與依賴關係的數據庫, 咱們稱之爲: 關係型數據庫. 它能夠定義一套規範而且創建數據存取模型, 這樣方便維護一整套結構化的數據信息.安全

每當咱們須要對數據進行結構化操做(查詢、增長、刪除、修改)的時候, 須要在計算機中用一種通俗易懂的語言表達方式來進行助記. 這種結構化查詢語言稱之爲SQL.bash

緩存

咱們一般將數據存儲完畢後, 能經過指定或特定的一(多)種方式對數據進行操做. 在項目開發的初期, 這並無太大的問題.數據結構

可是隨着數據量的不斷增大, 在數據庫的內存中已經放不下這麼多數據. 咱們的數據逐漸沒法被加載到內存中: 只會在使用的時候纔會進行(隨機)讀取. 而這會加大磁盤I/O.框架

咱們知道一般磁盤的讀寫速度基本上會比內存讀寫慢幾個數量級(即便是SSD), 大量請求可能瞬間將磁盤IO佔滿並出現數據庫的CPU利用率低、內存頻繁進行修改/置換等問題.分佈式

爲了解決這些問題, 出現了不少解決方案: 讀、寫分離、分表分庫等等. 雖然有了這些方案, 可是也一樣回引來新的問題: 主從同步、分佈式事務等問題.工具

"緩存"則是近十年興起的概念, 它的本質是一份數據結構化存儲在內存中的副本. 高級的緩存咱們也能夠將其稱之爲內存數據庫NOSQL(非關係型)數據庫.

"緩存"也是一種"另類"解決數據庫問題點一種手段! 它經過豐富的數據結構擴展了數據模型的組合能力, 經過簡單的使用方法與高效的鏈接方式提供更好數據操做方式.

"緩存"將查詢、更新較爲頻繁的數據組成一個集合加載進內存中, 較少使用的數據序列化到磁盤內部. 高效利用內存的同時, 根據變化的狀況合理更新、刪除緩存.

這樣的方式配合數據庫都讀、寫分離與數據分區將數據合理的從一個數據集副本分散到多個數據集副本, 有效的減小性能問題點產生而且提高了整個業務系統的橫向擴展能.

DB庫

DB庫是cf框架封裝自MySQL 4.1協議實現的客戶端鏈接庫, 提供MySQL斷線重連、SQL重試、鏈接池等高級特性.

Cache

Cache庫是cf封裝自Redis 2.0協議實現的客戶端鏈接庫, 提供Redis斷線重連、命令重試、鏈接池等高級特性.

API學習

1. DB API

在使用下面的API以前, 請先確保已經導入庫: local DB = require "DB".

1.1 DB:new(opts)

opts表的參數決定如何鏈接到MySQL, 表屬性以下:

host - MySQL主機名或IP地址(string類型).

port - MySQL端口號(int類型).

charset - MySQL字符集設置.

database - MySQL庫的名稱.

username - MySQL用戶帳戶(string類型).

password - MySQL用戶密碼(string類型).

max - MySQL的最大鏈接池大小(int類型).

這個方法返回一個新建立db對象

1.2 DB:connect()

開始鏈接MySQL. 鏈接成功返回True, 不然將會持續進行鏈接而且輸出鏈接失敗緣由的日誌.

1.3 DB:query(SQL)

數據庫查詢語句調用方法, SQL爲string類型的的一個標準SQL語句.

返回值爲ret與err. 查詢成功ret爲一個結果集數組, 在發生錯誤時未nil, err爲錯誤信息.

2. Cache API

在使用下面的API以前, 請先確保已經導入庫: local Cache = require "Cache".

2.1 Cache:new(opts)

opts表的參數決定如何鏈接到MySQL, 表屬性以下:

host - Redis主機名或IP地址(string類型).

port - Redis主機端口號(int類型).

auth - Redis主機設置的密碼, 默認爲:nil.

db - Redis的數據庫設置.

max = 最大鏈接池大小(int類型).

此方法返回一個新建立的Cache對象.

2.2 Cache:connect()

開始鏈接Redis. 鏈接成功返回True, 不然將會持續進行鏈接而且輸出鏈接失敗緣由的日誌.

2.3 Cache:API(...)

Cache支持大部分的redis API, 目前測試過多API在script/test_Cache.lua文件內部都有展現.

DB庫的操做流程

DB庫的操做與使用流程很是簡單, 其目標是簡化開發人員在業務編寫過程當中的使用難點.

建立數據庫與數據表

啓動一個MySQL實例而且初始化完畢, 具體安裝與初始化方法根據平臺不一樣而不一樣, 這再也不本文講解範圍內.

而後咱們使用默認的root用戶而且root帳戶、密碼設置完畢. 這裏爲了演示方便, 咱們將root密碼設置爲: 123456789.

建立一個叫cf_mall的數據庫字符集編碼都設爲utf-8. 而且在cf_mall數據庫中建立一個叫作cf_users的表, 以下所示:

# 建立`cf_mall`數據庫
CREATE DATABASE IF NOT EXISTS `cf_mall` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

# 建立`cf_users`用戶表
CREATE TABLE IF NOT EXISTS `cf_mall`.`cf_users` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '用戶ID',
`age` tinyint(3) unsigned NOT NULL COMMENT '用戶年齡',
`name` varchar(255) NOT NULL COMMENT '用戶名',
`username` varchar(255) NOT NULL COMMENT '用戶帳戶',
`password` varchar(255) NOT NULL COMMENT '用戶密碼',
`email` varchar(255) NOT NULL DEFAULT '' COMMENT '用戶郵箱',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

以上數據庫建立語句能夠在一些MySQL GUI工具中直接運行.

測試DB庫的API寫入數據

如今, 讓咱們利用上面學到的API嘗試將做者的信息寫入進去. 同時爲了不密碼原文顯示, 咱們須要使用crypt庫的base64方法將密碼進行編碼.

local crypt = require "crypt"
local DB = require "DB"
local db = DB:new {
    host = "localhost",
    port = 3306,
    username = 'root',
    password = 123456789,
    database = "cf_mall",
    charset = "utf8"
}

db:connect()

db:query(string.format([[
    INSERT INTO `cf_mall`.`cf_users`
        (`name`, `age`, `username`, `password`, `email`)
    VALUE
        ('%s', '%s', '%s', '%s', '%s')
    ]],
    '水果糖的小鋪子', '29', 'candymi', crypt.base64encode('123456789'), '869646063@qq.com')
)
local ret, err = db:query("SELECT * FROM `cf_mall`.`cf_users` WHERE `name` = '水果糖的小鋪子'")
if not ret then
    return print(ret, err)
end
return print('name:', ret[1].name, 'password:', ret[1].password, 'email:', ret[1].email)

檢查問題

最後咱們檢查數據庫內是否已經寫入了咱們須要存儲的數據. 若是使用的SQL有語法錯誤致使寫入失敗, 請使用print檢查db:query操做否出現錯誤.

同時咱們在console控制檯上能夠檢查是否輸出了咱們剛纔寫入到cf_users的信息.

Cache庫的操做流程

Cache庫擁有很是簡單的使用方法, 幾乎能運行全部Redis已提供的命令. 而且協議是二進制安全的(binary safe).

啓動一個Redis實例

啓動並運行一個redis實例. 具體安裝與運行方法根據平臺不一樣而不一樣, 這再也不本文講解範圍內.

而且這裏爲了演示示例簡單, 咱們將不設置任何auth而且使用默認的db.

將數據加載到Redis

咱們將列出目前已知的一些知名大衆化語言, 而後將其寫入到Redis中.

local Cache = require "Cache"

local cache = Cache:new {
    host = 'localhost',
    port = 6379,
}

cache:connect()
local ok, msg = cache:rpush("languages", "C", "C++", "Java", "Golang", "Ruby", "Python", "PHP", "Lua")
if not ok then
  return print(ok, msg)
end
print("當前language的總數爲:", msg)

問題排查

最後, 讓咱們用Redis自帶的命令行工具查看是否真實寫入了數據.

[candy@MacBookPro:~] $ redis-cli
127.0.0.1:6379> lrange languages 0 -1
1) "C"
2) "C++"
3) "Java"
4) "Golang"
5) "Ruby"
6) "Python"
7) "PHP"
8) "Lua"
127.0.0.1:6379>

能夠看到數據已經寫入進去. 若是發送參數錯誤與語法發生錯誤, msg將會是您排查錯誤的有效信息.

更多

更多API詳情請參考MySQL、Redis的使用文檔而且在實際開發中進行體驗.

繼續學習

下一章節咱們將繼續學習如何利用httpc庫請求第三方接口

相關文章
相關標籤/搜索