memcached 緩存資料庫應用實踐

来源:http://www.cnblogs.com/clsn/archive/2017/12/07/7999510.html
-Advertisement-
Play Games

1.1 資料庫對比 緩存: 將數據存儲到記憶體中,只有當磁碟勝任不了的時候,才會啟用緩存 缺點:斷電數據丟失(雙電),用緩存存儲數據的目的只是為了應付大併發的業務。 資料庫: mysql(關係型資料庫,能夠保證數據一致性,保證數據不丟失,當因為功能太多,導致性能不高) 數據參考 緩存資料庫: memc ...


1.1 資料庫對比

緩存: 將數據存儲到記憶體中,只有當磁碟勝任不了的時候,才會啟用緩存

      缺點:斷電數據丟失(雙電),用緩存存儲數據的目的只是為了應付大併發的業務。

資料庫: mysql(關係型資料庫,能夠保證數據一致性,保證數據不丟失,當因為功能太多,導致性能不高) ===數據參考

緩存資料庫:  memcache redis(非關係型資料庫,性能極高,但不保證數據完整性) === 業務的數據提供者

             memcachedb 會將記憶體的數據寫入到磁碟中

        redis 主要工作場所是記憶體中,但是定期備份記憶體數據到硬碟

1.1.1 資料庫的選擇

  數據存儲,數據倉庫選擇mysql這種磁碟的資料庫

  高併發,業務大的應用選擇memcache這種記憶體資料庫

1.1.2 資料庫分類

  關係型資料庫  mysql

  非關係型資料庫(NOSQL) memcached redis MongoDB

1.2 memcached介紹

      Memcached是一款開源的、高性能的純記憶體緩存服務軟體。Mem是記憶體的意思,cache是緩存的意思,d是daemon的意思。

  memcache 是項目名稱,也是一款軟體,其架構是C/S架構

       memcached官網:http://memcached.org/

1.2.1 memcache優點

①   對於用戶來講,用戶訪問網站更快了,體驗更好了。

②對網站來說,資料庫壓力降低了。只有當記憶體沒有數據時才會去請求資料庫。第一次寫入的數據也會請求資料庫。一般公司沒有預熱,只有當用戶讀取過資料庫才會放到Memcached中。

②   提升了網站的併發訪問,減少伺服器數量。

1.3 Memcached在企業中使用場景

1.3.1 作為資料庫的前端緩存應用

   當資料庫(mysql)承受不了大併發的請求時,可以將數據緩存到記憶體中(緩存資料庫),然後就可以解決

      作為資料庫的前端緩存最大目的:減少資料庫被大量訪問的壓力

1.3.2 作為集群後端的session會話保持

       session存儲在文件,資料庫,memcache,或記憶體等的服務端上,

     cookie  存放在客戶端瀏覽器上。

     session是一個存在伺服器上的類似於一個散列表格的文件。裡面存有我們需要的信息,在我們需要用的時候可以從裡面取出來。

   session依賴cookie存在,請求客戶端到達服務端後,服務端會隨機生成一個字元串,作為該用戶的標識,該字元串通過cookie返回給客戶端,客戶端瀏覽器會以該字元串為key放到session id裡面,隨機字元串的key裡面可以先沒有值。如果用戶再次提交,請求信息中的用戶名密碼等用戶信息保存在隨機字元串的value中,請求到達服務端,用戶名密碼正確,隨機字元串會被授權,提一個標記給到sessionid中的隨機字元串的value中,證明該用戶已經是登錄狀態,客戶端再次帶著該隨機字元串訪問服務端,服務端會知道該用戶已經登錄不需驗證,直接返回請求的信息。

session和cookie區別

  1、cookie數據存放在用戶的瀏覽器上,session數據存儲在伺服器上

  2、cookie在本地的瀏覽器中,可以被提取分析,安全性差。為了安全,登錄賬戶等信息可以緩存在session中。

  3、session會在一定時間內保存在伺服器上,訪問量增大會給伺服器帶來壓力,可以使用緩存工具,如memcache等

1.3.3 網站開發如何判斷用戶信息

  最開始的技術方法:伺服器在你的瀏覽器中寫一個cookies,這個cookies就包含了你的用戶名及登錄信息。因為cookies是存儲在本地瀏覽器中,所以第三方工具很容易盜取cookies信息。

最開始:

      cookies   cookies名字:內容(用戶名,登錄信息)

改進後:

      本地瀏覽器存放:

      cookies   cookies名字:內容(session id 編號)

      伺服器存放:

      session   session id:內容(用戶名,登錄信息)

主流使用場景:cookies + session

1.3.4 session共用的不同解決方案

     1、session文件提供NFS共用

     2、session文件提供rsync  scp共用

     3、將session的內容存放在資料庫(mysql)中,所有的機器都可以通過ip:port讀取

     4、將session的內容存放在緩存資料庫中,所有的機器都可以通過ip:port讀取

     好處:利用斷電、重啟丟失數據的特性。定時清理數據;提高併發

1.3.5 memcache原理優點

  啟動Memcached吋,根據指定的記憶體大小參數,會被分配一個記憶體個間。當我們讀取資料庫的各類業務數據後,數據會同吋放入Memcached緩存中,,下一次用戶請求同樣的數據,程式直接去Memcached取數據返回給用戶。

 優點:

  ①    對於用戶來講,用戶訪問網站更快了,體驗更好了。#

  ②   對網站來說,資料庫壓力降低了。只有當記憶體沒有數據時才會去請求資料庫。第一次寫入的數據 也會請求資料庫。一般公司沒有預熱,只有,用戶讀取過資料庫才會放到Memcached中。

  ③   提升了網站的併發訪問,減少伺服器數最。

 

原理圖

1.4 Memcached分散式緩存集群

  memcached天生不支持分散式集群,需要通過程式支持分散式存儲

1.4.1 Memcached分散式緩存集群的特點

     1. 所有MC伺服器記憶體的內容都是不一樣的。這些伺服器內容加起來接近資料庫的容量。比如1T的資料庫,一臺緩存資料庫的記憶體沒有那麼大,因此分成10台緩存伺服器。

     2. 通過在客戶端(Web)程式或者MC的負載均衡器上用HASH演算法,讓同一內容都分配到一個MC伺服器。

     3. 普通的HASH演算法對於節點宕機會帶來大量的數據流動(失效),可能會引起雪崩效應。

     4. 一致性HASH可以讓節點宕機對節點的數據流動(失效)降到最低。

普通的hash演算法

 

  首先將key處理為一個32位字元串,取前8位,在經過hash計算處理成整數並返回,然後映射到其中一臺伺服器這樣得到其中一臺伺服器的配置,利用這個配置完成分散式部署。在伺服器數量不發生變化的情況下,普通hash分佈可以很好的運作,當伺服器的數量發生變化,問題就來了。試想,增加一臺伺服器,同一個key經過hash之後,與伺服器取模的結果和沒增加之前的結果肯定不一樣,這就導致了,之前保存的數據丟失。

一致性hash演算法

 

一致性哈希演算法

  優點:在分散式的cache緩存中,其中一臺宕機,遷移key效率最高

  將伺服器列表進行排序,根據mHash($key) 匹配相鄰伺服器

一致性hash演算法  將數據流動降到最低

參考資料

http://blog.csdn.net/cywosp/article/details/23397179
http://blog.csdn.net/zhangskd/article/details/50256111

第2章 memcached使用

2.1 安裝memcached

2.1.1 環境說明

[root@cache01 ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core) 
[root@cache01 ~]# uname -r
3.10.0-693.el7.x86_64
[root@cache01 ~]# getenforce
Disabled
[root@cache01 ~]# systemctl status firewalld.service 
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)
[root@cache01 ~]# hostname -I
10.0.0.21 172.16.1.21

2.1.2 安裝memcached

[root@cache01 ~]# yum -y install memcached

2.1.3 查看配置

[root@cache01 ~]# cat /etc/sysconfig/memcached 
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS=""

2.1.4 查看啟動腳本

[root@cache01 ~]# cat /usr/lib/systemd/system/memcached.service 
[Unit]
Description=Memcached 
Before=httpd.service
After=network.target

[Service]
Type=simple
EnvironmentFile=-/etc/sysconfig/memcached
ExecStart=/usr/bin/memcached -u $USER -p $PORT -m $CACHESIZE -c $MAXCONN $OPTIONS

[Install]
WantedBy=multi-user.target

2.1.5 啟動服務

[root@cache01 ~]# systemctl start memcached.service

2.2 管理memcached

2.2.1 memcached資料庫語法格式

set              key   0        0           10

<command name>  <key> <flags> <exptime> <bytes>\r\n

  \n 換行且游標移至行首

  \r 游標移至行首,但不換行

參數

說明

<flags>

是在取回內容時,與數據和發送塊一同保存伺服器上的任意16位無符號整形(用十進位來書寫)。客戶端可以用它作為“位域”來存儲一些特定的信息;它對伺服器是不透明的。

<exptime>

是終止時間。如果為0,該項永不過期(雖然它可能被刪除,以便為其他緩存項目騰出位置)。如果非0Unix時間戳或當前時刻的秒偏移),到達終止時間後,客戶端無法再獲得這項內容

<bytes>

是隨後的數據區塊的位元組長度,不包括用於分頁的“\r\n”。它可以是0(這時後面跟隨一個空的數據區塊)。

<data block>\r\n

<data block> 是大段的8位數據,其長度由前面的命令行中的<bytes>指定。

2.2.2 資料庫使用

寫入讀取數據

[root@cache01 ~]# printf "set key008 0 0 10\r\noldboy0987\r\n"|nc 10.0.0.21 11211
STORED
[root@cache01 ~]# printf "get key008\r\n"|nc 10.0.0.21 11211
VALUE key008 0 10
oldboy0987
END

寫入數據長度不符合,定義過大

[root@cache01 ~]# printf "set key009 0 0 11\r\noldboy0987\r\n"|nc 10.0.0.21 11211
[root@cache01 ~]# printf "get key009\r\n"|nc 10.0.0.21 11211
END

寫入數據長度不符合,定義過小

[root@cache01 ~]# printf "set key010 0 0 9\r\noldboy0987\r\n"|nc 10.0.0.21 11211
CLIENT_ERROR bad data chunk
ERROR
[root@cache01 ~]# printf "get key010\r\n"|nc 10.0.0.21 11211
END

時效性

[root@cache01 ~]# printf "set key011 0 10 10\r\noldboy0987\r\n"|nc 10.0.0.21 11211
STORED
[root@cache01 ~]# printf "get key011\r\n"|nc 10.0.0.21 11211
VALUE key011 0 10
oldboy0987
END
[root@cache01 ~]# printf "get key011\r\n"|nc 10.0.0.21 11211
END

刪除數據

[root@cache01 ~]# printf "delete key008\r\n"|nc 10.0.0.21 11211
DELETED
[root@cache01 ~]# printf "get key008\r\n"|nc 10.0.0.21 11211
END

2.3 memcache php版本客戶端安裝使用

命令集

#編譯進去php_mem
tar zxvf memcache-2.2.5.tgz
cd memcache-2.2.5
/application/php/bin/phpize
./configure --enable-memcache --with-php-config=/application/php/bin/php-config --with-zlib-dir
make
make install
# 激活php_memcached
sed -i '$a extension=memcache.so' /application/php/lib/php.ini
pkill php
/application/php/sbin/php-fpm -t
/application/php/sbin/php-fpm
/application/php/bin/php -m|grep memcache

檢查當前環境

查看php的模塊

 1 查看php的模塊
 2 [root@web06 ~]# /application/php/bin/php -m
 3 [PHP Modules]
 4 bcmath
 5 Core
 6 ctype
 7 curl
 8 date
 9 dom
10 ereg
11 fileinfo
12 filter
13 ftp
14 gd
15 hash
16 iconv
17 json
18 libxml
19 mbstring
20 mcrypt
21 mhash
22 mysql
23 mysqlnd
24 openssl
25 pcntl
26 pcre
27 PDO
28 pdo_mysql
29 pdo_sqlite
30 Phar
31 posix
32 Reflection
33 session
34 shmop
35 SimpleXML
36 soap
37 sockets
38 SPL
39 sqlite3
40 standard
41 sysvsem
42 tokenizer
43 xml
44 xmlreader
45 xmlrpc
46 xmlwriter
47 xsl
48 zlib
49 
50 [Zend Modules]
View Code 查看php的模塊

執行過程

編譯安裝

[root@web06 memcache-2.2.5]# make install
Installing shared extensions:     /application/php-5.5.32/lib/php/extensions/no-debug-non-zts-20121212/
[root@web06 memcache-2.2.5]# ls /application/php/lib/php/extensions/no-debug-non-zts-20121212/
memcache.so
[root@web06 memcache-2.2.5]# sed -i '$a extension=memcache.so' /application/php/lib/php.ini
[root@web06 memcache-2.2.5]# pkill php
[root@web06 memcache-2.2.5]# /application/php/sbin/php-fpm -t
[17-Nov-2017 11:39:13] NOTICE: configuration file /application/php-5.5.32/etc/php-fpm.conf test is successful

[root@web06 memcache-2.2.5]# /application/php/sbin/php-fpm
[root@web06 memcache-2.2.5]# /application/php/bin/php -m|grep memcache
memcache

2.3.1 編寫測試文件

[root@web01 blog]# cat /application/nginx/html/blog/mc.php
<?php
    $memcache = new Memcache;
    $memcache->connect('10.0.0.21', 11211) or die ("Could not connect");
    $memcache->set('key20171117', 'hello,world');
    $get_value = $memcache->get('key20171117');
    echo $get_value;
?>

瀏覽器訪問

 

資料庫讀取測試

[root@cache01 ~]# printf "get key20171117 \r\n"|nc 10.0.0.21 11211 
VALUE key20171117 0 11
hello,world
END

2.4 web管理memcached

  使用的軟體memadmin

  官網:http://www.junopen.com/memadmin/

將程式包放如站點目錄,瀏覽器進行訪問即可

[root@web06 tools]# tar xf memadmin-1.0.12.tar.gz -C /application/nginx/html/blog/

   預設用戶名密碼為admin

 

   添加一個新的memcached伺服器

 

   web界面管理全中文,較為簡單

 

2.5 memcached數據緩存

通過程式實現

2.5.1 blog站點實現memcached存儲

[root@web06 ~]# cat /application/nginx/html/blog/wp-content/object-cache.php

 

2.6 memcached session共用

方法1:

  通過程式實現,web01只需要往memcahce寫session,web02從memcahce讀session(更具有通用性)

方法2:

  通過php的配置文件,讓php預設將session存儲在文件中,修改為存儲在memcached中

sed -i 's#session.save_handler = files#session.save_handler = memcache#;$a session.save_path = "tcp://10.0.0.21:11211"' /application/php/lib/php.ini

  使用這個功能,需要使用php的session函數

   本文出自“慘綠少年”,歡迎轉載,轉載請註明出處!http://blog.znix.top


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 溫故而知新,今天學習Math.Max和Min的方法。這2個方法,均需要傳入2個參數,返回參數中最大值和最小值。 class Ac { public void LeanMathFunction() { int min = Math.Min(5,3); Console.WriteLine("5,3最小值 ...
  • XAML代碼: <ControlTemplate x:Key="btnTpl" TargetType="RadioButton"> <StackPanel Orientation="Vertical" Height="30" Background="Transparent"> <Border Nam ...
  • 1.創建服務引用 例如:天氣預報 2.在代碼添加引用空間 1 TvProgram.ChinaTVprogramWebService tp = new TvProgram.ChinaTVprogramWebService(); 2 DataSet ds= tp.getAreaDataSet(); 3. ...
  • 演示產品下載地址:http://www.jinhusns.com ...
  • 1.對稱加密 例子:壓縮文件加密碼,別人要打開,只能知道你的密碼,這樣的方法不安全,因為這個密碼可能是你的qq密碼或者是郵箱密碼等等 2.非對稱加密 類似於放羽毛球的桶,兩邊都可以拿資源,兩邊都加一個鎖,一個是我自己的公鑰,一個是我想給對方的公鑰 3. ssh scp是linux之間傳遞文件簡單的命 ...
  • 波特率就是發送二進位數據位的速率, 習慣上用 baud 表示, 即我們發送一位二進位數據的持續時間=1/baud。 在通信之前, 單片機 1 和單片機 2 首先都要明確的約定好它們之間的通信波特率, 必須保持一致, 收發雙方纔能正常實現通信, 這一點大家一定要記清楚。約定好速度後, 我們還要考慮第二 ...
  • 在上章34.Linux-printk分析、使用printk調試驅動里講述了: printk()會將列印信息存在內核的環形緩衝區log_buf[]里, 可以通過dmesg命令來查看log_buf[] 1.環形緩衝區log_buf[]又是存在內核的哪個文件呢? 位於/proc/kmsg里,所以除了dme ...
  • 花了一下午時間,感覺最坑的是,書寫代碼的個數和編譯器的坑比較多,還各種版本的編譯器! 會讓人“眼花繚亂”! 主要代碼 將文件保存為*.asm 對應的軟體,放在大工院ftp://10.84.0.90上的asm中,只有在機房或者學校內網才能訪問到哦! 或者訪問https://files.cnblogs. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...