首页 > 代码库 > 分布式缓存

分布式缓存

1.什么是缓存?

    缓存就是用来避免频繁的到数据库或磁盘文件获取数据而建立的一个高速暂时存储器。一般来说,缓存比数据库或磁盘容量更小。可是存取速度很快。

一般来说,内存是当前技术下最便宜且有效的缓存介质。内存价格低廉。可是存取速度是一般磁盘IO无法比拟的。

2.缓存的作用

   1 . 存储频繁訪问的数据

   2.暂时存储耗时的计算结果

   3.内存缓存降低磁盘IO

3. 缓存类型

   a. 应用层缓存

    应用层缓存这块跟开发者关系最大,也是平时常常接触的。

    1、缓存数据库的查询结果,降低数据的压力。

这个在大型站点是必须做的。

    2、缓存磁盘文件的数据。比方经常使用的数据能够放到内存,不用每次都去读取磁盘。特别是密集计算的程序。比方中文分词的词库。

    3、缓存某个耗时的计算操作。比方数据统计。

    应用层缓存的架构也能够分几种:

    1、嵌入式,也就是缓存和应用在同一个机器。比方单机的文件缓存,java中用hashMap来缓存数据等等。 这样的缓存速度快,没有网络消耗。

    2、分布式缓存,把缓存的数据独立到不同的机器,通过网络来请求数据,比方经常使用的memcache就是这一类。

    分布式缓存一般能够分为几种:

      1、按应用切分数据到不同的缓存server。这是一种比較简单和有用的方式。

      2、依照某种规则(hash,路由等等)把数据存储到不同的缓存server。

      3、代理模式,应用在获取数据的时候都由代理透明的处理。缓存机制有代理server来处理。

(比較安全) 採用 Magent 缓存代理;

    b. 前端缓存

   我们这里说的前端缓存能够理解为一般使用的cdn技术,利用squid等做前端缓冲技术,主要还是针对静态文件类型,比方图片。css,js,html等静态文件。

备注:Squid作为网页server的前置cacheserver,能够代理用户向webserver请求数据并进行缓存,可是在window上好像不能够用

    C. client缓存

浏览器端的缓存,能够让用户请求一次之后。下一次不在从server端请求数据。直接从本地缓存读取。能够减轻server负担也能够加快用户的訪问速度。(浏览器自带)。


4.怎样用memcached部署分布式缓存   

1、首先介绍下须要使用的memcached代理servermagent

       magent是一款开源的memcached代理server,项目网址为:http://code.google.com/p/memagent/

2、安装libevent、memcached。

       在之前文章中有介绍,请參见:http://blog.csdn.net/zhsj1106/article/details/7877542

3、安装magent:

      下载地址:http://www.kuaipan.cn/file/id_7845608170131207.htm

[plain] view plaincopy
  1. mkdir magent  
  2. cd ./magent  
  3. wget http://memagent.googlecode.com/files/magent-0.5.tar.gz  
  4. tar zxvf magent-0.5.tar.gz  
  5. /sbin/ldconfig  
  6. sed -i "s#LIBS = -levent#LIBS = -levent -lm#g" Makefile  
  7. make  
  8. cp magent /usr/bin/magent  
假设在make的时候。错误发生例如以下:

[plain] view plaincopy
  1. gcc -lrt -Wall -g -O2 -I/usr/local/include -m64 -c -o magent.o magent.c  
  2. magent.c: In function ‘writev_list’:  
  3. magent.c:729: error: ‘SSIZE_MAX’ undeclared (first use in this function)  
  4. magent.c:729: error: (Each undeclared identifier is reported only once  
  5. magent.c:729: error: for each function it appears in.)  
  6. make: *** [magent.o] Error 1  
解决的方法例如以下:
[plain] view plaincopy
  1. vi ketama.h  
在开头增加

[plain] view plaincopy
  1. #ifndef SSIZE_MAX  
  2. # define SSIZE_MAX      32767  
  3. #endif  

4、使用实例

启动三个memcached实例:

[plain] view plaincopy
  1. memcached -m 1 -u root -d -l 192.168.136.129 -p 11211  
  2. memcached -m 1 -u root -d -l 192.168.136.129 -p 11212  
  3. memcached -m 1 -u root -d -l 192.168.136.129 -p 11213  
通过magent代理三个实例:

[plain] view plaincopy
  1. magent -u root -n 51200 -l 127.0.0.1 -p 12000 -s 127.0.0.1:11211 -s 127.0.0.1:11212 -b 127.0.0.1:11213  
a、分别在11211,、11212、11213port启动memcached实例,在12000port开启magent代理实例

b、11211、11212port为主memcached。11213为备份memcached。

c、client连接12000port,连接magent。进行memcached操作,对应的值会写到11211,、11212、11213三个port的实例。

d、当11211、11212port的Memcached死掉。连接到12000port的magent取数据,数据会从11213port的Memcached取出;当11211和11212重新启动之后,连接到12000port的magent取数据,数据会丢失。

e、当11211port的Memcached死掉,magent会从11212port的memcached取值。重新启动11211port的memcached实例,连接12000port的magent取值,不会错误发生。但11211的memcached实例的数据已经丢失。


在linux(centos)server上安装memcached:http://blog.csdn.net/zhsj1106/article/details/7877542

memcached和spring集成:http://blog.csdn.net/zhsj1106/article/details/7877581

分布式缓存