分布式缓存Memcached

1.Memcached简介

Memcached是一个开源、高性能,将数据分布于内存中并使用key-value存储结构的缓存系统。它通过在内存中缓存数据来减少向数据库的频繁访问连接的次数,可以提高动态、数据库驱动之类网站的运行速度。

Memcached在使用是比较简单的,在操作上基本就类似于操作字典结构的对象一样。分布式缓存Memcached的分布式怎么理解?简单来说就是Memcached通过建立一个系统服务和应用系统完全独立开,两则不是相同的进程。 


 

2.为什么需要用到Memcached?

  在搭建服务器架构时如果使用到了集群,那么代理服务器会根据集群中服务器负载均衡分发到一个负载较小的服务器处理请求。就拿“登录”场景来说,第一次用户进行登录成功后在A服务器上将用户信息存储到Session,当用户第二次请求去加载某个页面时,由于负载均衡的调度将请求交给了另一台服务器C来处理,此时的C服务器是并不能访问到A服务器的Session,那么一般的程序逻辑会再一次让你返回登录页面重新进行登录(引发的问题

对应上述文字描述的参考图:

  根据上述引发的问题,实际上我们需要达到一个效果是:将我们登录存储的用户信息放置到一个共享区域,也就是集群中的每个服务器都能访问的区域,对于建立这个共享区域,其实就可以通过使用分布式缓存Memcached来解决。当然还包括另外一个原因,如果统一将信息放到Session存储,对于单机架构的模式的服务器是很消耗内存的。当然也有特殊的手段实现跨服务器的Seesion访问,但是也会造成很大的性能损耗,是并不推崇的,所以会通过分布式缓存Memcached将应用和缓存隔离开作为单独的服务进程。

  通过使用分布式缓存Memcached会将集群中服务器的内存统一使用起来形成一个独立的数据共享区域,加入Memcached后架构参考图如下:

  分布式缓存Memcached需要结合服务器架构的实际情况来使用,如果业务量没有很大并且本身设计的是单机服务器架构,那么其实没有并要使用分布式缓存Memcached,使用Session或者ASP.NET类库中的Cache来缓存数据亦可。

  分布式缓存还有一种应用场景:例如像CSDN这样的大型站点,其中包含下载、论坛、资讯各类子站,这个时候只要在某个子站登录成功,在访问旗下其他的子站时因为运用了分布式缓存技术后,子站之间可以共享用户信息则无需再近进行登录。


 3.Memcached流程原理简介

 


 4.Memcached的优势和不足

优势:

数据在处理上速度快,操作简单,开源易扩展。

 

不足:

1.由于数据是存储在内存中,并且具有临时性不能持久化保存。如果服务器宕机或者发生重启等情况,就会发生数据丢失。同类型的数据库Redis可以弥补这种现象。

2.在获取数据上只能局限于通过键读获取数据,不支持多元化的查询方式。


 5.Memcached使用说明

 5.1.Windows中安装和配置

1.将memcached安装目录解压到指定目录(不能包含在中文名称目录下),memcached目录中的文件结构参考如下:

2.以管理员身份打开CMD命令行窗口在打开memcached安装目录,输入:memcached.exe -d install(安装服务),然后在输入memcached.exe -d start(启动服务)。

参考图:

 3.安装启动后可以在系统中查看到对应的服务状态:

 

 

5.2.版本及配置信息

可以通过在telnet命令行中输入“stats”查看memcached版本及配置信息:

 

 

5.3.内存分配

Memcached默认内存存储数据的最大容量是64mb,如需修改则在命令行中输入:

memcached.exe -m 512 -d start

  

5.4.端口配置

Memcached默认的端口是11211,如需修改则在命令行中输入:

memcached.exe -p 10001 -d start

  

5.5.CMD中操作数据的命令格式

如果需要在CMD中对memcached进行数据的操作则需要遵守下面的命令格式:

command  <key>  <flags>  <expiration time>  <bytes>
<value>

以上格式含义解释:

Command:具体操作的命令,其中包括:set、add、replace、get、delete;

Key:自定义的查找标识;

Flags:除了存储键值数据,此处用于存储额外的数据;

expiration time:数据的有效时间(以秒为单位),0表示永远;

Bytes:表示存储的value占用的字节数;

Value:存储的值(在输入命令格式中必须单独位于第二行);

 

5.6.操作实例Set(新增或修改)方法:

1.以管理员身份打开CMD命令行,并打开memcached的安装文件目录。然后在命令行输入:telnet IP 端口号:

 

 进行回车后弹出黑屏窗口说明连接成功:

 2.写入键值数据

 在空白处进行回车换行输入操作命令:

set name 0 120 5
Tom

输入完成后敲击回车提交,成功后如下:

 

3.以键取值


 6.Memcached管理工具TreeNMS

  TreeNMS是由treesoft开发的数据可视化客户端工具,可以通过界面方式对memcached数据库进行管理、维护。该工具不光适用于Memcached还包括其他的NoSql型数据库如Redis。

  下载地址:http://www.treesoft.cn/dms.html#exam

  在这里就不提供详细的说明了,通过下载后文件夹中有一份部署说明,根据里面的步骤操作即可,系统参考图:

 

 PS:当通过工具查阅数据的时候可能会看到乱码,实际上糟程序读取值的时候不会存在乱码,请忽略此情况。


7..Net中使用Memcached

  在.Net中使用Memcached进行开发主要依靠的是第三方提供的SDK,使用时将SDK集成到项目中完成一些列的编码操作。常见SDK有:Enyim.Caching、MemcachedClientLibrary、ServiceStack。下面主要针对最常用的MemcachedClientLibrary来讲解代码的使用。

使用前必须引用的程序集:

 

链接:https://pan.baidu.com/s/1Rbe3QhuCefRtg12WZ9GcMw
提取码:dx6y

 DEMO代码如下:

 1  class Program
 2     {
 3 
 4 
 5 
 6         static void Main(string[] args)
 7         {
 8  
 9  
10             #region 初始化配置
11             /*
12              *Memcached.ClientLibrary使用初始化,这里只介绍关键的代码步骤
13              * 如要自定义配置则自行查阅相关文档进行扩展
14              */
15 
16 
17             /*Step1
18              *获取集群中所有服务器IP,Memcached存储数据时会根据算法在集群中选择一台进行存储操作,
19              *集群中的服务器部署了Memcached服务,则集群中多台服务器都会各自提供内存使用,
20              *从而达到跨服务器访问内存数据能力
21            */
22             string[] ips = new string[] {  
23                  "192.168.31.12:11211",
24                 "192.168.31.151:11211"           
25             };
26 
27             /*Step2
28              *创建并初始化通信池,Memcached是基于Socket进行通信的
29              */
30             string sockIOPoolName = "firstPool";
31             SockIOPool pool = SockIOPool.GetInstance(sockIOPoolName);
32             pool.SetServers(ips);
33             pool.Initialize();
34              
35 
36             /*Step3
37              *创建并初始化客户端操作对象
38              */
39             MemcachedClient MClient = new MemcachedClient();
40             MClient.PoolName = sockIOPoolName;
41         
42             #endregion
43 
44 
45             #region 数据操作
46             //数据操作
47 
48             /*
49              *新增或修改使用Set方法,因为方法逻辑是:不存在则插入,存在覆盖更新
50              * 传参:1:key、2:value、3:到期时间
51              */
52 
53             //存储单值
54             MClient.Set("name", "Jay", DateTime.Now.AddDays(1));
55 
56             //存储对象
57             MClient.Set("Car", new Car { ID = 1, Name = "RX8" }, DateTime.Now.AddDays(1));
58 
59             //读取
60             var uidData = MClient.Get("Car");
61 
62             if (false)
63             {
64                 //删除数据
65                 MClient.Delete("name");
66                 //清空数据库
67                 MClient.FlushAll();
68             } 
69             #endregion
70 
71             //基本的操作介绍完毕
72             Console.WriteLine("ok");
73  
74         }  // END Main()
75 
76          
77 
78 
79     }

 

posted @ 2020-09-01 16:48  姜承轩  阅读(780)  评论(1编辑  收藏  举报