最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
php Memcached分布式缓存
时间:2022-06-24 18:23:47 编辑:袖梨 来源:一聚教程网
一. 什么是memcached
memcached 是一个高性能的分布式内存对象缓存系统,用于动态web应用以减轻数据库教程负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。
相信很多人都用过缓存,在 .net 中也有内置的缓存机制,还有很多第三方工具如apache,nginx等可以做静态资源的缓存,同时我们也可以制定自己的缓存机制,缓存数据库查询的数据以减少对数据库的频繁操作。但是很多时候我们总是感觉这些缓存总不尽人意, memcached可以解决你不少的烦恼问题。最少在我的学习中解决了我不少问题,所以决定记录下来分享。
memcached基于一个存储键/值对的hashmap。其守护进程是用c写的,但是客户端可以用任何语言来编写(本文使用c#作为例子),并通过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 filesmemcached
2 命令行输入 d:program filesmemcachedmemcached.exe -d install
3 命令行输入 d:program filesmemcachedmemcachedmemcached.exe -d start,该命令启动 memcached ,默认监听端口为 11211
当然我们可以在windows 服务中查看到此此服务:
五 .net 平台下使用memcached
因为个人首先接触的客户端是memcacheddotnet ,所以习惯了适用这个核心库作为客户端。下载的工作都非常简单,因为客户端都帮我们实现了分布式程序算法,我们关心的只要怎样去存在获取这些数据。下面简单介绍一下:
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 }
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 () ,只有调用这个方式之后,才能初始化数据。才能使用连接缓存池。
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() 则用于替换已有的相同的键值。
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"));
很多时候我们并不希望数据永久缓存,一般都会有一个过期时间。上面的添加缓存数据就设置了缓存时间,可以达到过期缓存的效果
相关文章
- 时空中的绘旅人天宇之间怎么玩 绘旅人天宇之间活动玩法介绍 12-25
- QQ2024年度报告怎么看 2024qq年度报告玩法介绍 12-25
- 归龙潮珠砂什么时候up 归龙潮红缘绮梦卡池介绍 12-25
- 王者荣耀S38赛季有什么更新 12-25
- 王者荣耀S38赛季有什么更新 王者荣耀S38赛季更新内容介绍 12-25
- 世界之外12.25有什么更新 世界之外12月25日更新内容介绍 12-25