国产gaysexchina男同gay,japanrcep老熟妇乱子伦视频,吃奶呻吟打开双腿做受动态图,成人色网站,国产av一区二区三区最新精品

Lua web快速開(kāi)發(fā)指南(6) - Cache、DB介紹

2019-06-18 22:53 更新

"數(shù)據(jù)庫(kù)"與"緩存"的基本概念

數(shù)據(jù)庫(kù)與緩存是服務(wù)端開(kāi)發(fā)人員的必學(xué)知識(shí)點(diǎn).

數(shù)據(jù)庫(kù)

"數(shù)據(jù)庫(kù)"是一種信息記錄、存取的虛擬標(biāo)記地點(diǎn)的集合統(tǒng)稱(chēng). 比如現(xiàn)實(shí)生活中, 我們經(jīng)常會(huì)用到文件柜、書(shū)桌等等數(shù)據(jù)存取容器.

在對(duì)容器進(jìn)行數(shù)據(jù)存取的時(shí)候, 我們會(huì)為每一層打上一個(gè)標(biāo)簽表示一種分類(lèi)項(xiàng). 而這種在數(shù)據(jù)庫(kù)中劃分子分類(lèi)形成了的概念. 這就是我們通常所說(shuō)的結(jié)構(gòu)化數(shù)據(jù)庫(kù).

由于通常數(shù)據(jù)表之間可能會(huì)存在依賴(lài)關(guān)系, 某一(或者多)層通??赡軙?huì)用于同一種用途. 這種用途將一層劃分為索引表, 二層劃分為分類(lèi)表, 三層劃分為數(shù)據(jù)表.

實(shí)現(xiàn)這種功能與依賴(lài)關(guān)系的數(shù)據(jù)庫(kù), 我們稱(chēng)之為: 關(guān)系型數(shù)據(jù)庫(kù). 它可以定義一套規(guī)范并且建立數(shù)據(jù)存取模型, 這樣方便維護(hù)一整套結(jié)構(gòu)化的數(shù)據(jù)信息.

每當(dāng)我們需要對(duì)數(shù)據(jù)進(jìn)行結(jié)構(gòu)化操作(查詢(xún)、增加、刪除、修改)的時(shí)候, 需要在計(jì)算機(jī)中用一種通俗易懂的語(yǔ)言表達(dá)方式來(lái)進(jìn)行助記. 這種結(jié)構(gòu)化查詢(xún)語(yǔ)言稱(chēng)之為SQL.

緩存

我們通常將數(shù)據(jù)存儲(chǔ)完畢后, 能通過(guò)指定或特定的一(多)種方式對(duì)數(shù)據(jù)進(jìn)行操作. 在項(xiàng)目開(kāi)發(fā)的初期, 這并沒(méi)有太大的問(wèn)題.

但是隨著數(shù)據(jù)量的不斷增大, 在數(shù)據(jù)庫(kù)的內(nèi)存中已經(jīng)放不下這么多數(shù)據(jù). 我們的數(shù)據(jù)逐漸無(wú)法被加載到內(nèi)存中: 只會(huì)在使用的時(shí)候才會(huì)進(jìn)行(隨機(jī))讀取. 而這會(huì)加大磁盤(pán)I/O.

我們知道通常磁盤(pán)的讀寫(xiě)速度基本上會(huì)比內(nèi)存讀寫(xiě)慢幾個(gè)數(shù)量級(jí)(即使是SSD), 大量請(qǐng)求可能瞬間將磁盤(pán)IO占滿并出現(xiàn)數(shù)據(jù)庫(kù)的CPU利用率低、內(nèi)存頻繁進(jìn)行修改/置換等問(wèn)題.

為了解決這些問(wèn)題, 出現(xiàn)了很多解決方案: 讀、寫(xiě)分離、分表分庫(kù)等等. 雖然有了這些方案, 但是也同樣回引來(lái)新的問(wèn)題: 主從同步、分布式事務(wù)等問(wèn)題.

"緩存"則是近十年興起的概念, 它的本質(zhì)是一份數(shù)據(jù)結(jié)構(gòu)化存儲(chǔ)在內(nèi)存中的副本. 高級(jí)的緩存我們也可以將其稱(chēng)之為內(nèi)存數(shù)據(jù)庫(kù)NOSQL(非關(guān)系型)數(shù)據(jù)庫(kù).

"緩存"也是一種"另類(lèi)"解決數(shù)據(jù)庫(kù)問(wèn)題點(diǎn)一種手段! 它通過(guò)豐富的數(shù)據(jù)結(jié)構(gòu)擴(kuò)展了數(shù)據(jù)模型的組合能力, 通過(guò)簡(jiǎn)單的使用方法與高效的連接方式提供更好數(shù)據(jù)操作方式.

"緩存"將查詢(xún)、更新較為頻繁的數(shù)據(jù)組成一個(gè)集合加載進(jìn)內(nèi)存中, 較少使用的數(shù)據(jù)序列化到磁盤(pán)內(nèi)部. 高效利用內(nèi)存的同時(shí), 根據(jù)變化的情況合理更新、刪除緩存.

這樣的方式配合數(shù)據(jù)庫(kù)都讀、寫(xiě)分離與數(shù)據(jù)分區(qū)將數(shù)據(jù)合理的從一個(gè)數(shù)據(jù)集副本分散到多個(gè)數(shù)據(jù)集副本, 有效的減少性能問(wèn)題點(diǎn)產(chǎn)生并且提升了整個(gè)業(yè)務(wù)系統(tǒng)的橫向擴(kuò)展能.

DB庫(kù)

DB庫(kù)是cf框架封裝自MySQL 4.1協(xié)議實(shí)現(xiàn)的客戶(hù)端連接庫(kù), 提供MySQL斷線重連、SQL重試、連接池等高級(jí)特性.

Cache

Cache庫(kù)是cf封裝自Redis 2.0協(xié)議實(shí)現(xiàn)的客戶(hù)端連接庫(kù), 提供Redis斷線重連、命令重試、連接池等高級(jí)特性.

API學(xué)習(xí)

1. DB API

在使用下面的API之前, 請(qǐng)先確保已經(jīng)導(dǎo)入庫(kù): local DB = require "DB".

1.1 DB:new(opts)

opts表的參數(shù)決定如何連接到MySQL, 表屬性如下:

host - MySQL主機(jī)名或IP地址(string類(lèi)型).

port - MySQL端口號(hào)(int類(lèi)型).

charset - MySQL字符集設(shè)置.

database - MySQL庫(kù)的名稱(chēng).

username - MySQL用戶(hù)賬戶(hù)(string類(lèi)型).

password - MySQL用戶(hù)密碼(string類(lèi)型).

max - MySQL的最大連接池大小(int類(lèi)型).

這個(gè)方法返回一個(gè)新創(chuàng)建db對(duì)象

1.2 DB:connect()

開(kāi)始連接MySQL. 連接成功返回True, 否則將會(huì)持續(xù)進(jìn)行連接并且輸出連接失敗原因的日志.

1.3 DB:query(SQL)

數(shù)據(jù)庫(kù)查詢(xún)語(yǔ)句調(diào)用方法, SQL為string類(lèi)型的的一個(gè)標(biāo)準(zhǔn)SQL語(yǔ)句.

返回值為ret與err. 查詢(xún)成功ret為一個(gè)結(jié)果集數(shù)組, 在發(fā)生錯(cuò)誤時(shí)未nil, err為錯(cuò)誤信息.

2. Cache API

在使用下面的API之前, 請(qǐng)先確保已經(jīng)導(dǎo)入庫(kù): local Cache = require "Cache".

2.1 Cache:new(opts)

opts表的參數(shù)決定如何連接到MySQL, 表屬性如下:

host - Redis主機(jī)名或IP地址(string類(lèi)型).

port - Redis主機(jī)端口號(hào)(int類(lèi)型).

auth - Redis主機(jī)設(shè)置的密碼, 默認(rèn)為:nil.

db - Redis的數(shù)據(jù)庫(kù)設(shè)置.

max = 最大連接池大小(int類(lèi)型).

此方法返回一個(gè)新創(chuàng)建的Cache對(duì)象.

2.2 Cache:connect()

開(kāi)始連接Redis. 連接成功返回True, 否則將會(huì)持續(xù)進(jìn)行連接并且輸出連接失敗原因的日志.

2.3 Cache:API(...)

Cache支持大部分的redis API, 目前測(cè)試過(guò)多API在script/test_Cache.lua文件內(nèi)部都有展示.

DB庫(kù)的操作流程

DB庫(kù)的操作與使用流程非常簡(jiǎn)單, 其目標(biāo)是簡(jiǎn)化開(kāi)發(fā)人員在業(yè)務(wù)編寫(xiě)過(guò)程中的使用難點(diǎn).

創(chuàng)建數(shù)據(jù)庫(kù)與數(shù)據(jù)表

啟動(dòng)一個(gè)MySQL實(shí)例并且初始化完畢, 具體安裝與初始化方法根據(jù)平臺(tái)不同而不同, 這不再本文講解范圍內(nèi).

然后我們使用默認(rèn)的root用戶(hù)并且root賬戶(hù)、密碼設(shè)置完畢. 這里為了演示方便, 我們將root密碼設(shè)置為: 123456789.

創(chuàng)建一個(gè)叫cf_mall的數(shù)據(jù)庫(kù)字符集編碼都設(shè)為utf-8. 并且在cf_mall數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)叫做cf_users的表, 如下所示:

  # 創(chuàng)建`cf_mall`數(shù)據(jù)庫(kù)
  CREATE DATABASE IF NOT EXISTS `cf_mall` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;


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

以上數(shù)據(jù)庫(kù)創(chuàng)建語(yǔ)句可以在一些MySQL GUI工具中直接運(yùn)行.

測(cè)試DB庫(kù)的API寫(xiě)入數(shù)據(jù)

現(xiàn)在, 讓我們利用上面學(xué)到的API嘗試將作者的信息寫(xiě)入進(jìn)去. 同時(shí)為了避免密碼原文顯示, 我們需要使用crypt庫(kù)的base64方法將密碼進(jìn)行編碼.

  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')
    ]],
    '水果糖的小鋪?zhàn)?, '29', 'candymi', crypt.base64encode('123456789'), '869646063@qq.com')
  )
  local ret, err = db:query("SELECT * FROM `cf_mall`.`cf_users` WHERE `name` = '水果糖的小鋪?zhàn)?")
  if not ret then
    return print(ret, err)
  end
  return print('name:', ret[1].name, 'password:', ret[1].password, 'email:', ret[1].email)

檢查問(wèn)題

最后我們檢查數(shù)據(jù)庫(kù)內(nèi)是否已經(jīng)寫(xiě)入了我們需要存儲(chǔ)的數(shù)據(jù). 如果使用的SQL有語(yǔ)法錯(cuò)誤導(dǎo)致寫(xiě)入失敗, 請(qǐng)使用print檢查db:query操作否出現(xiàn)錯(cuò)誤.

同時(shí)我們?cè)赾onsole控制臺(tái)上可以檢查是否輸出了我們剛才寫(xiě)入到cf_users的信息.

Cache庫(kù)的操作流程

Cache庫(kù)擁有非常簡(jiǎn)單的使用方法, 幾乎能運(yùn)行所有Redis已提供的命令. 并且協(xié)議是二進(jìn)制安全的(binary safe).

啟動(dòng)一個(gè)Redis實(shí)例

啟動(dòng)并運(yùn)行一個(gè)redis實(shí)例. 具體安裝與運(yùn)行方法根據(jù)平臺(tái)不同而不同, 這不再本文講解范圍內(nèi).

并且這里為了演示示例簡(jiǎn)單, 我們將不設(shè)置任何auth并且使用默認(rèn)的db.

將數(shù)據(jù)加載到Redis

我們將列出目前已知的一些知名大眾化語(yǔ)言, 然后將其寫(xiě)入到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("當(dāng)前l(fā)anguage的總數(shù)為:", msg)

問(wèn)題排查

最后, 讓我們用Redis自帶的命令行工具查看是否真實(shí)寫(xiě)入了數(shù)據(jù).

  [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>

可以看到數(shù)據(jù)已經(jīng)寫(xiě)入進(jìn)去. 如果發(fā)送參數(shù)錯(cuò)誤與語(yǔ)法發(fā)生錯(cuò)誤, msg將會(huì)是您排查錯(cuò)誤的有效信息.

更多

更多API詳情請(qǐng)參考MySQL、Redis的使用文檔并且在實(shí)際開(kāi)發(fā)中進(jìn)行體驗(yàn).

繼續(xù)學(xué)習(xí)

下一章節(jié)我們將繼續(xù)學(xué)習(xí)如何利用httpc庫(kù)請(qǐng)求第三方接口

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)