1、Memcached是什么,有什么作用?
a. memcached是一个开源的、高性能的内存的缓存软件,从名称上看Mem就是内存的意思,而Cache就是缓存的意思。
b. 作用:memcached通过在事先规划好的内存空间中,临时缓存数据库中的各类数据,以达到减少业务对数据库的直接高并发访问,从而达到提升数据库的访问性能,加速网站集群动态应用服务的能力。
2、Memcached服务在企业集群架构中应用场景
(1). 作为数据库的前端缓存应用
a. 完整缓存(易),静态缓存
例如:商品分类,以及商品信息,可事先放在内存里,然后再对外提供数据访问,这个被称之为预热。用户访问时可以只读取memcached缓存,不读取数据库了。
b. 热点缓存(难)
需要前端程序配合。只缓存热点的数据,即缓存经常被访问的数据。
先预热基础数据,然后在再动态更新。先读取缓存,如果缓存里没有对应的数据,再去读取数据库,然后把读到的数据放入缓存。
3、Memcached服务在不同企业业务应用场景中的工作流程
a. 当web程序需要访问后端数据库获取数据时会优先访问memcached内存缓存,如果缓存中有数据就直接获取返回前端服务及用户,如果没有数据(没有命中),再由程序请求后端的数据库服务器,获取到对应的数据后,除了返回给前端服务及用户数据外,还会把数据放到Memcached内存中进行缓存,等待下次请求被访问,Memcached内存始终是数据库的挡箭牌,从而大大的减轻数据库的访问压力,提高整个网站架构的响应速度,提升了用户体验。
b. 当程序更新,修改或删除数据库已有的数据时,会同时发送请求通知memcached已经缓存过的同一个ID内容的旧数据失效,从而保证memcache中的数据和数据库中的数据一致。
如果是在高并发场合,除了通知memcached过期的缓存失效外,还会通过相关机制,使得在用户访问新数据前,通过程序预先把更新过的数据推送到memcached中缓存起来,这样可以减少数据库的访问压力,提升memcached中缓存的命中率。
c. 有一款数据库插件可以在写入更新数据库后,自动抛给memcached缓存起来,自身不CACHE。
4、Memcached服务分布式集群如何实现?
特殊说明:memcached集群和web服务集群是不一样的,所有memcached的数据总和才是数据库的数据。每台memcached都是部分数据。
a. 程序端实现
程序加载所有memcached的ip列表,通过对key做hash(一致性哈希)
b. 负载均衡器
通过对key做hash(一致性哈希)。
==========================================================
5、Memcached服务特点及工作原理是什么?
a. 全部数据存放于内存中,无持久性存储的设计,重启服务,数据会丢失。
b. 节点之间相互独立
c. 异步I/O模型,基于libevent模型的事件通知机制
d. key/value对形式存在的
e. C/S模式架构,C语言编写,总共代码2000多行
f. 当内存中缓存的数据容量达到启动时设定的内存值时,就自动使用LRU算法删除过期的缓存数据
g. 可以对存储的数据设置过期时间,这样过期后数据自动被清除,服务本身不会监控过期,则是在访问的时候查看key的时间戳判断是否过期。
i. memcache内存分配机制是对特定的内存进行分块,再把多个块分为一组。
7、Memcached的删除原理与删除机制?
memcached主要的cache机制是LRU(最近最少用)算法,加上自身的过期失效。当您存数据到memcached中,可以指定该数据在缓存中可以呆多久which is forever, or some time in the future. 如果memcached的内存不够用了,过期的slabs会优先被替换,接着就轮到最老的未被使用的slabs。在某些情况下(完整缓存),如果不想使用LRU算法,那么可以通过“-M”参数来启动memcached,这样memcached在内存耗尽时,会返回一个报错信息。
-M return error on memory exhausted (rather than removing items)
安装memcached前需要先安装libevent,有关libevent我们在前文已经介绍,首先用wget下载libevent:
操作命令:
tar zxf libevent-1.4.13-stable.tar.gz
cd libevent-1.4.13-stable
./configure
make
make install
安装memcached 服务端
操作过程:
tar xf memcached-1.4.13.tar.gz
cd memcached-1.4.13
./configure
make
make install
b. 通过telnet写入
Escape character is '^]'.
set user 0 0 6 #设置key
oldboy #存的key值
STORED
get user #取key值
VALUE user 0 6
oldboy
END
操作memcached命令的语法:
set key 0 0 10
\r\n
安装memcache客户端
wget http://pecl.php.net/get/memcache-2.2.5.tgz
tar zxvf memcache-2.2.5.tgz
cd memcache-2.2.5
/usr/local/php/bin/phpize
./configure --enable-memcache --with-php-config=/usr/local/php/bin/php-config --with-zlib-dir
make && make install