一、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写错了用空格改正还是会报错,所以写错了就重新换行重写。

Memcache学习整理的更多相关文章

  1. js数组学习整理

    原文地址:js数组学习整理 常用的js数组操作方法及原理 1.声明数组的方式 var colors = new Array();//空的数组 var colors = new Array(3); // ...

  2. TweenMax学习整理--特有属性

    TweenMax学习整理--特有属性   构造函数:TweenMax(target:Object, duration:Number, vars:Object) target:Object -- 需要缓 ...

  3. HttpClient学习整理

    HttpClient简介HttpClient 功能介绍    1. 读取网页(HTTP/HTTPS)内容    2.使用POST方式提交数据(httpClient3)    3. 处理页面重定向    ...

  4. 《Memcache学习总结》[PDF]发布

    <Memcache学习总结>[PDF]发布 百度网盘共享: http://pan.baidu.com/s/1mgvayQO  版本号: V1.2 最后跟新: 2015-04-01 讨论组: ...

  5. !!对python列表学习整理列表及数组详细介绍

    1.Python的数组分三种类型:(详细见 http://blog.sina.com.cn/s/blog_6b783cbd0100q2ba.html) (1) list 普通的链表,初始化后可以通过特 ...

  6. Java设计模式(学习整理)---命令模式

    设计模式之Command(学习整理) 1.Command定义 不少Command模式的代码都是针对图形界面的,它实际就是菜单命令,我们在一个下拉菜单选择一个命令时,然后会执行一些动作. 将这些命令封装 ...

  7. Wix学习整理(5)——安装时填写注册表

    原文:Wix学习整理(5)--安装时填写注册表 一 Microsoft操作系统的注册表 什么是注册表? 注册表是Mircrosoft Windows中的一个重要的数据库,用于存储系统和应用程序的设置信 ...

  8. Wix学习整理(6)——安装快捷方式

    原文:Wix学习整理(6)--安装快捷方式 一 为HelloWorld案例添加安装快捷方式 通常我们安装一个应用软件的时候,都喜欢在桌面或开始菜单中添加快捷方式以便我们快速访问.现在我们就在上篇添加注 ...

  9. Wix学习整理(7)——在开始菜单中为HelloWorld添加卸载快捷方式

    原文:Wix学习整理(7)--在开始菜单中为HelloWorld添加卸载快捷方式 通过前面的几篇随笔,我们已经给我们的HelloWorld提供了填写注册表信息,以及开始菜单快捷方式和桌面快捷方式.这些 ...

随机推荐

  1. hibernate笔记--实体类映射文件"*.hbm.xml"详解

    实体类就是指普通的POJO,Hibernate并不知道那个实体类对应数据库的哪一张表,所以还需要配置一下,常用的方式就是*.hbm.xml文件[配置与@注解配置,这里介绍前者的详细属性: <?x ...

  2. 5.Struts.xml标签中的一些小技巧

    1.为Action属性注入值如给actions包下的test.java类中变量username赋值为"xingyun"在struts.xml中添加下面这段代码: <strut ...

  3. 关于WEB Service&WCF&WebApi实现身份验证之WebApi篇

    之前先后总结并发表了关于WEB Service.WCF身份验证相关文章,如下: 关于WEB Service&WCF&WebApi实现身份验证之WEB Service篇. 关于WEB S ...

  4. 表单多文件上传样式美化 && 支持选中文件后删除相关项

    开发中会经常涉及到文件上传的需求,根据业务不同的需求,有不同的文件上传情况. 有简单的单文件上传,有多文件上传,因浏览器原生的文件上传样式及功能的支持度不算太高,很多时候我们会对样式进行美化,对功能进 ...

  5. 7.1数据注解属性--Key【Code-First系列】

    Key特性可以被用到类的属性中,Code-First默认约定,创建一个主键,是以属性的名字“Id”,或者是类名+Id来的. Key特性重写了这个默认的约定,你可以应用Key特性到一个类的属性上面,不管 ...

  6. C# 关键字extern用法

    修饰符用于声明在外部实现的方法.extern 修饰符的常见用法是在使用 Interop 服务调入非 托管代码时与 DllImport 属性一起使用:在这种情况下,该方法还必须声明为 static,如下 ...

  7. SignalR入门之Hub

    在持久性连接的基础上,SignalR提供了一个更高层次的抽象层:Hub,基于javascript的灵活性和C#的动态特性,Hub是一个至关重要的开发模式,它消弭了客户端和服务端这两个独立的物理环境之间 ...

  8. C++11之lambda表达式

    lambda表达式源于函数式编程的概念,它可以就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或者函数对象.lambda表达式的类型在C++11中被称为"闭包类型",也可以 ...

  9. codeforces 632+ E. Thief in a Shop

    E. Thief in a Shop time limit per test 5 seconds memory limit per test 512 megabytes input standard ...

  10. Session中load/get方法的详细区别

    Session.load/get方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象.其区别在于: 如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个O ...