缓存应用--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

时间: 2024-10-11 03:54:21

缓存应用--Memcached分布式缓存简介的相关文章

memcached分布式缓存

1.memcached分布式简介 memcached虽然称为“分布式”缓存服务器,但服务器端并没有“分布式”功能.Memcache集群主机不能够相互通信传输数据,它的“分布式”是基于客户端的程序逻辑算法进一步实现的. 请看下面简图: 根据上图我们简述分析分布式memcached的set与get的过程 set过程: 1.首先通过应用程序set(‘key’,’value’) 2.进入程序,使用key通过逻辑算法得出这个key需要存储的节点位置 3.根据节点位置连接相应的memcached服务器,并发

Memcached分布式缓存初体验

1 Memcached简介/下载/安装 Memcached是一个高性能的不是内存对象缓存系统,用于动态Web应用以减轻数据库负载.Memcached基于一个存储键/值对的HashMap.其客户端可以使用任何语言进行编写,并通过Memcached协议与进行通信 下载memcached-win64-1.4.4-14 的windows稳定版 cmd命令(win+R),切换到解压包的指定目录,并且输入命令:memcached.exe -d install(与之对应memcached.exe -d uni

Memcached 分布式缓存实现原理

摘要 在高并发环境下,大量的读.写请求涌向数据库,此时磁盘IO将成为瓶颈,从而导致过高的响应延迟,因此缓存应运而生.无论是单机缓存还是分布式缓存都有其适应场景和优缺点,当今存在的缓存产品也是数不胜数,最常见的有redis和memcached等,既然是分布式,那么他们是怎么实现分布式的呢?本文主要介绍分布式缓存服务mencached的分布式实现原理. 缓存本质 计算机体系缓存 什么是缓存,我们先看看计算机体系结构中的存储体系,根据冯·诺依曼计算机体系结构模型,计算机分为五大部分:运算器.控制器.存

memcached分布式缓存服务器学习总结

实验楼:https://www.shiyanlou.com/ 以下学习总结主要通过实验楼环境 memcached:高速运行的分布式缓存服务器 特点:(1)协议简单(2)基于libevent的事件处理(3)内置内存存储方式(4)不互相通信的分布式 适用场景:(1)网站包含了访问量很大的动态网页,因而数据库的负载将会很高,且大部分数据库请求都是读操作.(2)数据库服务器的负载比较低,CPU使用率较高;(3)小型需要共享的数据,如session等临时数据:(4)缓存一些很小但是被频繁访问的文件. 不适

Discuz!NT中集成Memcached分布式缓存

大约在两年前我写过一篇关于Discuz!NT缓存架构的文章,在那篇文章的结尾介绍了在IIS中如果开启多个应用程序池会造成多个缓存实例之间数据同步的问题.虽然给出了一个解决方案,但无形中却把压力转移到了磁盘I/O上(多个进程并发访问cache.config文件).其实从那时起我就开始关注有什么更好的方案,当然今天本文中所说的Memcached,以及Velocity等这类的分布式缓存方案之前都考虑过,但一直未能决定该使用那个.起码Velocity要在.net 4.0之后才会提供,虽然是原生态,但有些

Discuz!NT中集成Memcached分布式缓存(转)

大约在两年前我写过一篇关于Discuz!NT缓存架构的文章,在那篇文章的结尾介绍了在IIS中如果开启多个应用程序池会造成多个缓存实例之间数据同步的问题.虽然给出了一个解决方案,但无形中却把压力转移到了磁盘I/O上(多个进程并发访问cache.config文件).其实从那时起我就开始关注有什么更好的方案,当然今天本文中所说的Memcached,以及Velocity等这类的分布式缓存方案之前都考虑过,但一直未能决定该使用那个.起码Velocity要在.net 4.0之后才会提供,虽然是原生态,但有些

memcached分布式缓存服务器学习总结(二)memcached状态查询

linux memcached状态查询如何查看memcached服务器端版本: ./memcached -h memcached的运行状态可以方便的用 stats 命令显示. 首先用telnet 127.0.0.1 11211这样的命令连接上memcache,然后直接输入stats就可以得到当前memcache的状态. 这些状态的说明如下: pid memcache服务器的进程IDuptime 服务器已经运行的秒数time 服务器当前的unix时间戳version memcache版本point

第八章 企业项目开发--分布式缓存memcached

注意:本节代码基于<第七章 企业项目开发--本地缓存guava cache> 1.本地缓存的问题 本地缓存速度一开始高于分布式缓存,但是随着其缓存数量的增加,所占内存越来越大,系统运行内存越来越小,最后系统会被拖慢(这一点与第二点联系起来) 本地缓存存于本机,其缓存数量与大小受本机内存大小限制 本地缓存存于本机,其他机器的访问不到这样的缓存 解决方案:分布式缓存 Jboss cache:缓存还存于本机,但是会同步更新到其他机器(解决了第三个问题,解决不了第一和第二个问题),如果缓存机器数量很多

分布式缓存学习总结

一.分布式缓存简图 二.为什么使用Memcached分布式缓存呢? 三.Memcached基础原理 四.Memcache下载与安装 五.MencacheHelper.cs 示例使用 结合Session与项目配置缓存 六.Redis和Memcache的区别总结 一.分布式缓存简图 二.为什么使用Memcached分布式缓存呢? 首先先讲讲为何要缓存,在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载.缓存是解决这个问题的好办法.但是ASP.NET中的虽然已