博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
memcached总结
阅读量:7106 次
发布时间:2019-06-28

本文共 2212 字,大约阅读时间需要 7 分钟。

hot3.png

分布式缓存出于如下考虑,首先是缓存本身的水平线性扩展问题,其次是缓存大并发下的本身的性能问题,再次避免缓存的单点故障问题(多副本和副本一致性)。分布式缓存术包括首先是内存本身的管理问题,包括了内存的分配,管理和回收机制。其次是分布式管理和分布式算法,其次是缓存键值管理和路由。

什么是Memcached

许多Web 应用程序都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大,访问的集中,就会出现REBMS的负担加重,数据库响应恶化,网站显示延迟等重大影响。Memcached是高性能的分布式内存缓存服务器。一般的使用目的是通过缓存数据库询结果,减少数据库的访问次数,以提高动态Web 应用的速度、提高扩展性。

Memcached作为高速运行的分布式缓存服务器具有以下特点。

  • 协议简单:memcached的服务器客户端通信并不使用复杂的MXL等格式,而是使用简单的基于文本的协议。
  • 基于libevent的事件处理:libevent是个程序库,他将Linux 的epoll、BSD类操作系统的kqueue等时间处理功能封装成统一的接口。memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。
  • 内置内存存储方式:为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached,重启操作系统会导致全部数据消失。另外,内容容量达到指定的值之后memcached回自动删除不适用的缓存。
  • Memcached不互通信的分布式:memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。各个memcached不会互相通信以共享信息。他的分布式主要是通过客户端实现的。

Memcached的内存管理

最近的memcached默认情况下采用了名为Slab Allocatoion的机制配,管理内存。在改机制出现以前,内存的分配是通过对所有记录简单地进行malloc和free来进行的。但是这中方式会导致内存片,加重操作系统内存管理器的负担。
Slab Allocator的基本原理是按照预先规定的大小,将分配的内存分割成特定长度的块,已完全解决内存碎片问题。Slab Allocation  的原理相当简单。将分配的内存分割成各种尺寸的块(chucnk),并把尺寸相同的块分成组(chucnk的集合)。
Memcached删除数据时数据不会真正从memcached中消失。Memcached不会释放已分配的内存。记录超时后,客户端就无法再看见该记录(invisible 透明),其存储空间即可重复使用。
Lazy Expriationmemcached内部不会监视记录是否过期,而在get时查看记录的时间戳,检查记录是否过期。这种技术称为lazy expiration.因此memcached不会再过期监视上耗费CPU时间。
对于缓存存储容量满的情况下的删除需要考虑多种机制,一方面是按队列机制,一方面应该对应缓存对象本身的优先级,根据缓存对象的优先级进行对象的删除。
LRU:从缓存中有效删除数据的原理:
Memcached会优先使用已超时的记录空间,但即使如此,也会发生追加新纪录时空间不的情况。此时就要使用名为Least Recently Used (LRU)机制来分配空间。这就是删除最少使用的记录的机制。因此当memcached的内存空间不足时(无法从slab class)获取到新空间时,就从最近未使用的记录中搜索,并将空间分配给新的记录。

缓存多副本主要是用于在缓存数
据存放时
存储缓存数
据的多个副
,以防止
缓存失效。缓存失
效发生在以
下几种情况:
  • 1.    缓存超时被移除(正常失效)
  • 2.    缓存由于存储空间限制被移除(异常失效)
  • 3.    由于缓存节点变化而导致的缓存失效(异常失效)
在缓存多副本的情况下,需要重新考虑缓存的分布式分布策略。其次缓存的多个
副本实际本身是可能的多个读的节点,可以做为分布式的并行读,这是另外一个可以考虑的问题。
缓存数据的一致性问题
缓存数据尽量只读,因此缓存本身是不适合大
量写和更新
操作的
据场景的。对
于读的情况下,如果存在数据变化,一种是同时更新缓存和数据库。一种是直接对缓
存数据进行失效
处理。

 

1、客户端在与 memcached 服务建立连接之后,进行存取对象的操作,每个被存取的对象都有一个唯一的标识符 key,存取操作均通过这个 key 进行,保存到 memcached 中的对象实际上是放置内存中的,并不是保存在 cache 文件中的,这也是为什么 memcached 能够如此高效快速的原因。注意,这些对象并不是持久的,服务停止之后,里边的数据就会丢失。

2、当存入cached的数据超过了cached的容量后会将最长时间没调用的对象挤出,这正好应征了cached的特征。

3、利用memcached常用的做法:在每取得一次cached对象后,重新设置这个对象的cache时间,这样能够使得经常被调用的对象可以长期滞留在缓存中,使得效率增倍。

 

转载于:https://my.oschina.net/zhangjie830621/blog/298964

你可能感兴趣的文章
bitrock 他家有绝活
查看>>
mysql用户管理
查看>>
IE的坏脾气——3像素Bug
查看>>
PHP+Oracle Instant Client
查看>>
Linux创建LVM
查看>>
HDU 4770 Lights Against Dudely (2013杭州赛区1001题,暴力枚举)
查看>>
[转]Javascript的匿名函数
查看>>
VirtualBox开发环境的搭建详解(转)
查看>>
FX Composer VS RenderMonkey 【转】
查看>>
创业的需求分析——创业杂记【1】
查看>>
STL中的nth_element()方法的使用
查看>>
安装jenkins插件的两种方法
查看>>
R quantile函数 | cut函数 | sample函数 | all函数 | scale函数 | do.call函数
查看>>
Unity 5.4版本 Application.systemLanguage 失效
查看>>
webGl中实现clipplane
查看>>
ArcEngine中打开各种数据源(WorkSpace)的连接
查看>>
Java Concurrency In Practice
查看>>
VC++ CArchive及简单的文件操作方法
查看>>
医疗基本知识之医嘱篇(一)医嘱的定义及基本规范
查看>>
D3DXCreateTextureFromFileEx
查看>>