1. 程式人生 > >NoSQL(1)——memcached

NoSQL(1)——memcached

一、NoSQL

  • 什麼是NoSQL

  1. 非關係型資料庫就是NoSQL,關係型資料庫代表MySQL
  2. 對於關係型資料庫來說,是需要把資料儲存到庫、表、行、欄位裡,查詢的時候根據條件一行一行地2去匹配,當量非常大的時候就很耗費時間和資源,尤其是資料是需要從磁盤裡去檢索
  3. NoSQL資料庫儲存原理非常簡單(典型的資料型別為k-v),不存在繁雜的關係鏈,比如mysql查詢的時候,需要找到對應的庫、表(通常是多個表)以及欄位。
  4. NoSQL資料可以儲存在記憶體裡,查詢速度非常快
  5. NoSQL在效能表現上雖然能優於關係型資料庫,但是它並不能完全替代關係型資料庫
  6. NoSQL因為沒有複雜的資料結構,擴充套件非常容易,支援分散式
  • 常見的資料庫

  1. k-v(key-value)形式的:memcached、redis 適合儲存使用者資訊,比如會話、配置檔案、引數、購物車等等。這些資訊一般都和ID(鍵)掛鉤,這種情景下鍵值資料庫是個很好的選擇。
  2. 文件資料庫:mongodb 將資料以文件的形式儲存。每個文件都是一系列資料項的集合。每個資料項都有一個名稱與對應的值,值既可以是簡單的資料型別,如字串、數字和日期等;也可以是複雜的型別,如有序列表和關聯物件。資料儲存的最小單位是文件,同一個表中儲存的文件屬性可以是不同的,資料可以使用XML、JSON或者JSONB等多種形式儲存。
  3. 列儲存 Hbase
  4. 圖 Neo4J、Infinite Graph、OrientDB

二、memcached介紹

  • Memcached是國外社群網站LiveJournal團隊開發,目的是為了通過快取資料庫查詢結果,減少資料庫訪問次數,從而提高動態web站點效能。
  • Memcached它有以下特點:
  1. 資料結構簡單(k-v),資料存放在記憶體裡
  2. 多執行緒
  3. 基於c/s架構,協議簡單
  4. 基於libevent的事件處理
  5. 自主記憶體儲存處理(slab allowcation)
  6. 資料過期方式:Lazy Expiration 和 LRU
  • Memcached的資料流向

在這裡插入圖片描述
Memcached的資料流向,如圖所示:

  1. 使用者請求給web伺服器,伺服器通過php去db上查詢資料,並反饋給使用者。
  2. 當web伺服器查到資料同時會把資料結果儲存到memcached中。
  3. 當用戶再次需要查詢該資料,web就會直接從memcached中讀取資料。
  • Slab allocation(自主記憶體儲存處理)

  1. Slab Allocation的原理
  2. 將分配的記憶體分割成各種尺寸的塊(chunk), 並把尺寸相同的塊分成組(chunk的集合),每個chunk集合被稱為slab。
  3. Memcached的記憶體分配以Page為單位,Page預設值為1M,可以在啟動時通過-I引數來指定。
  4. Slab是由多個Page組成的,Page按照指定大小切割成多個chunk。
    在這裡插入圖片描述
  • Growth factor

  1. Memcached在啟動時通過-f選項可以指定 Growth Factor因子。該值控制chunk大小的差異。預設值為1.25。
  2. 通過memcached-tool命令檢視指定Memcached例項的不同slab狀態,可以看到各Item所佔大小(chunk大小)差距為1.25
  3. 命令: memcached-tool 127.0.0.1:11211 display
  • Memcached的資料過期方式

  1. Lazy Expiration
    Memcached 內部不會監視記錄是否過期,而是在get時檢視記錄的時間戳,檢查記錄是否過期。這種技術被稱為lazy(惰性)expiration。因此,Memcached不會在過期監視上耗費CPU時間。

  2. 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
  • 可以配置引數的啟動引數
  1. -u 指定執行memcached服務的使用者
  2. -p 執行監聽端
  3. -m 指定記憶體大小 單位M
  4. -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狀態
  1. 安裝nc工具
yum install -y nc
  1. 使用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狀態
  1. 先安裝 libmemcached
yum install -y libmemcached
  1. 使用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
  1. 格式:telnet IP 埠
  2. 安裝並執行
1. yum install -y telnet
2. telnet 127.0.0.1 11211
3. 退出Telnet按Ctrl+]再輸入quit撤銷按Ctrl+退格鍵
  • 使用nc進入memcached
  1. 格式: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鍵
  1. 可以是set, add, replace
    • set表示按照相應的儲存該資料,沒有的時候增加,有的時候覆蓋
    • add表示按照相應的新增該資料,但是如果該已經存在則會操作失敗
    • replace表示按照相應的替換資料,但是如果該不存在則操作失敗。
  2. 客戶端需要儲存資料的key
  3. 是一個16位的無符號的整數(以十進位制的方式表示)。該標誌將和需要儲存的資料一起儲存,並在客戶端get資料時返回。客戶端可以將此標誌用做特殊用途,此標誌對伺服器來說是不透明的。
  4. 為過期的時間。
    • 若為0表示儲存的資料永遠不過期(但可被伺服器演算法:LRU 等替換)。
    • 如果非0(unix時間或者距離此時的秒數),當過期後,伺服器可以保證使用者得不到該資料(以伺服器時間為標準)。
  5. 需要儲存的位元組數,當用戶希望儲存空資料時可以為0
  6. 需要儲存的內容,輸入完成後,最後客戶端需要加上\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.

相關推薦

NoSQL1——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搭建Memcached1

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

開始寫博客,學習Linq1

設計 查詢 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

LFS1——軟件包及其功能

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 {