NoSQL(1)——memcached
一、NoSQL
-
什麼是NoSQL
- 非關係型資料庫就是NoSQL,關係型資料庫代表MySQL
- 對於關係型資料庫來說,是需要把資料儲存到庫、表、行、欄位裡,查詢的時候根據條件一行一行地2去匹配,當量非常大的時候就很耗費時間和資源,尤其是資料是需要從磁盤裡去檢索
- NoSQL資料庫儲存原理非常簡單(典型的資料型別為k-v),不存在繁雜的關係鏈,比如mysql查詢的時候,需要找到對應的庫、表(通常是多個表)以及欄位。
- NoSQL資料可以儲存在記憶體裡,查詢速度非常快
- NoSQL在效能表現上雖然能優於關係型資料庫,但是它並不能完全替代關係型資料庫
- NoSQL因為沒有複雜的資料結構,擴充套件非常容易,支援分散式
-
常見的資料庫
- k-v(key-value)形式的:memcached、redis 適合儲存使用者資訊,比如會話、配置檔案、引數、購物車等等。這些資訊一般都和ID(鍵)掛鉤,這種情景下鍵值資料庫是個很好的選擇。
- 文件資料庫:mongodb 將資料以文件的形式儲存。每個文件都是一系列資料項的集合。每個資料項都有一個名稱與對應的值,值既可以是簡單的資料型別,如字串、數字和日期等;也可以是複雜的型別,如有序列表和關聯物件。資料儲存的最小單位是文件,同一個表中儲存的文件屬性可以是不同的,資料可以使用XML、JSON或者JSONB等多種形式儲存。
- 列儲存 Hbase
- 圖 Neo4J、Infinite Graph、OrientDB
二、memcached介紹
- Memcached是國外社群網站LiveJournal團隊開發,目的是為了通過快取資料庫查詢結果,減少資料庫訪問次數,從而提高動態web站點效能。
- Memcached它有以下特點:
- 資料結構簡單(k-v),資料存放在記憶體裡
- 多執行緒
- 基於c/s架構,協議簡單
- 基於libevent的事件處理
- 自主記憶體儲存處理(slab allowcation)
- 資料過期方式:Lazy Expiration 和 LRU
-
Memcached的資料流向
Memcached的資料流向,如圖所示:
- 使用者請求給web伺服器,伺服器通過php去db上查詢資料,並反饋給使用者。
- 當web伺服器查到資料同時會把資料結果儲存到memcached中。
- 當用戶再次需要查詢該資料,web就會直接從memcached中讀取資料。
-
Slab allocation(自主記憶體儲存處理)
- Slab Allocation的原理
- 將分配的記憶體分割成各種尺寸的塊(chunk), 並把尺寸相同的塊分成組(chunk的集合),每個chunk集合被稱為slab。
- Memcached的記憶體分配以Page為單位,Page預設值為1M,可以在啟動時通過-I引數來指定。
- Slab是由多個Page組成的,Page按照指定大小切割成多個chunk。
-
Growth factor
- Memcached在啟動時通過-f選項可以指定 Growth Factor因子。該值控制chunk大小的差異。預設值為1.25。
- 通過memcached-tool命令檢視指定Memcached例項的不同slab狀態,可以看到各Item所佔大小(chunk大小)差距為1.25
- 命令:
memcached-tool 127.0.0.1:11211 display
-
Memcached的資料過期方式
-
Lazy Expiration
Memcached 內部不會監視記錄是否過期,而是在get時檢視記錄的時間戳,檢查記錄是否過期。這種技術被稱為lazy(惰性)expiration。因此,Memcached不會在過期監視上耗費CPU時間。 -
LRUMemcached
會優先使用已超時的記錄的空間,但即使如此,也會發生追加新記錄時空間不足的情況,此時就要使用名為Least Recently Used(LRU)
機制來分配空間。顧名思義,這是刪除“最近最少使用”的記錄的機制。因此,當記憶體空間不足時(無法從slab class
獲取到新的空間時),就從最近未被使用的記錄中搜索,並將其空間分配給新的記錄。從快取的實用角度來看,該模型十分理想。
三、安裝memcached
- 使用yum安裝
[[email protected] ~]# yum install -y memcached libmemcached libevent
- 啟動memcached服務
[[email protected] ~]# systemctl start memcached
[[email protected] ~]# ps aux |grep memcached
memcach+ 1704 0.0 0.1 344080 1672 ? Ssl 21:14 0:00 /usr/bin/memcached -u memcached -p 11211 -m 64 -c 1024
- 可以配置引數的啟動引數
-u
指定執行memcached服務的使用者-p
執行監聽端-m
指定記憶體大小 單位M-c
指定最大併發數
- 啟動引數配置檔案在/etc/sysconfig/memcached
- 更改啟動引數配置檔案
vim /etc/sysconfig/memcached
內容如下:
PORT="11211" ##埠
USER="memcached" ##使用者
MAXCONN="1024" ##最大併發數
CACHESIZE="64" ##分配記憶體大小
OPTIONS="" #監聽的ip
四、檢視memcached狀態
- 使用memcached-tool工具來檢視memcached狀態
memcached-tool 127.0.0.1:11211 stats
#127.0.0.1:11211 Field Value
accepting_conns 1
auth_cmds 0
auth_errors 0
bytes 0
bytes_read 7
bytes_written 0
cas_badval 0
cas_hits 0
cas_misses 0
cmd_flush 0
cmd_get 0
cmd_set 0
cmd_touch 0
conn_yields 0
connection_structures 11
curr_connections 10
curr_items 0
decr_hits 0
decr_misses 0
delete_hits 0
delete_misses 0
evicted_unfetched 0
evictions 0
expired_unfetched 0
get_hits 0
get_misses 0
hash_bytes 524288
hash_is_expanding 0
hash_power_level 16
incr_hits 0
incr_misses 0
libevent 2.0.21-stable
limit_maxbytes 67108864
listen_disabled_num 0
pid 1704
pointer_size 64
reclaimed 0
reserved_fds 20
rusage_system 0.021315
rusage_user 0.000000
threads 4
time 1542201963
total_connections 11
total_items 0
touch_hits 0
touch_misses 0
uptime 698
version 1.4.15
- 生產環境中要留意 curr_items暫存的專案, cmd_get表示總的get次數,get_hits表示get的總命中次數,命中率 = get_hits/cmd_get。
- 使用nc命令來檢視memcached狀態
- 安裝nc工具
yum install -y nc
- 使用nc工具檢視memcached的狀態
echo stats |nc 127.0.0.1 11211
STAT pid 1704
STAT uptime 1460
STAT time 1542202725
STAT version 1.4.15
STAT libevent 2.0.21-stable
STAT pointer_size 64
STAT rusage_user 0.000000
STAT rusage_system 0.038224
STAT curr_connections 10
STAT total_connections 12
STAT connection_structures 11
STAT reserved_fds 20
STAT cmd_get 0
STAT cmd_set 0
STAT cmd_flush 0
STAT cmd_touch 0
STAT get_hits 0
STAT get_misses 0
STAT delete_misses 0
STAT delete_hits 0
STAT incr_misses 0
STAT incr_hits 0
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT touch_hits 0
STAT touch_misses 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 13
STAT bytes_written 1024
STAT limit_maxbytes 67108864
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT hash_power_level 16
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT bytes 0
STAT curr_items 0
STAT total_items 0
STAT expired_unfetched 0
STAT evicted_unfetched 0
STAT evictions 0
STAT reclaimed 0
END
- 使用memstats命令來檢視memcached狀態
- 先安裝 libmemcached
yum install -y libmemcached
- 使用memstats命令
memstat --servers=127.0.0.1:11211
Server: 127.0.0.1 (11211)
pid: 1704
uptime: 1712
time: 1542202977
version: 1.4.15
libevent: 2.0.21-stable
pointer_size: 64
rusage_user: 0.000000
rusage_system: 0.042545
curr_connections: 10
total_connections: 13
connection_structures: 11
reserved_fds: 20
cmd_get: 0
cmd_set: 0
cmd_flush: 0
cmd_touch: 0
get_hits: 0
get_misses: 0
delete_misses: 0
delete_hits: 0
incr_misses: 0
incr_hits: 0
decr_misses: 0
decr_hits: 0
cas_misses: 0
cas_hits: 0
cas_badval: 0
touch_hits: 0
touch_misses: 0
auth_cmds: 0
auth_errors: 0
bytes_read: 30
bytes_written: 2069
limit_maxbytes: 67108864
accepting_conns: 1
listen_disabled_num: 0
threads: 4
conn_yields: 0
hash_power_level: 16
hash_bytes: 524288
hash_is_expanding: 0
bytes: 0
curr_items: 0
total_items: 0
expired_unfetched: 0
evicted_unfetched: 0
evictions: 0
reclaimed: 0
- 總結三種檢視memcache狀態命令
1. memcached-tool IP:埠 stats
2. echo stats |nc IP 埠
3. memstat --servers=IP:埠
五、memcached命令列
- 使用Telnet進入memcached
- 格式:
telnet IP 埠
- 安裝並執行
1. yum install -y telnet
2. telnet 127.0.0.1 11211
3. 退出Telnet按Ctrl+]再輸入quit撤銷按Ctrl+退格鍵
- 使用nc進入memcached
- 格式:
nc IP 埠
nc 127.0.0.1 11211
- Memcached語法規則
<command name>
<key>
<flags>
<exptime>
<bytes>``\r\n
<data block>\r\n\
注:\r\n在windows下是Enter鍵
- 可以是set, add, replace
- set表示按照相應的儲存該資料,沒有的時候增加,有的時候覆蓋
- add表示按照相應的新增該資料,但是如果該已經存在則會操作失敗
- replace表示按照相應的替換資料,但是如果該不存在則操作失敗。
- 客戶端需要儲存資料的key
- 是一個16位的無符號的整數(以十進位制的方式表示)。該標誌將和需要儲存的資料一起儲存,並在客戶端get資料時返回。客戶端可以將此標誌用做特殊用途,此標誌對伺服器來說是不透明的。
- 為過期的時間。
- 若為0表示儲存的資料永遠不過期(但可被伺服器演算法:LRU 等替換)。
- 如果非0(unix時間或者距離此時的秒數),當過期後,伺服器可以保證使用者得不到該資料(以伺服器時間為標準)。
- 需要儲存的位元組數,當用戶希望儲存空資料時可以為0
- 需要儲存的內容,輸入完成後,最後客戶端需要加上\r\n(直接點選Enter)作為結束標誌。
- 新增鍵
set key3 1 100 4 ## 1為標記 100為儲存時間 4為4位數
abcd
STORED
- 獲得鍵對應的值
get key3
VALUE key3 1 4
abcd
END
- 替換值
replace key3 1 200 5 ##replace和set一樣也要輸入<flags> <exptime> <bytes>
abcdx
STORED
- 刪除鍵
delete key3
DELETED
六、memcached資料匯出和匯入
- memcache的資料會因為重啟服務,或者伺服器關機重啟都會導致資料丟失,所以資料的備份就非常重要。
- 使用memcached-tool命令把資料匯出
- 格式:
memcached-tool IP:埠 dump > 備份檔案
- 格式:
[[email protected] ~]# memcached-tool 127.0.0.1:11211 dump > date.txt
Dumping memcache contents
Number of buckets: 1
Number of items : 2
Dumping bucket 1 - 2 total items
[[email protected] ~]# cat date.txt
add shenxinyu 2 1542201265 2
ab
add zhaoyujie 1 1542201265 1
a
[[email protected] ~]# date -d @1542201265
2018年 11月 14日 星期三 21:14:25 CST
- 通過時間戳找出對應的時間。雖然我們設定資料過期時間為0即永不過期,但是匯出資料時會把建立資料的時間做為過期時間,因此需要把時間修改後再匯入資料。
- 使用nc命令把資料匯入
- 格式:
nc IP 埠 < 備份檔案
- 格式:
1. [[email protected] ~]# systemctl restart memcached ##無法匯入已存在的資料,所以需要重啟服務清空資料後再測試
2. [[email protected] ~]# nc 127.0.0.1 11211 < date.txt
STORED
STORED
- 進入memcached,發現數據匯入成功
[[email protected] ~]# nc 127.0.0.1 11211
get zhaoyujie
VALUE zhaoyujie 1 1
a
END
get shenxinyu
VALUE shenxinyu 2 2
ab
END
- 將備份檔案中的add修改為set並更改鍵值後測試,memcached資料存在時是否可以匯入覆蓋:
[[email protected] ~]# cat date.txt
set shenxinyu 2 1542209568 2
bb
set zhaoyujie 1 1542209568 1
b
[[email protected] ~]# nc 127.0.0.1 11211 < date.txt
STORED
STORED
[[email protected] ~]# nc 127.0.0.1 11211
get zhaoyujie
VALUE zhaoyujie 1 1
b
END
get shenxinyu
VALUE shenxinyu 2 2
bb
END
- 匯入並且覆蓋資料成功。
-
七、php連線memcached
- php連結memcached需要安裝memcached的模組
- 移動至目錄/usr/local/src/並下載解壓memcache:
cd /usr/loca/src
wget http://www.apelearn.com/bbs/data/attachment/forum/memcache-2.2.3.tgz
tar zxvf memcache-2.2.3.tgz
- 移動到解壓後的memcache目錄下,並生成configure檔案:
cd memcache-2.2.3
/usr/local/php-fpm/bin/phpize
- 初始化並安裝
./configure --with-php-config=/usr/local/php-fpm/bin/php-config
make && make install
安裝完後會有類似這樣的提示:Installing shared extensions: /usr/local/php-fpm/lib/php/extensions/no-debug-non-zts-20131226/
- 修改php.ini
vim /usr/local/php-fpm/etc/php.ini
增加以下內容:
extension=memcache.so
- 檢查php是否生產memcached模組
[[email protected] memcache-2.2.3]# /usr/local/php-fpm/bin/php -m|grep memcache
memcache
- 下載一個php的測試頁面看是否支援php來操作memcache
curl www.apelearn.com/study_v2/.memcache.txt > 1.php 2>/dev/null
也可以參考:https://coding.net/u/aminglinux/p/yuanke_centos7/git/blob/master/21NOSQL/1.php
- 執行指令碼
/usr/local/php-fpm/bin/php 1.php
輸出內容如下時表示連線成功:
[[email protected] ~]# /usr/local/php-fpm/bin/php 1.php
Get key1 value: This is first value<br>Get key1 value: This is replace value<br>Get key2 value: Array
(
[0] => aaa
[1] => bbb
[2] => ccc
[3] => ddd
)
<br>Get key1 value: <br>Get key2 value: <br>[[email protected] ~]#
- 也可以將1.php放到虛擬主機根目錄下,通過遊覽器訪問。
八、memcached中儲存session
- 當後臺存在有多臺web伺服器時(負載均衡),為了讓使用者的登入狀態等資訊持續線上,就可以讓使用者的session(一般存在伺服器磁碟上)存在memcached中。
- 編輯php.ini
vim /usr/local/php/etc/php.ini
找到下面引數,並註釋掉:
session.save_handler = files
在檔案內新增以下內容:
session.save_handler = memcache
session.save_path = "tcp://192.168.157.128:11211"
- 或者httpd.conf中對應的虛擬主機中新增
php_value session.save_handler "memcache"
php_value session.save_path "tcp://192.168.157.128:11211"
- 或者php-fpm.conf對應的pool中新增
php_value[session.save_handler] = memcache
php_value[session.save_path] = " tcp://192.168.157.128:11211 "
- 下載一個php測試頁面看memcache是否儲存了session
wget http://study.lishiming.net/.mem_se.txt
mv .mem_se.txt /data/wwwroot/zhaoyujie.com/test.php
- 訪問測試頁面,最後一段字串為鍵名
[[email protected] ~]# curl localhost/test.php
1542383652<br><br>1542383652<br><br>7dvifjains9h2sic5ge82sd6a5
[[email protected] ~]# curl localhost/test.php
1542383654<br><br>1542383654<br><br>hroqsbofe2atctq6vvjegulre2
[[email protected] ~]# curl localhost/test.php
1542383654<br><br>1542383654<br><br>m6uvqd4hhkq9k7svq79i48hrh2
- 檢視memcached,發現多出三個專案:
[[email protected] ~]# memcached-tool 127.0.0.1:11211 stats |grep curr_items
curr_items 3
- 連線memcachde
[[email protected] ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
get m6uvqd4hhkq9k7svq79i48hrh2
VALUE m6uvqd4hhkq9k7svq79i48hrh2 0 37
TEST|i:1542383654;TEST3|i:1542383654;
END
get hroqsbofe2atctq6vvjegulre2
VALUE hroqsbofe2atctq6vvjegulre2 0 37
TEST|i:1542383654;TEST3|i:1542383654;
END
- 發現memcached已經儲存了session.
相關推薦
NoSQL(1)——memcached
一、NoSQL 什麼是NoSQL 非關係型資料庫就是NoSQL,關係型資料庫代表MySQL 對於關係型資料庫來說,是需要把資料儲存到庫、表、行、欄位裡,查詢的時候根據條件一行一行地2去匹配,當量非常大的時候就很耗費時間和資源,尤其是資料是需要從磁盤裡
NoSQL系列(1)——memcached源碼安裝使用
NoSQL memcached 數據庫 0. 引言 NoSQL(NoSQL = Not Only SQL ),意即“不僅僅是SQL”,泛指非關系型數據庫,因為NoSQL不僅僅是指一種數據庫。就像關系型數據庫中有MySQL和Oracle等類型,NoSQL也有memcached、MongoDB和red
redis學習(1)--- NoSQL介紹
redis學習 模型 width 快速查詢 init 文件 borde 處理 only 一、NoSQL介紹 1、什麽是NoSQL NoSQL = Not Only SQL 非關系型數據庫 2、為什麽用NoSQL High performance - 高
centos7.4搭建Memcached(1)
memcached 反向代理memcahced是一種基於內存的反向代理系統。是典型的C/S架構:分為服務端memcached和客戶端memchched API 。 本例:服務端192.168.80.81 需要安裝libevent-2.1.8-stable.tar.gz(跨平臺的事件處理接口的封裝,me
memcached的學習(1)
2018.6.11 1、memcached是什麼? memcached 是以LiveJournal 旗下Danga Interactive 公司的Brad Fitzpatric 為首開發的一款軟體。現在已成為 mixi、 hatena、 Facebook、 Vox、LiveJourn
Memcached原始碼分析-網路模型(1)
1 網路模型 Memcached採用了,單程序多執行緒的工作方式,同時採用了libevent事件驅動進行網路請求的處理。 2 工作原理 2.1 libevent介紹 2.2 網路請求流程 2.2.1 流程圖 2.2.2 主執行緒工作流程分析 主執行緒工作流
Memcached原始碼分析之基於Libevent的網路模型(1)
文章列表: 《Memcached原始碼分析 - Memcached原始碼分析之總結篇(8)》 關於Memcached: memcached是一款非常普及的伺服器端快取軟體,memcached主要是基於Libevent庫進行開發的。 如果你還不瞭解libev
傳統檔案系統與NoSQL分散式儲存的塊儲存技術對比(1)
本文第一部分介紹經典檔案系統ext3的塊儲存,第二部分介紹一個NoSQL分散式儲存系統的塊儲存。 ext系列檔案系統是linux的土著檔案系統,歷經4個版本,最新是ext4,在linux 2.6.28核心正式引入,目前比較新的linux發行版都已經把ext4
開始寫博客,學習Linq(1)
設計 查詢 lin 數據源 任務 集成 部分 程序 編程 摘自《linq實戰》原文: 軟件很簡單。它可以歸結為兩件事情:代碼和數據。 開發軟件卻並非那麽簡單,其中很重要的一項任務就是編寫處理數據的代碼。 無論選擇了哪種語言,在程序開發得某個時候你將不得不開始
GuozhongCrawler系列教程 (1) 三大PageDownloader
特點 string null 瀏覽器兼容 ror down odi 系列 lan GuozhongCrawler QQ群 202568714 教程源代碼下載地址:http://pan.baidu.com/s/1pJBmerL GuozhongCrawl
正則表達式(1)
表達式 正則表達式是計算機科學中的一個重要概念。正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。在很多文本編輯器中,正則表達式通常被用來檢索、替換符合某個模式的文本。許多程序設計語言都支持利用正則表達式進行字符串操作。(grep、sed、awk) 為什麽要學習正則表達式?
Angular 4 - The Basics 筆記(1): Install
install rst logs nod first log 筆記 npm app Install Node.js Install Angular CLI sudo npm install -g @angular/cli Set-up new app
【Prince2科普】Prince2的七大原則(1)
步驟 哪些 來看 產品 論證 img .com 驗證 mil 經過前幾講中關於PRINCE2六大要素,四大步驟及整體思維架構的學習,相信各位看官已經對於PRINCE2有了大概的了解,那我們今天的學習內容會正式進入到七大原則內容的分享。 我們先來看一下,PRINCE
SQl 關鍵詞(1)
order by 結果 tro class 問題 重復 ima 排除 數據 1、Distinct 在表中,可能會包含重復值。這並不成問題,不過,有時您也許希望僅僅列出不同(distinct)的值。 關鍵詞 DISTINCT 用於返回唯一不同的值,過濾掉重復選項。 //
JAVA學習筆記(1)——a++與++a的區別
col int 演示 opera 解析 代碼 數據 ++i div 需求:此博客用於解釋i++與++i的區別。 過程: 1、名稱解釋 ++:自增,即在原有數據基礎上+1,再賦給原有數據。 2、程序演示 (1)代碼: 1 class OperateDemo 2 { 3
LFS(1)——軟件包及其功能
shell 選擇 本地化 自制 理解 源代碼 問控制 用戶空間 好的 為了讓自己更加深入理解Linux整個系統架構及工作原理,最近通過LFS學習研究自制Linux系統。參考LFS簡體中文7.7版本。 軟件包及其功能: Acl 管理訪問控制列表(ACL)的工具,用於定義文件和
bash基礎特性(1)
defaults history 緩沖區 記錄 歷史 所有的環境變量可以通過 ehco $# 查看 #為環境變量 bash的基礎特性:(1)命令歷史 history 環境變量: HISTSIZE:命令歷史記錄的條數 HISTFILE;~/.bash_history HIST
ajax初步(1)
request get lin tel sogo 調用 oca head sta 搭建服務器環境,創建一個文件夾,本篇搭建為wamp環境,在www目錄下,創建ajax文件夾。 ajax概念: AJAX 指異步JavaScript及XML(Asynchronous JavaS
圖論講解(1)——圖基礎
同學 根據 tdi sin images 鄰接表 c++ algo ack 前面一直在嗶嗶數論,是不是感覺很煩的慌了?? ╮(╯▽╰)╭唉,你不煩得慌我都煩得慌了! 既然這樣,那我們就改個話題,今天我們就講講圖論。 有的同學就要問圖又是個什麽鬼? 難道是這個嗎?
(十二)Hibernate中的多表操作(1):單向多對一
art 保存 int gen round t對象 情況 映射文件 拋出異常 由“多”方可知“一”方的信息,比如多個員工使用同一棟公寓,員工可以知道公寓的信息,而公寓無法知道員工的信息。 案例一: pojo類 public class Department {