Memcache学习整理
一、Memcache 是什么?
组成:程序进程管理、Socket
程序进程:Memcache把内存先分成几个大份,每一份分成多个小份。例如:小份中有5M...0.9M、0.8M、....0.1M,一份大小为X兆的数据发送过来,如果0.9M<X<0.8M就放到0.9M的区域。因此,memcache没有内存碎片(内存缝隙,区域与区域之间的空间),所以高效。
Socket:此处主要用于数据的收发。详情百度。
二、为什么要用Memcache?
1)磁盘IO的瓶颈:磁盘IO的读写能力是有限的,且远远低于内存的读写能力。而数据库读写是依靠磁盘IO的,当数据库遇到高并发访问时,死锁问题较为突出!Memcache很好的解决了这个问题。
//注释1:并发访问:同一时间,同一数据,多个用户请求访问。
//注释:2:为什么会出现死锁:数据库为了保证数据的唯一性,在每次读和写操作时都会上锁,同一时间只允许一个用户访问数据。同一时间,如果有两个用户,用户A1对数据C进行读操作已经完成,正在申请对数据D进行写操作,但是另一个用户A2正在进行写操作(此时数据D已经上锁,A1只有等A2释放D后才能操作D。由于操作没有完成,A1也不能释放数据C);用户A2对数据C进行写操作已经完成,正在申请对数据D信息读操作,但是有一个用户A1正在进行读操作(此时数据C已经上锁,A2只有等A1释放C后才能操作C。由于操作没有完成,A2亦无法释放D);就这样A1在等A2释放D,A2亦在等A1释放C,两者互不相让,结果两者一直等下去。
//注释3:为什么要上锁? 因为如果允许两个用户同时操作同一数据,那最终的数据会是怎么样的呢?结果是你我修改内容的随机混合,显然这是双方都不希望的结果。
2)Memcache玩的平衡:用内存读写换磁盘IO读写,即用内存把数据快速读取到缓存,用户访问数据库数据前,先在缓存中找,如果有就不在去数据库查找,如果没有在去数据库中找。这样大大减少了数据库的访问量,这种情况下磁盘IO读写速度可以应符。
3)注意缓存断电会消失,且第一次还是需要数据库操作磁盘读取数据到放入内存中。
4)Memcache在数据库集群中中扮演的角色:
举个例子:客户端A在访问服务器集群中的某一台服务器C1时,C1会生成一个唯一标识符Guid写入A客户端Cookie中(有效期一般为退出销毁),同时存一份到服务器集群共享缓存memcache中(设置有效期)。当A再次访问服务器集群中某一台服务器C2时,由于Cookie中的信息会随同一起发送到服务器C2,服务器C2便获取到了Cookie中的Guid,通过与共享缓存memcache中的guid对比,如果guid相同则不需要去数据库校验密码即可访问,如果规定不同则需要访问数据库重新校验密码才能访问服务器集群中的服务器C2。
这样就大大减少了对数据访问的次数,这种情况下磁盘IO读写速度可以应符。
三、memcache怎么用?
第一步:直接使用Memcache
第二步:Memcached控制台练习
class Program
{
static void Main(string[] args)
{
//分布式Memcached服务IP和端口
string[] servers = { "192.168.15.119:11211" };
//初始化Socked连接池
SockIOPool pool = SockIOPool.GetInstance();
//设置服务器列表
pool.SetServers(servers);
//初始化时创建连接数
pool.InitConnections = 3;
//最小连接数
pool.MinConnections = 3;
//最大连接数
pool.MaxConnections = 5;
//socket连接超时时间(单位ms)。如果设置为0表示一直保持连接状态。
pool.SocketConnectTimeout = 1000;
//Scoket通讯的超时时间,下面设置为3秒。
pool.SocketTimeout = 3000;
//维护线程的间隔激活时间,下面设置为3秒,设置为0表示表示不启用维护线程。
pool.MaintenanceSleep = 30;
//设置SocketIO池的故障标志
pool.Failover = true;
//是否对TCP/IP通讯使用nalgle算法
pool.Nagle = false;
//进行初始化操作
pool.Initialize();
//新建一个客户端实例
MemcachedClient cache = new Memcached.ClientLibrary.MemcachedClient();
//是否启用压缩数据:如果启用了压缩数据,长于门槛的数据将被存储在压缩的形式
cache.EnableCompression = false;
//向缓存中添加一键为b1,值为2234 的键值对
cache.Add("b1", "2234");
//读出一个key为b1的缓存值
var a = cache.Get("b1");
Console.WriteLine(a);
//修改键为b1的键值对,如果没有就创建
cache.Set("b1", "value的值");
var s = cache.Get("b1");
Console.WriteLine(s);
//删除键为b1的键值对
cache.Delete("b1");
Console.WriteLine("s={0}",s); //键值对被删除了但是,删除前已经赋值给了s。
Console.ReadKey();
}
}
第三步:Memcache运用于项目
四、遇到的问题
1安装memcached报错
错误提示:
failed to install service or service already installed
解决:
1、找到cmd.exe文件(c:\windows\system32\cmd.exe)
2、右键cmd.exe以管理员方式运行
2使用任务管理器开启服务时报错:权限问题,使用管理员权限。
右击计算机-管理-服务-开启/关闭服务
3怎么开启telnet?
控制面板-程序和功能-开启或关闭window功能(左上角)-选中telnet客户端
在使用memcached写错了用空格改正还是会报错,所以写错了就重新换行重写。