想做個ktv的網(wǎng)站怎么做網(wǎng)絡(luò)廣告策劃方案范文
一、關(guān)系型數(shù)據(jù)庫與非關(guān)系型數(shù)據(jù)庫
1. 關(guān)系型數(shù)據(jù)庫
關(guān)系型數(shù)據(jù)庫是一種結(jié)構(gòu)化數(shù)據(jù)庫,基于關(guān)系模型(二維表格模型),適合記錄數(shù)據(jù)。通過 SQL(結(jié)構(gòu)化查詢語言)進行數(shù)據(jù)的檢索和操作。主流的關(guān)系型數(shù)據(jù)庫包括:
- Oracle
- MySQL
- SQL Server
- Microsoft Access
- DB2
- PostgreSQL
關(guān)系型數(shù)據(jù)庫需要預(yù)先設(shè)計表結(jié)構(gòu),并且數(shù)據(jù)必須符合表結(jié)構(gòu)才能存儲。
2. 非關(guān)系型數(shù)據(jù)庫(NoSQL)
非關(guān)系型數(shù)據(jù)庫(NoSQL,Not Only SQL)包括所有非關(guān)系型的數(shù)據(jù)庫。特點是無需預(yù)定義表結(jié)構(gòu),數(shù)據(jù)可以以不同的類型和字段存儲。主流的 NoSQL 數(shù)據(jù)庫包括:
- Redis
- MongoDB
- HBase
- Memcached
3. 關(guān)系型與非關(guān)系型數(shù)據(jù)庫的主要區(qū)別
-
數(shù)據(jù)存儲方式
- 關(guān)系型數(shù)據(jù)庫:表格形式,行和列。
- 非關(guān)系型數(shù)據(jù)庫:數(shù)據(jù)以文檔、鍵值對或圖結(jié)構(gòu)存儲。
-
擴展方式
- 關(guān)系型數(shù)據(jù)庫:縱向擴展(提升硬件性能)。
- 非關(guān)系型數(shù)據(jù)庫:橫向擴展(添加更多節(jié)點)。
-
事務(wù)支持
- 關(guān)系型數(shù)據(jù)庫:支持高事務(wù)性,細粒度控制和回滾。
- 非關(guān)系型數(shù)據(jù)庫:支持事務(wù)操作,但穩(wěn)定性和事務(wù)控制不如關(guān)系型數(shù)據(jù)庫。
4. 非關(guān)系型數(shù)據(jù)庫產(chǎn)生背景
為了應(yīng)對Web2.0時代的“三高”問題:
- High Performance:高并發(fā)讀寫需求。
- Huge Storage:海量數(shù)據(jù)高效存儲與訪問。
- High Scalability & High Availability:高可擴展性與高可用性需求。
二、Redis 簡介
Redis(遠程字典服務(wù)器)是一個開源的、基于內(nèi)存的 NoSQL 數(shù)據(jù)庫,使用 C 語言編寫,支持鍵值對存儲。
Redis 中文學(xué)習(xí)https://www.tkcnn.com/redis/Getting-started.html
官網(wǎng)https://redis.io/docs/latest/get-started/
1. Redis 的主要特點
- 極高的讀寫速度:讀取速度高達 110000 次/s,寫入速度高達 81000 次/s。
- 豐富的數(shù)據(jù)類型:支持 Strings、Lists、Hashes、Sets 及 Sorted Sets 等數(shù)據(jù)類型。
- 數(shù)據(jù)持久化:內(nèi)存中的數(shù)據(jù)可以保存到磁盤,重啟時可恢復(fù)使用。
- 原子性:所有操作都是原子性的。
- 數(shù)據(jù)備份:支持 master-slave 模式的數(shù)據(jù)備份。
2. Redis 的應(yīng)用場景
- 緩存
- 獲取最新N個數(shù)據(jù)
- 排行榜
- 計數(shù)器
- 存儲關(guān)系
- 實時分析系統(tǒng)
- 日志記錄
3. Redis 性能優(yōu)勢
- 內(nèi)存結(jié)構(gòu):純內(nèi)存結(jié)構(gòu)避免了磁盤 I/O 操作。
- 單線程處理:減少了鎖競爭和線程上下文切換的消耗。
- I/O 多路復(fù)用:提升了并發(fā)效率。
注:Redis 6.0 引入了多線程,但僅用于處理網(wǎng)絡(luò)請求過程,數(shù)據(jù)讀寫仍是單線程處理。
三、Redis 安裝部署
1. redis部署
redis 下載地址:http://download.redis.io/releases/
systemctl stop firewalld
systemctl enable?firewalld
setenforce 0
yum install -y gcc gcc-c++ make? ? ? ?#安裝依賴包
tar zxvf redis-5.0.7.tar.gz -C /opt/
cd /opt/redis-5.0.7/
make
make PREFIX=/usr/local/redis install
#由于Redis源碼包中直接提供了 Makefile 文件,所以在解壓完軟件包后,不用先執(zhí)行 ./configure 進行配置,可直接執(zhí)行 make 與 make install 命令進行安裝。
#執(zhí)行軟件包提供的 install_server.sh 腳本文件設(shè)置 Redis 服務(wù)所需要的相關(guān)配置文件
cd /opt/redis-5.0.7/utils
./install_server.sh
......?? ??? ??? ??? ??? ?#一直回車
Please select the redis executable path [/usr/local/bin/redis-server] /usr/local/redis/bin/redis-server ??? ?#需要手動修改為 /usr/local/redis/bin/redis-server ,注意要一次性正確輸入
----------------------------------------------------------------------------------------------------------
Selected config:
Port ? ? ? ? ? : 6379?? ??? ??? ??? ??? ??? ??? ??? ?#默認偵聽端口為6379
Config file ? ?: /etc/redis/6379.conf?? ??? ??? ??? ?#配置文件路徑
Log file ? ? ? : /var/log/redis_6379.log?? ??? ??? ?#日志文件路徑
Data dir ? ? ? : /var/lib/redis/6379?? ??? ??? ??? ?#數(shù)據(jù)文件路徑
Executable ? ? : /usr/local/redis/bin/redis-server?? ?#可執(zhí)行文件路徑
Cli Executable : /usr/local/bin/redis-cli?? ??? ??? ?#客戶端命令工具
----------------------------------------------------------------------------------------------------------
?
### 把redis的可執(zhí)行程序文件放入路徑環(huán)境變量的目錄中便于系統(tǒng)識別
ln -s /usr/local/redis/bin/* /usr/local/bin/
### 當 install_server.sh 腳本運行完畢,Redis 服務(wù)就已經(jīng)啟動,默認監(jiān)聽端口為 6379
netstat -natp | grep redis
### Redis 服務(wù)控制
/etc/init.d/redis_6379 stop?? ??? ??? ??? ?#停止
/etc/init.d/redis_6379 start?? ??? ??? ?#啟動
/etc/init.d/redis_6379 restart?? ??? ??? ?#重啟
/etc/init.d/redis_6379 status?? ??? ??? ?#狀態(tài)
?
### 修改配置 /etc/redis/6379.conf 參數(shù)
vim /etc/redis/6379.conf
bind 127.0.0.1 192.168.10.23?? ??? ??? ??? ?#70行,添加 監(jiān)聽的主機地址
port 6379?? ??? ??? ??? ??? ??? ??? ??? ??? ?#93行,Redis默認的監(jiān)聽端口
daemonize yes?? ??? ??? ??? ??? ??? ??? ??? ?#137行,啟用守護進程
pidfile /var/run/redis_6379.pid?? ??? ??? ??? ?#159行,指定 PID 文件
loglevel notice?? ??? ??? ??? ??? ??? ??? ??? ?#167行,日志級別
logfile /var/log/redis_6379.log?? ??? ??? ??? ?#172行,指定日志文件
/etc/init.d/redis_6379 restart
?
2. redis 命令
redis-server:用于啟動 Redis 的工具
redis-benchmark:用于檢測 Redis 在本機的運行效率
redis-check-aof:修復(fù) AOF 持久化文件
redis-check-rdb:修復(fù) RDB 持久化文件
redis-cli:Redis 命令行工具
------ redis-cli 命令行工具 ------
語法:redis-cli -h host -p port -a password
-h :指定遠程主機
-p :指定 Redis 服務(wù)的端口號
-a :指定密碼,未設(shè)置數(shù)據(jù)庫密碼可以省略-a 選項
若不添加任何選項表示,則使用 127.0.0.1:6379 連接本機上的 Redis 數(shù)據(jù)庫
redis-cli -h 192.168.10.23 -p 6379
?
---- redis-benchmark 測試工具 -----
redis-benchmark 是官方自帶的 Redis 性能測試工具,可以有效的測試 Redis 服務(wù)的性能。
基本的測試語法:redis-benchmark [選項] [選項值]。
-h :指定服務(wù)器主機名。
-p :指定服務(wù)器端口。
-s :指定服務(wù)器 socket
-c :指定并發(fā)連接數(shù)。?
-n :指定請求數(shù)。
-d :以字節(jié)的形式指定 SET/GET 值的數(shù)據(jù)大小。
-k :1=keep alive 0=reconnect 。
-r :SET/GET/INCR 使用隨機 key, SADD 使用隨機值。
-P :通過管道傳輸<numreq>請求。
-q :強制退出 redis。僅顯示 query/sec 值。
--csv :以 CSV 格式輸出。
-l :生成循環(huán),永久執(zhí)行測試。
-t :僅運行以逗號分隔的測試命令列表。
-I :Idle 模式。僅打開 N 個 idle 連接并等待。
#向 IP 地址為 192.168.10.23、端口為 6379 的 Redis 服務(wù)器發(fā)送 100 個并發(fā)連接與 100000 個請求測試性能
redis-benchmark -h 192.168.10.23 -p 6379 -c 100 -n 100000
#測試存取大小為 100 字節(jié)的數(shù)據(jù)包的性能
redis-benchmark -h 192.168.10.161 -p 6379 -q -d 100
#測試本機上 Redis 服務(wù)在進行 set 與 lpush 操作時的性能
redis-benchmark -t set,lpush -n 100000 -q
?
----- Redis 數(shù)據(jù)庫常用命令 -----
set:存放數(shù)據(jù),命令格式為 set key value
get:獲取數(shù)據(jù),命令格式為 get key
127.0.0.1:6379> set teacher zhangsan
OK
127.0.0.1:6379> get teacher
"zhangsan"
# keys 命令可以取符合規(guī)則的鍵值列表,通常情況可以結(jié)合*、?等選項來使用。
127.0.0.1:6379> set k1 1
127.0.0.1:6379> set k2 2
127.0.0.1:6379> set k3 3
127.0.0.1:6379> set v1 4
127.0.0.1:6379> set v5 5
127.0.0.1:6379> set v22 5127.0.0.1:6379> KEYS * #查看當前數(shù)據(jù)庫中所有鍵127.0.0.1:6379> KEYS v* #查看當前數(shù)據(jù)庫中以 v 開頭的數(shù)據(jù)127.0.0.1:6379> KEYS v? #查看當前數(shù)據(jù)庫中以 v 開頭后面包含任意一位的數(shù)據(jù)127.0.0.1:6379> KEYS v?? #查看當前數(shù)據(jù)庫中以 v 開頭 v 開頭后面包含任意兩位的數(shù)據(jù)
# exists 命令可以判斷鍵值是否存在。
127.0.0.1:6379> exists teacher #判斷 teacher 鍵是否存在
(integer) 1 # 1 表示 teacher 鍵是存在
127.0.0.1:6379> exists tea
(integer) 0 # 0 表示 tea 鍵不存在
# del 命令可以刪除當前數(shù)據(jù)庫的指定 key。
127.0.0.1:6379> keys *
127.0.0.1:6379> del v5
127.0.0.1:6379> get v5
# type 命令可以獲取 key 對應(yīng)的 value 值類型。
27.0.0.1:6379> type k1
string
# rename 命令是對已有 key 進行重命名。(覆蓋)
命令格式:rename 源key 目標key
使用rename命令進行重命名時,無論目標key是否存在都進行重命名,且源key的值會覆蓋目標key的值。在實際使用過程中,建議先用 exists 命令查看目標 key 是否存在,然后再決定是否執(zhí)行 rename 命令,以避免覆蓋重要數(shù)據(jù)。
127.0.0.1:6379> keys v*
1) "v1"
2) "v22"
127.0.0.1:6379> rename v22 v2
OK
127.0.0.1:6379> keys v*
1) "v1"
2) "v2"
127.0.0.1:6379> get v1
"4"
127.0.0.1:6379> get v2
"5"
127.0.0.1:6379> rename v1 v2
OK
127.0.0.1:6379> get v1
(nil)
127.0.0.1:6379> get v2
"4"
# renamenx 命令的作用是對已有 key 進行重命名,并檢測新名是否存在,如果目標 key 存在則不進行重命名。(不覆蓋)
命令格式:renamenx 源key 目標key
127.0.0.1:6379> keys *
127.0.0.1:6379> get teacher
"zhangsan"
127.0.0.1:6379> get v2
"4"
127.0.0.1:6379> renamenx v2 teacher
(integer) 0
127.0.0.1:6379> keys *
127.0.0.1:6379> get teacher
"zhangsan"
127.0.0.1:6379> get v2
"4"
?
# dbsize 命令的作用是查看當前數(shù)據(jù)庫中 key 的數(shù)目。
127.0.0.1:6379> dbsize
#使用config set requirepass yourpassword命令設(shè)置密碼
127.0.0.1:6379> config set requirepass 123456
#使用config get requirepass命令查看密碼(一旦設(shè)置密碼,必須先驗證通過密碼,否則所有操作不可用)
127.0.0.1:6379> auth 123456
127.0.0.1:6379> config get requirepass127.0.0.1:6379> config set requirepass '' #取消設(shè)置的密碼
---- Redis 多數(shù)據(jù)庫常用命令 ----
Redis 支持多數(shù)據(jù)庫,Redis 默認情況下包含 16 個數(shù)據(jù)庫,數(shù)據(jù)庫名稱是用數(shù)字 0-15 來依次命名的。多數(shù)據(jù)庫相互獨立,互不干擾。
?
#多數(shù)據(jù)庫間切換
命令格式:select 序號
使用 redis-cli 連接 Redis 數(shù)據(jù)庫后,默認使用的是序號為 0 的數(shù)據(jù)庫。
127.0.0.1:6379> select 10 #切換至序號為 10 的數(shù)據(jù)庫127.0.0.1:6379[10]> select 15 #切換至序號為 15 的數(shù)據(jù)庫127.0.0.1:6379[15]> select 0 #切換至序號為 0 的數(shù)據(jù)庫
#多數(shù)據(jù)庫間移動數(shù)據(jù)
格式:move 鍵值 序號
127.0.0.1:6379> set k1 100
OK
127.0.0.1:6379> get k1
"100"
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> get k1
(nil)
127.0.0.1:6379[1]> select 0 #切換至目標數(shù)據(jù)庫 0
OK
127.0.0.1:6379> get k1 #查看目標數(shù)據(jù)是否存在
"100"
127.0.0.1:6379> move k1 1 #將數(shù)據(jù)庫 0 中 k1 移動到數(shù)據(jù)庫 1 中
(integer) 1
127.0.0.1:6379> select 1 #切換至目標數(shù)據(jù)庫 1
OK
127.0.0.1:6379[1]> get k1 #查看被移動數(shù)據(jù)
"100"
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> get k1 #在數(shù)據(jù)庫 0 中無法查看到 k1 的值
(nil)
#清除數(shù)據(jù)庫內(nèi)數(shù)據(jù)
FLUSHDB :清空當前數(shù)據(jù)庫數(shù)據(jù)
FLUSHALL :清空所有數(shù)據(jù)庫的數(shù)據(jù),慎用!
?