一、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. EF7 Code First Only-所引发的一些“臆想”

    At TechEd North America we were excited to announce our plans for EF7, and even demo some very early ...

  2. Flume官方文档翻译——Flume 1.7.0 User Guide (unreleased version)(二)

    Flume官方文档翻译--Flume 1.7.0 User Guide (unreleased version)(一) Logging raw data(记录原始数据) Logging the raw ...

  3. Oracle11g中数据的倒库和入库操作以及高版本数据导入低版本数据可能引发的问题

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 在10g之前,传统的导出和导入分别使用EXP工具和IMP工具 ...

  4. DotNet的JSON序列化与反序列化

    JSON(JavaScript Object Notation)JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式.在现在的通信中,较多的采用JSON数据格式,JSON有 ...

  5. 小白Linux入门 三

    环境变量 shell 变量: 内存空间 ,命名的内存空间 echo $SHELL 其中SHELL是变量 里面是/bin/bash sudo su  进入root printenv 命令 命令: 内部命 ...

  6. 分享在winform下实现左右布局多窗口界面-续篇

    之前的这篇文章<分享在winform下实现左右布局多窗口界面>已经实现了左右布局多窗口界面,今天本来是研究基于winform的插件编程,没想到顺便又找到了另一种实现方案,这种实现方案更简单 ...

  7. 让 select 的 option 标签支持事件监听(如复制操作)

    这标题,让option支持事件监听,应该不难的呀,有什么好讲的? 其实还是有的,默认在浏览器代码是无法直接对option标签进行操作的,不仅包括JS事件监听,还是CSS样式设置 查了一些资料,姑且认为 ...

  8. Hexo主题实现多级分类显示

    前言 最近在搞一个博客,是托管在github和gitcafe上的,利用Hexo生成的.之后,发现一个问题,显示的分类都是一级的.而我想要的是:能显示多级分类,层次分明`的那样. 问题 基本主题自带的分 ...

  9. 数据库排序sql,order by

    一开始我认为 SELECT * FROM dbo.T_User ORDER BY CreateTime ,IsDel DESC 的执行顺序是先按创建时间倒序排序,再按isdel倒序排序,所以我就没再S ...

  10. 不使用jQuery对Web API接口POST,PUT,DELETE数据

    前些天,Insus.NET有演示Web API接口的操作: <怎样操作WebAPI接口(显示数据)>http://www.cnblogs.com/insus/p/5670401.html ...