【ITOO】--memcache小結

ZeroWM發表於2015-08-05

為什麼要用memcache

    每個技術的出現必然有它出現的原因,為啥要用memcached?查了一下網上的資料,瞭解到Memcache的出現解決了資料庫高併發訪問的瓶頸。當資料架構建立在單資料庫模式,資料庫連線池峰值達500,程式離崩潰就不遠了。有的小網站開發的時候沒有關注效能,等使用者訪問量越來越大,程式很容易崩潰。

    如果客戶端傳送一個請求,服務端從資料庫中存取相關資料,花費高昂。如果每次都從資料庫取相同的資料,造成了資料庫低效。然而如果把第一次取出的資料都存入到記憶體中,下次讀取直接從記憶體中獲得,給資料庫就減負了。

    所以在資料庫和web之間放一層cache層,好處:1.減輕資料庫的負擔 2.提高存取速度。


什麼是memcache?

  Memcached是一個高效能的分散式記憶體物件快取系統,用於動態web應用以減輕資料庫負載。

  上面是官方的回答,我個人的理解是Memcache像一個臨時資料庫,以key-value的形式存取資料,key會通過一個Hash演算法轉換成Hash-key,便於查詢。因為它儲存資料在記憶體中,離cpu比較近,查詢資料是很快速的。




memcache原理是什麼?2015年12月17日(Memcache快取系統知識

1.客戶端傳送web請求,首先memcache Client檢查客戶端請求的資料是否存在memache中,如果有,直接返回資料,不對資料庫進行任何操作,路徑為1237。

2.如果不存在memache中,就去查詢資料庫中的資料,先把資料庫中的資料返回給客戶端,同時快取一份資料在memcache中,路徑為124576.

3.每次更新資料庫的資料的時候,memache會同時更新,保持資料一致性。

4.當分配給memache的空間用完,採用LRU(Least Recently Used,最近最少使用的原則),策略加上到期失效策略,失效資料首先被替換,然後再替換掉最近未使用的資料。


memcache跟cookie、session有什麼異同?

  cookie、session常用來儲存使用者資訊,SSO中使用者資訊存到本地cookie中一份,傳送到session也儲存一份,cookie的安全性比session差。memcached可以用在考試的抽題中,儲存的資料的特色:1.資料量大 2.資料被多次使用。session時效性、存取在伺服器這兩點來說,是比較安全的。cookie可以通過本地cookie加密來解決安全性的問題,手寫SSO裡面cookie存取的使用者密碼就被加密過,資料庫中存取的是也是加密後的資訊。memcached可以通過放在防火牆後面增加自身的安全性。


memcached實戰演練

1.安裝memcached的服務端

  1. 下載memcachewindows穩定版,解壓放某個盤下面,比如在c:\r
  2. cmd下輸入 c:\memcached\memcached.exe -d install 安裝(請不要懷疑,真的安裝完成了!)
  3. 再輸入: c:\memcached\memcached.exe -d start 啟動。預設分配64M記憶體,使用11211)

2.memcached使用

    首先用telnet 127.0.0.1 11211這樣的命令連線上memcache,然後直接輸入stats就可以得到當前memcache的狀態。 (如果輸入telnet 後報telnet不是內部或外部命令的時候,做如下操作。)


得到以下資訊:


3.客戶端程式碼


控制檯程式:


<font size="4"><span style="font-family:SimSun;"><span style="font-size:18px;"><span style="font-family:SimSun;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Memcached.ClientLibrary;

namespace memache
{
    class Program
    {
        static void Main(string[] args)
        {
             //新增多個快取伺服器地址
            string[] serverlist = { "192.168.24.247:11211","192.168.24.175:11211" };
 
             //初始化池
              SockIOPool pool = SockIOPool.GetInstance();
              pool.SetServers(serverlist);
              //設定memcached 的一些引數
              pool.InitConnections = 3;
              pool.MinConnections = 3;
              pool.MaxConnections = 5;
                
              pool.SocketConnectTimeout = 1000;
              pool.SocketTimeout = 3000;
 
              pool.MaintenanceSleep = 30;
              pool.Failover = true;
 
              pool.Nagle = false;
              pool.Initialize();
 
             // 獲得客戶端例項
              MemcachedClient mc = new MemcachedClient();
              mc.EnableCompression = false;
 
            
              Console.WriteLine("------------測   試-----------");
              bool flags1 = mc.Set("user1", "my value");  //儲存資料到快取伺服器,這裡將字串"my value"快取,key 是"test"
              bool flags2 = mc.Set("user2", "my value");
              bool flags3 = mc.Set("user3", "my value");
              bool flags4 = mc.Set("user4", "my value");
              bool flags5 = mc.Set("user5", "my value");
              bool flags6 = mc.Set("user6", "my value");

             if (mc.KeyExists("user1"))   //測試快取存在key為test的專案
              {
                  Console.WriteLine("test is Exists");
                  Console.WriteLine(mc.Get("user1").ToString());  //在快取中獲取key為test的專案
              }
             else
              {
                  Console.WriteLine("test not Exists");
              }
 
             // Console.ReadLine();

             bool flag = mc.Delete("user1");  //移除快取中key為test的專案

             if (mc.KeyExists("user1")) 
              {
                  Console.WriteLine("test is Exists");
                  Console.WriteLine(mc.Get("user1").ToString());
              }
             else
              {
                  //Console.WriteLine("test not Exists");
              }
              
              SockIOPool.GetInstance().Shutdown();  //關閉池, 關閉sockets
            
              Console.ReadLine();
          }

        

        
    }
}
</span></span></span></font>

程式執行結果:

首先要開啟memcached服務,輸入 c:\memcached\memcached.exe -d start 並執行。

啟動程式控制臺,memcached可以用啦!



總結

  學習是一個從羅列知識、個人消化、對比、總結織網、實戰的過程,實戰是最能檢驗人學的如何的方式,做專案挺好的。

   




相關文章