认识缓存之Memcached【1】特点结构
一、认识memcached
1、为什么使用memcached
随着互联网的发展,传统关系型数据库开始出现瓶颈,很多方面不能满足我们的要求:例如:①对数据库的高并发读写;②对海量数据的处理;
2、memcached的特点
memcached是高性能的分布式内存缓存服务器,通过缓存数据库查询结果,减少数据库访问次数,以提高web应用的速度和扩展性。memcached有如下优点:①协议简单;②基于libevent的事件处理;③内置内存存储方式;④采用不相互通信的分布式。
3、memcached的缺点
memcached的存储对象并不是持久化的,服务停止之后,里面的数据就会丢失。
4、memcached的典型应用模型
为了提高性能,Memcached把数据存储到内存中。由于数据仅存在内存中,因此重启后数据丢失。另外,内存容量达到指定值后,就会使用LRU算法自动删除不使用的缓存。Memcached本身为了缓存而设计的服务器,因此没有过多考虑数据的持久化问题。
二、如何支持高并发
Memcached使用多路复用I/O模型(如epoll、select等)。多路复用I/O是一种消息通知模式,用户连接做好I/O准备后,系统会通知我们这个连接可以进行I/O操作,这样就不会阻塞在某个用户连接。因此,Memcached才能支持高并发。
此外,Memcached使用了多线程模式。在开启Memcached服务器时通过使用“-t”参数指定要开启的线程数。但并不是线程数越多越好,一般设置为CPU核心数,这样效率最高。
三、数据保存算法
Memcached默认只能存储不大于1MB的数据。因为Memcached在存储数据时使用Slab内存分配算法。使用这种算法可以减少生成内存碎片,提高内存使用效率等。
Slab分配算法的原理是:把固定大小(1MB)的内存分配为n小块,每一块(1MB)内存块称为一个slab页。每次向系统申请一个slab页,然后再通过分割算法把这个slab页分割成若干小块的chunk,然后把这些chunk分配给用户使用。chunk块的大小可以不同,但是最大的chunk块的大小就是一个slab分页大小,因此就是1MB,所以Memcached只能存储不大于1MB的数据。
四、淘汰数据方式
当Memcached使用内存大于设置的最大内存使用数时,为了腾出空间存放新的数据项,Memcached会启用LRU算法淘汰旧的数据项。当Memcached申请内存失败,就开始淘汰数据了。
淘汰规则是:从数据项列表尾部开始遍历,在列表中查找一个引用计数器为0的条目,该此条目释放掉。为什么会从尾部开始?因为Memcached会把刚刚访问过的条目放到列表头部,所以尾部的条目都是没有被访问过的(或者很少访问的),这就是LRU算法的精髓。
如果在条目列表中找不到引用计数器为0的条目,就查找一个3小时没有访问过的条目,把他释放。如果找不到,就返回null。
五、多线程模型
Memcached是一个多线程的缓存服务器程序。在Memcached内部,线程分为:
- 主线程:接受客户端连接,并把连接分配给工作线程处理。
- 工作线程:处理客户端连接的请求。