缓存应用--Memcached分布式缓存简介

简介:  一.   什么是Memcached Memcached 是一个高性能的分布式内存 对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象 来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。

 一.   什么是Memcached

Memcached 是一个高性能的分布式内存 对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象 来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。

相信很多人都用过缓存,在 .net 中也有内置的缓存机制,还有很多第三方工具如apachenginx等可以做静态资源的缓存,同时我们也可 以制定自己的缓存机制,缓存数据库查询的数据以减少对数据库的频繁操作。但是很多时候我们总是感觉这些缓存总不尽人意, Memcached可以解决你不少的烦恼问题。 最少在我的学习中解决了我不少问题,所以决定记录下来分享。

Memcached基于一 个存储键/值对的hashmap。其守护进程是用C写的,但是客户端可以用任何语言来编写(本文使用C#作为例子),并通过memcached协议与守护进程通信。可           能这些东西都太高深了,我们暂不做研究。  

 

二.   分布式缓存 

其实 Memcached作为一个分布式缓存数据服务,但是每个服务之间根本没有进行相互通信,这里可能与 我理解的分布式有点区别,可能是我才疏学浅,也可能是每个人思考问题的角度不同。Memcached 客户端就是通过一种分布式算法将数据保存到不同的Memcached服务器上,将数据进行缓存。分布 式缓存,可以而知memcached可以进行大数据量的缓存。这点可以弥补我们之前很多人都遇到的将 数据缓存到应用服务器上,而且只能缓存少量数据,否则对应用服务器的影响非常大。
Memcached应用机制图

 

这个图是有点简陋了,但是问题还是能够描述的清楚的,缓存机制的基本原理就是先查询数据保存到memcached中,地址在此请求就直接从Memcached缓存中取数据,这样就可以减少对服务器请求压力。

 

 

 三.   Memcached 特征

(1)     协议简单: 不使用复杂的xml格式,而是使用文本格式 

(2)     基于libevent的事件处理机制 (不懂

(3)     内置内存存储方式: 数据存在在内存中,所以重启机器会导致数据丢失 

   (4)Memcached相互不通信的分布式: Memcached 服务器之间不会进行通信,数据都是通过客户端的分布式算法存储到各个服务器中 

 

四.   Memcached的安装 

首先这里是在windows系统上做测试,Memcachedlinux等非windows平台上性能会更高。

下载Memcached 服务端: http://memcached.org/ (官网寻找适用的版本)

1 解压缩文件到D:\Program Files\Memcached
命令行输入 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缓存数据的时候都用得到。

 

img_405b18b4b6584ae338e0f6ecaf736533.gif Memcached 初始化数据
1  SockIOPool pool  =  SockIOPool.GetInstance();
2  string [] servers  =  {  " 127.0.0.1:11211 "  };
3  pool.SetServers(servers);
4  pool.MinConnections  =   3 ;
5  pool.MaxConnections  =   5 ;
6  pool.InitConnections  =   3 ;
7  pool.SocketConnectTimeout  =   5000 ;
8  pool.Initialize();

 


SockIOPool 用于初始化分布式缓存池的对象,上面设置了多种属性,我相信这些属性的意思大家都懂。这里要注意的是Initialize () ,只有调用这个方式之后,才能初始化数据。才能使用连接缓存池。

 

img_405b18b4b6584ae338e0f6ecaf736533.gif Memcached 设置缓存值的三种方式
 1  MemcachedClient client  =   new  MemcachedClient();
 2  client.EnableCompression  =   false ;
 3  Console.WriteLine( " -----------------------Memcached Set 设置值-------------------------- " );
 4  client.Set( " key1 " , " value1 " );
 5  Console.WriteLine(client.Get( " key1 " ));
 6  Console.WriteLine( " -----------------------Memcached Add 设置值-------------------------- " );
 7  client.Add( " key2 " , " value2 " );
 8  Console.WriteLine(client.Get( " key2 " ));
 9  client.Set( " key2 " , " value1 value2 " );
10  Console.WriteLine(client.Get( " key2 " ));
11  Console.WriteLine( " -----------------------Memcached Replace 设置值-------------------------- " );
12  client.Replace( " key2 " " value3 " );
13  Console.WriteLine(client.Get( " key2 " ));

 

有心的可以测试一下这三个方法: Set () 如果缓存中存在相同的键值这替换原有的,Add() 只是添加数据,如果存在相同键的不再添加。 Replace() 则用于替换已有的相同的键值。

 

img_405b18b4b6584ae338e0f6ecaf736533.gif Memcached 缓存数据过期
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 " ));

 

很多时候我们并不希望数据永久缓存,一般都会有一个过期时间。上面的添加缓存数据就设置了缓存时间,可以达到过期缓存的效果。

 

案例下载地址 点击下载 

 

此篇文章到此结束,内容比较简单,而且很多都是别人写过的东西。不过为了个人的学习还是积累起来,对于缓存部分后续文章继续更新。

Memcached 分布式缓存也不是如此简单,这里记录希望对自己和各位都有一定的帮助。有意见多多拍砖头。。。个人不介意的 

 

相关文章
|
2月前
|
安全 大数据 Go
Go语言在分布式系统中的应用
【2月更文挑战第20天】Go语言,以其独特的语言特性和出色的性能,逐渐成为分布式系统开发领域的热门选择。本文将深入探讨Go语言在分布式系统中的应用,分析其优势及实际应用案例,旨在为开发人员提供有价值的参考与启示。
|
21天前
|
缓存 NoSQL Redis
Python缓存技术(Memcached、Redis)面试题解析
【4月更文挑战第18天】本文探讨了Python面试中关于Memcached和Redis的常见问题,包括两者的基础概念、特性对比、客户端使用、缓存策略及应用场景。同时,文章指出了易错点,如数据不一致和缓存淘汰策略,并提供了实战代码示例,帮助读者掌握这两款内存键值存储系统的使用和优化技巧。通过理解其核心特性和避免常见错误,可以提升在面试中的表现。
27 2
|
2月前
|
缓存 NoSQL Java
分布式项目中锁的应用(本地锁-_redis【setnx】-_redisson-_springcache)-fen-bu-shi-xiang-mu-zhong-suo-de-ying-yong--ben-de-suo--redissetnx-springcache-redisson(一)
分布式项目中锁的应用(本地锁-_redis【setnx】-_redisson-_springcache)-fen-bu-shi-xiang-mu-zhong-suo-de-ying-yong--ben-de-suo--redissetnx-springcache-redisson
60 0
|
4天前
|
分布式计算 负载均衡 Java
构建高可用性Java应用:介绍分布式系统设计与开发
构建高可用性Java应用:介绍分布式系统设计与开发
8 0
|
12天前
|
存储 供应链 安全
区块链技术原理及应用:深入探索分布式账本技术
【4月更文挑战第30天】区块链,从加密货币的底层技术延伸至多元领域,以其分布式账本、去中心化、不可篡改性及加密技术重塑数据存储与交易。核心组件包括区块、链和节点,应用涵盖加密货币、供应链管理、金融服务等。尽管面临扩展性等挑战,未来潜力无限。
|
13天前
|
缓存 监控 PHP
【PHP开发专栏】Memcached在PHP中的缓存应用
【4月更文挑战第29天】Memcached是高性能分布式内存缓存系统,常用于加速动态Web应用,减轻数据库负担。在PHP中,通过官方扩展模块与Memcached服务器交互,涉及安装扩展、创建实例、设置/获取缓存、删除缓存及其它操作。使用Memcached可减少数据库负载、缓存查询结果、实现页面缓存,支持分布式缓存,并需注意避免缓存击穿、穿透和雪崩。监控和调优缓存策略能优化性能。了解和掌握Memcached有助于提升PHP应用的效率和扩展性。
|
28天前
|
存储 缓存 NoSQL
缓存、分布式缓存和持久化
这篇内容介绍了缓存的概念和Redis的作用,以口袋与公文包的比喻解释了缓存如何提高数据访问速度。Redis是一个内存中的高级缓存系统,能提升系统响应速度。接着讨论了为何需要分布式缓存,通过多个“篮子”(Redis节点)解决单点故障和性能瓶颈,保证高可用性和数据安全性。最后提到了Redis的两种持久化机制——RDB(定期数据快照)和AOF(记录写操作日志),分别用照片备份和实时同步来比喻,说明它们在数据丢失风险和恢复速度上的权衡。
|
1月前
|
消息中间件 存储 监控
解析RocketMQ:高性能分布式消息队列的原理与应用
RocketMQ是阿里开源的高性能分布式消息队列,具备低延迟、高吞吐和高可靠性,广泛应用于电商、金融等领域。其核心概念包括Topic、Producer、Consumer、Message和Name Server/Broker。RocketMQ支持异步通信、系统解耦、异步处理和流量削峰。关键特性有分布式架构、顺序消息、高可用性设计和消息事务。提供发布/订阅和点对点模型,以及消息过滤功能。通过集群模式、存储方式、发送和消费方式的选择进行性能优化。RocketMQ易于部署,可与Spring集成,并与Kafka等系统对比各有优势,拥有丰富的生态系统。
149 4
|
1月前
|
缓存 NoSQL 数据库
关于高并发下缓存失效的问题(本地锁 && 分布式锁 && Redission 详解)
关于高并发下缓存失效的问题(本地锁 && 分布式锁 && Redission 详解)
151 0
|
2月前
|
缓存 NoSQL Redis
分布式项目中锁的应用(本地锁-_redis【setnx】-_redisson-_springcache)-fen-bu-shi-xiang-mu-zhong-suo-de-ying-yong--ben-de-suo--redissetnx-springcache-redisson(二)
分布式项目中锁的应用(本地锁-_redis【setnx】-_redisson-_springcache)-fen-bu-shi-xiang-mu-zhong-suo-de-ying-yong--ben-de-suo--redissetnx-springcache-redisson
39 0