一、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. 输入URL到展现页面的全过程

    最近在看一本关于网络协议的书<图解HTTP> 当我们在浏览器的地址栏输入 http://www.pwstrick.com ,然后回车,回车这一瞬间到看到页面到底发生了什么呢? 1.  域名 ...

  2. 测试驱动开发与Python

    最近在看一本书<Test-Driven Development with Python>,里面非常详细的介绍了如何一步一步通过测试驱动开发(TDD)的方式开发Web项目.刚好这本书中使用了 ...

  3. 从零开始学 Java - 我放弃了 .NET ?

    这不是一篇引起战争的文章 毫无疑问,我之前是一名在微软温暖怀抱下干了近三年的 .NET 开发者,为什么要牛(sha)X一样去搞 Java 呢?因为我喜欢 iOS 阿!哈哈,开个玩笑.其实,开始学 Ja ...

  4. 史上最全的Ajax基础详解

    同步请求和异步请求 先解释一下同步和异步的概念: 同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式. 异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯 ...

  5. Xamarin.Android之给我们的应用加点过渡效果

    零.前言 试想一下,我们的应用正在请求一些数据,假设网络不是很好,要花比较长的时间等待,这个时候界面什么反应也没有, 一动不动,用户可能就会认为应用挂掉了,这么久都没反应的,说不定下一分钟用户就把它卸 ...

  6. [WCF编程]9.性能与限流

    一.性能概述 WCF服务的性能取决于很多因素.出了CPU.RAM和网络性能等常见的因素外,实例上下文模式.并发模式.数据契约的设计或使用的绑定等与WCF有关的因素都起着重要的作用. 实例上下文模式用来 ...

  7. C#怎样保证弹出窗体是唯一并居中显示

    Winform窗体中,假如我从Form1窗体要弹出Form2窗体,写法是这样的: Form2 f2 = new Form2(); f2.Show(); 1.如何使窗体打开时居中显示 //初始化默认窗体 ...

  8. 《c# 从入门经典》 (第6版) - c# 简介

    1,.NET Framework:是开发平台,包含两大部分: ①庞大的代码库(类库),可以在客户语言(C#,VB)中来使用这些代码 ②Common Language Runtime,负责管理应用程序的 ...

  9. nodejs定义函数的方法

    test_163:/home/exenode/part3/module_exports # more calc.js module.exports = { sum:function() { var r ...

  10. php设置手机访问浏览器版apache配置

    我们开发项目的时候经常会开发到浏览器版本的网页,这样我们就经常需要用手机连接局域网以方便测试,那么怎么配置服务器文件呢. 1.首先关闭电脑的windows防火墙   右击我的网络/windows防火墙 ...