关于分布式缓存Memcached详解

关于分布式缓存memcached详解

libevent事件机制

memcached基于libevent事件处理,用相关资料上描述,libevent是个程序库,它将linux的epoll、bsd类操作系统的kqueue等事件处理功能封装成统一的接口。即使对服务器的连接数增加,也能发挥o(1)的性能。

memcached服务器,缓存数据都是以key-value hash表的内存存储,最大key不超过250个字符,最大value项默认不超过1m,因此重启程序和服务器都会导致数据丢失,但它会消耗更低的cpu,因此可以用配置一般内存大点的服务器作为memcached服务器。在内容超过制定缓存大小后,会用lru,最近最少使用算法删除不使用的数据,默认超时时间为30天。memcached服务器之间互不通信,分布式算法在客户端,由客户端选择把数据存储到哪台memcached 服务器上,比如.net客户端,一般默认采用key的hashcode来模memcached服务器数量取余的值,作为选择当前key-value存储的服务器,当然系统足够庞大后,可以编写更加复杂和为具体项目做的算法。

现在根据.net客户端的接口,可以直接写个demo代码,代码如下:

 

 

1         static void main(string[] args)
 2
 3         {
 4
 5             //可以通过app.config配置
 6
 7             string[] serverlist = { "127.0.0.1:11211" };
 8
 9             //多个如下:
10
11             //string[] serverlist = { "127.0.0.1:11211,192.168.1.1:11211" };
12
13 
14
15             sockiopool pool = sockiopool.getinstance();
16
17             pool.setservers(serverlist);
18
19 
20
21             //pool.initconnections = 3;
22
23             //pool.minconnections = 3;
24
25             //pool.maxconnections = 5;
26
27 
28
29             //pool.socketconnecttimeout = 1000;
30
31             //pool.sockettimeout = 3000;
32
33 
34
35             //pool.maintenancesleep = 30;
36
37             //pool.failover = true;
38
39             //pool.nagle = false;
40
41 
42
43             pool.initialize();
44
45 
46
47             memcachedclient mc = new memcachedclient();
48
49             mc.enablecompression = false;
50
51 
52
53             //mc.flushall();
54
55 
56
57             string input = "test of string";
58
59             mc.set("foo", input);
60
61             string s = (string)mc.get("foo");
62
63 
64
65             mc.add("foo", "foo2");
66
67 
68
69             datas d = new datas();
70
71             d.a = 2;
72
73             d.b = "222222";
74
75 
76
77             //d.c = new byte[1024*1024*2];
78
79 
80
81             mc.set("classv", d);
82
83 
84
85             datas d2 = (datas)mc.get("classv");
86
87 
88
89             console.readkey();
90
91         }

 

 

不同版本的客户端,接口不一样,但思想基本一样,sockiopool设置服务器列表,代理里有部分注释,可以参考。memcachedclient创建一个对象,就可以用了,它提供get,set,add,delete等方法,这里需要注意,如果同一个key已经有值了,再用add将不能修改,该方法会返回false,表示没有插入服务器,因此建议用set,像服务器添加值由于最大有默认1m限制,因此超过1m,也会插入不成功,返回false

下面我以windows下memcached 服务器和.net的memcached客户端为例,介绍下它的安装和使用。

我用的windows下memcached1.2.6版本,在http://code.jellycan.com/memcached/可以下载,.net客户端采用的https教程://sourceforge.net/projects/memcacheddotnet/下的开源客户端,当然也可以参考memcached服务器的协议接口,编写自定义的客户端。

下载好memcached服务器端后,解压到比如d:memcached-1.2.6,在cmd命令控制台下,输入d:memcachedmemcached.exe -d install就安装好memcached的windows服务,然后输入d:memcachedmemcached.exe -d start则启动该服务,客户端就可以连接了,默认端口是11211,最大内存为64m,一般会修改,输入d:memcachedmemcached.exe -p 12345 -m 1024 -d start,其中-d install 安装为windows服务, -m 使用的最大内存(mb),默认64m, 还有-l 绑定的ip,-c 最大并发连接数,默认1024,但一般不会起作用,需要修改注册表,在注册表找到hkey_local_machinesystemcurrentcontrolsetservicesmemcached server, 找到imagepath项,把"d:memcachedmemcached.exe" -d runservice的后面加上-p 11111 -m 1024 -c 2048,重启后则把端口改为11111,最大内存为1024m。

时间: 2024-09-23 10:33:31

关于分布式缓存Memcached详解的相关文章

原创:.NET版分布式缓存Memcached测试实例

下面测试下分布式缓存Memcached软件,一直在学习关注大访问量网站的缓存是如何实现,之前看过Memcached的资料,忙于没有时间来真正测试一下,本文测试分布式缓存Memcached的环境如下:(两台电脑作为服务器) 第一台: CPU:Inter(R) Pentium(R) 4 CPU 2.8G 内存:1G 系统:windows 7 IIS: IIS 7 IP:172.10.1.97 环境:本地 安装:memcached 1.2.1 for Win32 第二台: CPU:Inter(R) P

JAVAEE Filter 过滤器设置是否缓存实例详解_java

在网页中,每次的客户端访问服务器,有部分不用重复请求,如有些图片,视频等就没有必要每次都请求,这样会让服务器增大工作量.为了防止这样,我们采用过滤器来设置客户端是都缓存. 页面的缓存与不缓存设置及html页面中meta的作用 HTTP1.1中启用Cache-Control 来控制页面的缓存与否,这里介绍几个常用的参数: no-cache,浏览器和缓存服务器都不应该缓存页面信息: public,浏览器和缓存服务器都可以缓存页面信息: no-store,请求和响应的信息都不应该被存储在对方的磁盘系统

CYQ.Data V5 分布式缓存MemCached应用开发介绍

前言 今天大伙还在热议关于.NET Core的东西,我只想说一句:在.NET 跨平台叫了这么多年间,其实人们期待的是一个知名的跨平台案例,而不是一堆能跨平台的消息. 好,回头说说框架:  在框架完成数据库读写分离的功能后,开始回想起2年前所构思的:关于框架集成分布式缓存MemCached的实现. 之前一直没动手,是因为思路比较飘,秉承着框架应该简单干净轻量引用无依赖和使用不复杂的思维: 看着MemCached的服务端协议,整天思考着自己用Socket写一个客户端. 后来可能是没激情,迟迟没动手.

ASP.NET MVC中使用jQuery时的浏览器缓存问题详解_实用技巧

介绍 尽管jQuery在浏览器ajax调用的时候对缓存提供了很好的支持,还是有必要了解一下如何高效地使用http协议. 首先要做的事情是在服务器端支持HTTP GET,定义不同的URL输出不同的数据(MVC里对应的就是action).如果要使用同一个地址获取不同的数据,那就不对了,一个HTTP POST也不行因为POST不能被缓存.许多开发人员使用POST主要有2个原因:明确了数据不能被缓存,或者是避免JSON攻击(JSON返回数组的时候可以被入侵). 缓存解释 jQuery全局对象里的ajax

C基础 redis缓存访问详解_C 语言

引言 先说redis安装, 这里采用的环境是. Linux version 4.4.0-22-generic (buildd@lgw01-41) (gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2) ) #40-Ubuntu SMP Thu May 12 22:03:46 UTC 2016 对于 ubuntu 安装 redis是非常简单的. 这里采用源码安装. 安装代码如下 wget http://download.redis.io/relea

YII Framework框架教程之缓存用法详解_php实例

本文实例讲述了YII Framework框架缓存用法.分享给大家供大家参考,具体如下: 缓存的产生原因众所周知.于是YII作为一个高效,好用的框架,不能不支持缓存.所以YII对各种流行的缓存都提供了接口,你可以根据你的需要使用不同的缓存. 1.YII中的缓存介绍 YII中的缓存是通过组件方式定义的,具体在如下目录 /yii_dev/yii/framework/caching# tree . ├── CApcCache.php ├── CCache.php ├── CDbCache.php ├──

Hibernate框架中的缓存技术详解_java

本文实例讲述了Hibernate框架中的缓存技术.分享给大家供大家参考,具体如下: Hibernate框架的缓存分为Session的缓存.SessionFactory的缓存,也称为一级缓存和二级缓存. 一级缓存: 一级缓存是Session级的缓存,其生命周期很短,与Session相互对应,由Hibernate进行管理,属于事务范围的缓存.当程序调用 Session的load()方法.get()方法.save()方法.saveOrUpdate()方法.update()方法或查询接口方法时,Hibe

SpringMVC整合EhCache实现对象缓存的详解

介绍 Ehcache在很多项目中都出现过,用法也比较简单.一般的加些配置就可以了,而且Ehcache可以对页面.对象.数据进行缓存,同时支持集群/分布式缓存.如果整合Spring.Hibernate也非常的简单,Spring对Ehcache的支持也非常好.EHCache支持内存和磁盘的缓存,支持LRU.LFU和FIFO多种淘汰算法,支持分布式的Cache,可以作为Hibernate的缓存插件.同时它也能提供基于Filter的Cache,该Filter可以缓存响应的内容并采用Gzip压缩提高响应速

PHP企业级应用缓存技术详解

  之前我们曾深入的探讨过PHP缓存技术,其中主要提到了数据缓存.数据缓存主要是指数据库查询缓存,每次访问页面的时候,都会先检测相应的缓存数据是否存在,如果不存在,就连接数据库,得到数据, 并把查询结果序列化后保存到文件中,以后同样的查询结果就直接从缓存表或文件中获得. 用的最广的例子看Discuz的搜索功能,把结果ID缓存到一个表中,下次搜索相同关键字时先搜索缓存表. 举个常用的方法,多表关联的时候,把附表中的内容生成数组保存到主表的一个字段中,需要的时候数组分解一下,这样的好处是只读一个表,