缓存应用--Memcached分布式缓存简介
一. 什么是Memcached
Memcached 是一个高性能的分布式内存 对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象 来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。
相信很多人都用过缓存,在 .net 中也有内置的缓存机制,还有很多第三方工具如apache,nginx等可以做静态资源的缓存,同时我们也可 以制定自己的缓存机制,缓存数据库查询的数据以减少对数据库的频繁操作。但是很多时候我们总是感觉这些缓存总不尽人意, Memcached可以解决你不少的烦恼问题。 最少在我的学习中解决了我不少问题,所以决定记录下来分享。
Memcached基于一 个存储键/值对的hashmap。其守护进程是用C写的,但是客户端可以用任何语言来编写(本文使用C#作为例子),并通过memcached协议与守护进程通信。可 能这些东西都太高深了,我们暂不做研究。
二. 分布式缓存
其实 Memcached作为一个分布式缓存数据服务,但是每个服务之间根本没有进行相互通信,这里可能与 我理解的分布式有点区别,可能是我才疏学浅,也可能是每个人思考问题的角度不同。Memcached 客户端就是通过一种分布式算法将数据保存到不同的Memcached服务器上,将数据进行缓存。分布 式缓存,可以而知memcached可以进行大数据量的缓存。这点可以弥补我们之前很多人都遇到的将 数据缓存到应用服务器上,而且只能缓存少量数据,否则对应用服务器的影响非常大。
Memcached应用机制图:
这个图是有点简陋了,但是问题还是能够描述的清楚的,缓存机制的基本原理就是先查询数据保存到memcached中,地址在此请求就直接从Memcached缓存中取数据,这样就可以减少对服务器请求压力。
三. Memcached 特征
(1) 协议简单: 不使用复杂的xml格式,而是使用文本格式
(2) 基于libevent的事件处理机制 (不懂)
(3) 内置内存存储方式: 数据存在在内存中,所以重启机器会导致数据丢失
(4)Memcached相互不通信的分布式: Memcached 服务器之间不会进行通信,数据都是通过客户端的分布式算法存储到各个服务器中
四. Memcached的安装
首先这里是在windows系统上做测试,Memcached在linux等非windows平台上性能会更高。
下载Memcached 服务端: http://memcached.org/ (官网寻找适用的版本)
1 解压缩文件到D:\Program Files\Memcached
2 命令行输入 D:\Program Files\Memcached\memcached.exe -d install
3 命令行输入 D:\Program Files\Memcached\memcached\memcached.exe -d start,该命令启动 Memcached ,默认监听端口为 11211
当然我们可以在windows 服务中查看到此此服务:
五 .NET 平台下使用Memcached
因为个人首先接触的客户端是memcacheddotnet ,所以习惯了适用这个核心库作为客户端。下载的工作都非常简单,因为客户端都帮我们实现了分布式程序算法,我们关心的只要怎样去存在获取这些数据。下面简单介绍一下:
1 static void Main(string[] args) 2 { 3 SockIOPool pool = SockIOPool.GetInstance(); 4 string[] servers = { "127.0.0.1:11211" }; 5 pool.SetServers(servers); 6 pool.MinConnections = 3; 7 pool.MaxConnections = 5; 8 pool.InitConnections = 3; 9 pool.SocketConnectTimeout = 5000; 10 pool.Initialize(); 11 12 MemcachedClient client = new MemcachedClient(); 13 client.EnableCompression = false; 14 Console.WriteLine("-----------------------Memcached Set 设置值--------------------------"); 15 client.Set("key1","value1"); 16 Console.WriteLine(client.Get("key1")); 17 Console.WriteLine("-----------------------Memcached Add 设置值--------------------------"); 18 client.Add("key2","value2"); 19 Console.WriteLine(client.Get("key2")); 20 client.Set("key2","value1 value2"); 21 Console.WriteLine(client.Get("key2")); 22 Console.WriteLine("-----------------------Memcached Replace 设置值--------------------------"); 23 client.Replace("key2", "value3"); 24 Console.WriteLine(client.Get("key2")); 25 26 Console.WriteLine("-----------------------Memcached 键值是否存在--------------------------"); 27 if (client.KeyExists("key2")) 28 { 29 Console.WriteLine("键key2 存在"); 30 } 31 if (client.KeyExists("hechen")==false) 32 { 33 Console.WriteLine("键hechen 不存在"); 34 } 35 36 Console.WriteLine("-----------------------Memcached 删除数据--------------------------"); 37 client.Add("key4","value4"); 38 Console.WriteLine("key4==>" + client.Get("key4")); 39 client.Delete("key4"); 40 if (!client.KeyExists("key4")) 41 { 42 Console.WriteLine("key4 已将删除"); 43 } 44 45 Console.WriteLine("-----------------------Memcached 数据过期--------------------------"); 46 client.Add("key5","value5",DateTime.Now.AddMilliseconds(5000)); 47 Console.WriteLine(client.Get("key5")); 48 System.Threading.Thread.Sleep(6000); 49 Console.WriteLine("过期: "+ client.Get("key5")); 50 }
上面的例子虽然简单,包括一些基本的用法,在一般使用Memcached缓存数据的时候都用得到。
Memcached 初始化数据 SockIOPool pool = SockIOPool.GetInstance(); string[] servers = { "127.0.0.1:11211" }; pool.SetServers(servers); pool.MinConnections = 3; pool.MaxConnections = 5; pool.InitConnections = 3; pool.SocketConnectTimeout = 5000; pool.Initialize();
SockIOPool 用于初始化分布式缓存池的对象,上面设置了多种属性,我相信这些属性的意思大家都懂。这里要注意的是Initialize () ,只有调用这个方式之后,才能初始化数据。才能使用连接缓存池。
Memcached 设置缓存值的三种方式 MemcachedClient client = new MemcachedClient(); client.EnableCompression = false; Console.WriteLine("-----------------------Memcached Set 设置值--------------------------"); client.Set("key1","value1"); Console.WriteLine(client.Get("key1")); Console.WriteLine("-----------------------Memcached Add 设置值--------------------------"); client.Add("key2","value2"); Console.WriteLine(client.Get("key2")); client.Set("key2","value1 value2"); Console.WriteLine(client.Get("key2")); Console.WriteLine("-----------------------Memcached Replace 设置值--------------------------"); client.Replace("key2", "value3"); Console.WriteLine(client.Get("key2"));
有心的可以测试一下这三个方法: Set () 如果缓存中存在相同的键值这替换原有的,Add() 只是添加数据,如果存在相同键的不再添加。 Replace() 则用于替换已有的相同的键值。
1 Console.WriteLine("-----------------------Memcached 数据过期--------------------------"); 2 client.Add("key5","value5",DateTime.Now.AddMilliseconds(5000)); 3 Console.WriteLine(client.Get("key5")); 4 System.Threading.Thread.Sleep(6000); 5 Console.WriteLine("过期: "+ client.Get("key5"));
很多时候我们并不希望数据永久缓存,一般都会有一个过期时间。上面的添加缓存数据就设置了缓存时间,可以达到过期缓存的效果。
案例下载地址 点击下载
此篇文章到此结束,内容比较简单,而且很多都是别人写过的东西。不过为了个人的学习还是积累起来,对于缓存部分后续文章继续更新。
转自:http://www.cnblogs.com/qingyuan/archive/2011/01/17/1937855.html
缓存应用--Memcached分布式缓存简介的更多相关文章
- Memcached 分布式缓存实现原理简介
摘要 在高并发环境下,大量的读.写请求涌向数据库,此时磁盘IO将成为瓶颈,从而导致过高的响应延迟,因此缓存应运而生.无论是单机缓存还是分布式缓存都有其适应场景和优缺点,当今存在的缓存产品也是数不胜数, ...
- Memcached分布式缓存初体验
1 Memcached简介/下载/安装 Memcached是一个高性能的不是内存对象缓存系统,用于动态Web应用以减轻数据库负载.Memcached基于一个存储键/值对的HashMap.其客户端可以使 ...
- Memcached 分布式缓存实现原理
摘要 在高并发环境下,大量的读.写请求涌向数据库,此时磁盘IO将成为瓶颈,从而导致过高的响应延迟,因此缓存应运而生.无论是单机缓存还是分布式缓存都有其适应场景和优缺点,当今存在的缓存产品也是数不胜数, ...
- memcached分布式缓存
1.memcached分布式简介 memcached虽然称为“分布式”缓存服务器,但服务器端并没有“分布式”功能.Memcache集群主机不能够相互通信传输数据,它的“分布式”是基于客户端的程序逻辑算 ...
- Discuz!NT中集成Memcached分布式缓存
大约在两年前我写过一篇关于Discuz!NT缓存架构的文章,在那篇文章的结尾介绍了在IIS中如果开启多个应用程序池会造成多个缓存实例之间数据同步的问题.虽然给出了一个解决方案,但无形中却把压力转移到了 ...
- Memcached 分布式缓存系统部署与调试
Memcache 分布式缓存系统部署与调试 工作机制:通过在内存中开辟一块区域来维持一个大的hash表来加快页面访问速度,和数据库是独立的;目前主要用来缓存数据库的数据;存放在内存的数据通过LRU算法 ...
- memcached分布式缓存系统
在数据驱动的Web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载.缓存是解决这个问题的好办法.但是ASP.NET中的虽然已经可以实现对页面局部进行缓存,但还是不够灵活.此时 ...
- 【开源项目系列】如何基于 Spring Cache 实现多级缓存(同时整合本地缓存 Ehcache 和分布式缓存 Redis)
一.缓存 当系统的并发量上来了,如果我们频繁地去访问数据库,那么会使数据库的压力不断增大,在高峰时甚至可以出现数据库崩溃的现象.所以一般我们会使用缓存来解决这个数据库并发访问问题,用户访问进来,会先从 ...
- [Memcached]分布式缓存系统Memcached在Asp.net下的应用
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached ...
随机推荐
- SQL Server编程(04)基本语法
一.定义变量 --简单赋值 declare @a int set @a=5 print @a --使用select语句赋值 declare @user1 nvarchar(50) select @ ...
- 不加班的实践(1)——这真的该用try-catch吗?
前言 我有个技能,就是把“我”说的听起来特别像“老子”. 以前是小喽啰的时候,会跟领导说“我!不加班.”,听起来就像“老子不加班!”一样.到最后发现,我确实没有把计划内的工作拖到需要加班才能完成,这个 ...
- 神奇的fastcgi_finish_request
当PHP运行在FastCGI模式时,PHP FPM提供了一个名为fastcgi_finish_request的方法.按照文档上的说法,此方法可以提高请求的处理速度,如果有些处理可以在页面生成完后再进行 ...
- 【转】MYISAM表批量压缩
关于对MYISAM表的压缩,可以使用myisampack和myisamchk完成(myisampack完之后必须进行myisamchk才能使用压缩后的表,而且是只读的), 其详细地用法可以参考官方文档 ...
- Vmware下Ubuntu无法上网的问题
本来这个挺简单的个问题,但是由于很久没有使用虚拟机并且期间实体机网络环境发生了一些变化,导致了一些麻烦. 一般用NAT就行了,就是Vmware右下角那个图标(左起第4个)设置就行. 我这么设置了还是不 ...
- openstack的控制节点部署
openstack的控制节点部署 主要是使用了本地安装的那个镜像. 会出现几个问题, 1.重启服务无法启动. 2.环境变量无法正确配置可以自己配置
- ios 总结
1 ocoa Touch Layer{ App Extensions https://developer.apple.com/library/ios/documentation/General/Con ...
- ED/EP系列4《圈存指令》
1. 圈存交易 通过圈存交易,持卡人可将其在银行相应账户上的资金划入电子存折或电子钱包中. 特点: 1)--必须在金融终端上联机进行; 2)--必须提交个人识别码(PIN) 步骤: 1) --终端: ...
- Mybatis 实现手机管理系统的持久化数据访问层
最近公司需要对客户手机进行管理并提供二维码存储手机串号的加密字符.供其他接入系统通过扫面二维码解析使用.系统提供手机信息管理,客户管理,用户管理功能. 1.使用到的POJO类 1.1 User pac ...
- struts2框架基本操作总结
struts技术说明 一:第一配置开发环境 1.struts.xml文件 <?xml version="1.0" encoding="UTF-8" ?&g ...