1.背景介绍
2.知识剖析
3.编码实战
4.常见问题
5.参考文献
6.更多讨论

1.背景介绍

什么是memcache
memcached 是以LiveJournal旗下Danga Interactive 公司的Brad Fitzpatric 为首开发的一款软件。现在已成为mixi、hatena、Facebook、Vox、LiveJournal 等众多服务中提高Web应用扩展性的重要因素。许多Web 应用都将数据保存到RDBMS(关系型数据库管理系统)中,应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中,就会出现RDBMS 的负担加重、数据库响应恶化、网站显示延迟等重大影响。memcached 是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web 应用的速度、提高可扩展性。

为什么使用cache可以提高访问速度
由于硬件技术的限制,我们可以制造出容量很小但很快的存储器,也可以制造出容量很大但很慢的存储器,但不可能制造出访问速度又快容量又大的存储器。基于这个原理,我们用不同的存储器来进行不同的存储功能;按照离CPU由近到远的顺序,存储器的分类依次是CPU寄存器、Cache、内存、硬盘,越靠近CPU的存储器容量越小但访问速度越快;

cpu对各种存储器的访问速度比较:寄存器(ns)>cache(几十ns)>内存(几百ns)>硬盘(ms)

那很简单了,要提升访问速度,只需要将放在后面的内容放在前面就可以了;回到我们的主题,但是,为什么后面的访问速度很慢,我们还是需要它呢?那是因为在机器断电,然后重启后,硬盘保存的内容还会存在,但是其余地方保存的东西都不会存在了;而我们通常说的持久化就是,就是将数据放在硬盘中,保证断电后数据还存在,当然手动删除不在此考虑范围内哈;持久化后,带来的问题的就是访问速度不够快;那怎么办,为了速度舍弃持久化呗,将其放在不持久化的内存或cache中不就可以了吗?

cache提高访问速度

详细说下cache这块的东西;
其实说完上面的部分,就可以理解怎么提升访问速度了;
cache高速缓冲存储器,其中复制了频繁使用的数据以利于快速访问。
存储器的高速缓冲存储器存储了频繁访问的RAM位置的内容及这些数据项的存储地址。当处理器引用存储器中的某地址时,高速缓冲存储器便检查是否存有该地址。如果存有该地址,则将数据返回处理器;如果没有保存该地址,则进行常规的存储器访问。一级Cache更靠近CPU执行单元,二级Cache更靠近物理内存,通常一级Cache有几十到几百KB,二级Cache有几百KB到几MB。再大的话,就满足不了速度要求了,造成计算机的处理速度变慢;

2.知识剖析

memcache

memcache特点
memcache常用操作
memcache知识点
memcache应用于java中的三种方式

memcache特点
1.Memcache是一个高性能的分布式的内存对象缓存系统;
2.通过在内存里维护一个统一的巨大的hash表,能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。

3.简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。
4.本质上就是一个内存key-value数据库,

5.不支持数据的持久化,服务器关闭之后数据全部丢失

memcache常用操作
1.cache数据写入操作
Set,add,replace三个方法,返回值均为boolean;
 区别:
set,cache服务器存在同样的key,则替换之;
add,如果cache服务器存在同样key,则返回false;
Replace,如果cache服务器不存在同样key,则返回false
append 命令用于向已存在 key(键) 的 value(数据值) 后面追加数据 。
prepend 命令用于向已存在 key(键) 的 value(数据值) 前面追加数据 。
            
2.cache数据读取操作方法
get方法从cache服务器获取一个数据
如果写入时是压缩的或序列化的,则get的返回会自动解压缩及反序列化
getMulti方法从cache服务器获取一组数据,get方法的数组实现,输入参数keys是一个key数组

3.辅助命令
stats 命令用于返回统计信息例如 PID(进程号)、版本号、连接数等。
flush_all 命令用于清理缓存中的所有 key=>value(键=>值) 对

memcache知识点

1.memcached是键值一一对应
2.Memcached单进程在32位系统中最大使用内存为2G,若在64位系统则没有限制,这是由于32位系统限制单进程最多可使用2G内存,要使用更多内存,可以分多个端口开启多个Memcached进程 .
3.最大30天的数据过期时间,设置为永久的也会在这个时间过期
4.最大键长为250字节,默认是128字节
5.单个item最大数据是1MB,超过1MB数据不予存储
6.memcached分服务器端和客户端,可以配置多个服务器端和客户端,应用于分布式的服务非常广泛。

7.slab ,chunk,growth path
8.哈希算法---模算法和一致性哈希算法

memcache应用于java中的三种方式
1.官方提供的基于传统阻塞io由Greg Whalin维护的客户端memcached client for java较早推出的memcached JAVA客户端API,应用广泛,运行比较稳定,使用阻塞IO,不支持CAS操作。
2.Dustin Sallings实现的基于java nio的Spymemcached
用到了java1.5版本的concurrent和nio,存取速度会高于前者,但是稳定性不好,测试中常报timeOut等相关异常,支持CAS操作。
3 XMemcached
XMemcached同样是基于Java NIO的客户端,Java NIO相比于传统阻塞IO模型来说,有效率高(特别在高并发下)和资源耗费相对较少的优点。传统阻塞IO为了提高效率,需要创建一定数量的连接形成连接池,而NIO仅需要一个连接即可(当然,NIO也是可以做池化处理),相对来说减少了线程创建和切换的开销,这一点在高并发下特别明显。因此 XMemcached与Spymemcached在性能都非常优秀,在某些方面(存储的数据比较小的情况下)Xmemcached比 Spymemcached的表现更为优秀。
总结: Java Memcache Client for Java应用最广泛,也是当前最稳定的客户端, 在线上系统大量的使用此客户端。当然,SpyMemecache和XMemcache由于使用的是NIO的IO模型,性能更高,稳定性也在提高,在性能需求较高的情况下也是比较不错的选择。

3.编码实战
在spring中使用spymemcache和xmemcache

4.常见问题
1.缓存穿透
缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。
        
缓存穿透解决方法
1. 对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合则丢弃。还有最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。

2. 也可以采用一个更为简单粗暴的方法,如果一个查询返回的数据为空(不管是数 据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。

2、 缓存雪崩
缓存雪崩是指在我们设置缓存时采用了相同的过期时间,缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩。
缓存雪崩解决
缓存失效时的雪崩效应对底层系统的冲击非常可怕。大多数系统设计者考虑用加锁或者队列的方式保证缓存的单线 程(进程)写,从而避免失效时大量的并发请求落到底层存储系统上。一个简单方案就时讲缓存失效时间分散开,比如我们可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。
        
3. 缓存击穿
对于一些设置了过期时间的key,如果这些key可能会在某些时间点被超高并发地访问,是一种非常“热点”的数据。这个时候,需要考虑一个问题:缓存被“击穿”的问题,这个和缓存雪崩的区别在于这里针对某一key缓存,前者则是很多key。缓存在某个时间点过期的时候,恰好在这个时间点对这个Key有大量的并发请求过来, 这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。
解决:
1) 使用互斥锁(mutex key);
2) "永远不过期";
3) 资源保护;

5.参考资料</h3>
            
https://blog.csdn.net/zlzlei/article/details/7790363</p>
https://blog.csdn.net/xifeijian/article/details/21994941</p>

6.更多讨论
鸣谢
感谢观看,如有出错,恳请指正

什么是memcache,常见的memcache方法相关推荐

  1. php扩展memcached和memcache的安装配置方法

    这篇文章主要介绍了php扩展memcached和memcache的安装配置方法,需要的朋友可以参考下 php连接memcached缓存服务器的客户端有两个,一个是memcache是比较底层的开发库,m ...

  2. php memcache 数组,PHP Memcache

    Memcache: memcache是一套分布式的高速缓存系统,目前被许多网站使用提升网站的访问速度,尤其是对于一些大型的.需要频繁访问数据库的网站访问速度提升效果很明显.具体是在内存中维护一个巨大的 ...

  3. 萨克斯维修服务器,萨克斯常见故障修理方法

    原标题:萨克斯常见故障修理方法 1.如果某一按键突然停止工作了,那就检测一下相应的弹簧,如果是破裂或是遗失,可以暂时用硬橡胶带来代替; 记住在演奏完毕后要除去橡胶带,因为从长远来看它可能破坏你的被覆盖 ...

  4. 普元EOS开发积累第一篇(常见错误解决方法) 持续更新

    普元EOS开发积累第一篇(常见错误解决方法) 持续更新 参考文章: (1)普元EOS开发积累第一篇(常见错误解决方法) 持续更新 (2)https://www.cnblogs.com/tangjing ...

  5. Spark程序运行常见错误解决方法以及优化

    Spark程序运行常见错误解决方法以及优化 参考文章: (1)Spark程序运行常见错误解决方法以及优化 (2)https://www.cnblogs.com/double-kill/p/901238 ...

  6. python3.5怎么使用-Python3.5常见内置方法参数用法实例详解

    本文实例讲述了Python3.5常见内置方法参数用法.分享给大家供大家参考,具体如下: Python的内置方法参数详解网站为:https://docs.python.org/3/library/fun ...

  7. Opencv中常见的滤波方法

    Opencv中常见的滤波方法 - 随性岁分享 - 博客园 opencv:基于opencv的五种滤波方法_M海洋的博客-CSDN博客_opencv滤波 OpenCV3学习(4.2)--图像常用滤波方法( ...

  8. php常见的验证方法

    php常见的验证方法 干货文章 ·2018-03-16 23:50:36 1 <?php 2 3 /** 4 * @param $id 5 * @return false|int 6 * 检测i ...

  9. OpenCV常见的优化方法和技巧总结

    OpenCV常见的优化方法和技巧总结 [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/78540206 目录 OpenCV常 ...

最新文章

  1. 代谢组学在疾病诊断如何应用?
  2. shell unset之后数组元素个数为_PHP删除数组中指定值的元素的方法
  3. LeetCode 410——分割数组的最大值
  4. python付费课程推荐知乎_新手小白学习Python,有什么课程推荐吗?
  5. python拼图游戏代码的理解_有意思的JS(1)拼图游戏 玩法介绍及其代码实现
  6. 3800元!爆料大神怒赞谷歌Pixel 6:这是今年最好看手机!
  7. php 获取 url 的操作 非常有用!
  8. 运筹优化(三)--线性规划之单纯形法
  9. 极域电子教室超级管理员密码
  10. UE4.26 水插件参数介绍
  11. Redhat Enterprise Linux磁带机简单操作
  12. Win10禁用UAC(用户账户控制)
  13. 光谱数据计算色彩指标的软件(功能强大,齐全)
  14. bench_ios框架的设计思考,基础库、runtime和组件化
  15. Linux sed命令详解
  16. Jetson TK1 刷机安装Ubuntu系统与Mini PCI-e无线网卡
  17. IAR的View视图菜单中Watch、 Live Watch、 Quick Watch、 Auto、 Locals、 Statics这几个子菜单的含义和区别
  18. 输入一个四位数字x,分别求出x的个位数字、十位数字、百位数字和千位数字的值 ,并求个位、十位、百位、千位的和 -C语言
  19. printf中%p的输出应用
  20. 开始读《C专家编程》

热门文章

  1. tomcat 6x and 7x https配置
  2. 堡垒机-百百堡垒机-基于WEB的VNC、RDP、SSH远程控制。无须任何插件,随时随地远程。
  3. 1.点亮一个LED灯
  4. 《那些年啊,那些事——一个程序员的奋斗史》——21
  5. win10打开软件提示无法成功完成操作 因为文件包含病毒
  6. 学习JavaScript这一篇就够了
  7. 如何做一个园区的导航地图?园区楼宇地图导航如何实现?
  8. 【JY】旭日始旦 岁月如新
  9. Gstore官网学习四:常用API
  10. 小私企老板的痛病通病