2017年10月17日 22:51:36 前言將登陸信息和狀態(tài)保存到哪里一直是我困惑的。保存到cookie里面?不不,太不安全;保存到session?不不,處于進程里影響性能降低還易丟失;保存到數(shù)據(jù)庫?我的確這樣想過也試過,安全又完整但是讀數(shù)據(jù)庫讓我不滿意;保存到HttpRunTime.Cache里面? 在查找一些資源后我了解到可以保存到緩存數(shù)據(jù)庫里面,memcache就是其中一款緩存數(shù)據(jù)庫,并且還擁有其他的好處。 在我們了解memcache之前,先了解以下信息: 傳統(tǒng)數(shù)據(jù)庫面臨的問題Web程序在面臨海量數(shù)據(jù)、高并發(fā)請求時,傳統(tǒng)的數(shù)據(jù)庫往往會面臨以下問題: 數(shù)據(jù)庫死鎖數(shù)據(jù)庫基本操作curd,死鎖是數(shù)據(jù)庫高并發(fā)的明顯問題:r要加S鎖(共享鎖,可以查看但是無法cud),cud要加X鎖(排他鎖,可以curd,其他事務(wù)無法再次加鎖),當高并發(fā)請求,數(shù)據(jù)庫可能產(chǎn)生死鎖(數(shù)據(jù)庫阻塞,永遠等待狀態(tài))。這是無法避免的問題。以下是解決死鎖的常見手段: 磁盤IO數(shù)據(jù)庫把數(shù)據(jù)保存到磁盤上,讀取慢,磁盤IO是一大原因,因為磁盤IO是硬件問題。常見解決方式如下: 接下來使用控制臺應(yīng)用程序來操作memcache。 正文了解memcachememcache官網(wǎng) memcached是一種高性能,分布式的內(nèi)存對象緩存系統(tǒng),本質(zhì)上是通用的,但最初旨在通過減輕數(shù)據(jù)庫負載來加速動態(tài)Web應(yīng)用程序。 原理內(nèi)存處理
客戶端實現(xiàn)分布式: 給memcache配置多個服務(wù)器ip,當需要查詢時會尋找哪臺服務(wù)器或者添加一個數(shù)據(jù)時會保存到哪一個服務(wù)器上呢?memcache對key值進行哈希計算然后對配置的服務(wù)器總數(shù)進行取余,余數(shù)是幾就向第幾臺服務(wù)器進行操作。這就導(dǎo)致了一個問題:當服務(wù)器數(shù)量發(fā)生變化時會導(dǎo)致部分數(shù)據(jù)丟失(查詢指向服務(wù)器錯誤)。想要這種影響降低到最低,可以使用一致性哈希算法。 走socket 數(shù)據(jù)通信走的是socket。
基本命令這里引用IBM developerWorks里面的一篇文章部分內(nèi)容 基本 memcached 客戶機命令 您將使用五種基本 memcached 命令執(zhí)行最簡單的操作。這些命令和操作包括: set add replace get delete 前三個命令是用于操作存儲在 memcached 中的鍵值對的標準修改命令。它們都非常簡單易用,且都使用清單 5 所示的語法: 清單 5. 修改命令語法 command key flags expiration time bytes value key key 用于查找緩存值 flags 可以包括鍵值對的整型參數(shù),客戶機使用它存儲關(guān)于鍵值對的額外信息 expiration time 在緩存中保存鍵值對的時間長度(以秒為單位,0 表示永遠) bytes 在緩存中存儲的字節(jié)點 value 存儲的值(始終位于第二行)
其中key最大長度255字符。 memcache與memcachedmemcache是項目的名字,memcached是項目被可執(zhí)行代碼的名字,一般指同一個東西。 memcache的適用范圍可以將其視為應(yīng)用程序的短期內(nèi)存。不適合保存持久化數(shù)據(jù)。其是分布式系統(tǒng),數(shù)據(jù)分布在多個機器上遷移很麻煩。也不會記錄數(shù)據(jù)。這里用戶的登陸狀態(tài)并不需要專門保存,可以使用memcache保存。 memcache的客戶端和服務(wù)端memcache有客戶端和服務(wù)端之分,客戶端編程,需要引用相應(yīng)的dll文件;服務(wù)端開啟memcached服務(wù)。 memcache服務(wù)端本身不支持windows下使用,但是一些愛好者提供了windows下的exe程序來開啟這個服務(wù)。 請搜索Memcached.ClientLibrary來下載你需要使用的dll文件和exe服務(wù),我是在sourceforge這里下載的。 memcache與redis異同memcache經(jīng)常與redis進行對比 相同點: 都使用內(nèi)存;效率都很高,1s內(nèi)讀1w次,寫10w次都很平常; 不同點:
線程 memcache是多線程,redis是單線程,所以寫多數(shù)據(jù)時memcache效率更好。 數(shù)據(jù)類型 memcached使用key-value存儲,本身就是一個hash(哈希表)。 redis現(xiàn)階段提供五種數(shù)據(jù)類型:string(字符串類型)、list(鏈表)、set(集合)、zset(有序集合)、hash(哈希表)。 數(shù)據(jù)存儲 memcache是分布式系統(tǒng),每個服務(wù)器都值保存一部分數(shù)據(jù),遷移很弱(memcache定位就是短期內(nèi)存,保存在memcache里面的數(shù)據(jù)本來就是不需要遷移的)。斷電丟失數(shù)據(jù)。 redis啟用內(nèi)存但是可以保證數(shù)據(jù)持久化、完整性和同步,即每個服務(wù)器都保存完整數(shù)據(jù)。這是因為redis的存儲分為內(nèi)存存儲、磁盤存儲和log文件三部分,配置文件中有三個參數(shù)對其進行配置,斷電之后可以通過文件來恢復(fù)數(shù)據(jù);使用快照的方式進行數(shù)據(jù)同步。
簡單使用memcached打開memcache服務(wù)這一步相當玉開啟服務(wù)端的memcache服務(wù)。在windows下開啟服務(wù)相當簡單,直接打開這個exe程序就行了
但是這個程序結(jié)束后服務(wù)就關(guān)閉了。這里把它安裝成windows下的一個服務(wù)。 打開管理員命令提示符,輸入exe文件的路徑和安裝命令
然后memcached就成為windows下的一個服務(wù)了,可以設(shè)置自動手動之類的。
 使用memcached命令如果只是布置服務(wù)端的話,上一步就已經(jīng)完成了。如果想要連接服務(wù)端的memcached服務(wù)并且使用命令的話,可以使用以下步驟: 1. 打開Telnet客戶端服務(wù)
2. 打開管理員命令提示符連接服務(wù)端memcached服務(wù)
3. 使用命令 連接成功后就會進入控制臺界面
第一行代碼是不可見的,可以按enter再輸入stats(或者直接stats)打開memcached統(tǒng)計信息
 然后就可以愉快地輸入你的命令了,如使用add命令來添加和get命令獲取值,key值已經(jīng)存在就會返回NOT_STORED提示,如果正確添加就會返回STORED提示。

注意: 命令無法退格,所以輸錯就按enter重新輸入 memcached默認端口11211
添加引用默認memcache引用程序集會自帶一個log4net.dll文件以便錯誤時可以記錄日志,這里并不需要記錄日志就不引用。
 程序代碼using Memcached.ClientLibrary;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MemcachedDemo
{
class Program
{
static void Main(string[] args)
{
//SockIOPool是Memcached客戶端提供的一個套接字連接池,是與Memcached服務(wù)器端交換數(shù)據(jù)的對象。
//SockIOPool在應(yīng)用程序啟動時初始化一次就可以了,我們可以把這個工作放在 GLOBAL.ASAX.CS的Application_Start方法里。
try
{
MemcachedClient mc = new MemcachedClient();
mc.EnableCompression = false;
string[] serverlist = {"127.0.0.1:11211"};
SockIOPool pool = SockIOPool.GetInstance();
//初始化
pool.SetServers(serverlist);
pool.InitConnections = 3;
pool.MinConnections = 3;
pool.MaxConnections = 50;
pool.SocketConnectTimeout = 1000;
pool.SocketTimeout = 3000;
pool.MaintenanceSleep = 30;
pool.Failover = true;
pool.Nagle = false;
pool.Initialize();
mc.Add("key1","這是第一個數(shù)據(jù)",0);
string value= mc.Get("key1") as string;
Console.WriteLine(value);
}
catch (Exception err)
{
//這里可以用Log4Net記錄Error
}
Console.ReadLine();
}
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
運行效果
引申集群和分布式 數(shù)據(jù)庫集群:往往在同一局域網(wǎng),使用同一個IP,每個數(shù)據(jù)庫有完整數(shù)據(jù),難點是數(shù)據(jù)同步,遷移方便。 數(shù)據(jù)庫分布式:每個系統(tǒng)擁有部分數(shù)據(jù),使用使用簡單,數(shù)據(jù)遷移麻煩。 Redis主從數(shù)據(jù)庫 主庫負責寫,從庫負責讀,壓力分流。 主庫掛掉,隨機選擇一個從庫成為主庫。 數(shù)據(jù)如何同步:快照。
總結(jié)memcache的key值最大255字符 memcached的塊最大1M
若有錯誤請指正,不勝感激。來源:http://www./content-4-175951.html
|