什么是memcache,常见的memcache方法
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方法相关推荐
- php扩展memcached和memcache的安装配置方法
这篇文章主要介绍了php扩展memcached和memcache的安装配置方法,需要的朋友可以参考下 php连接memcached缓存服务器的客户端有两个,一个是memcache是比较底层的开发库,m ...
- php memcache 数组,PHP Memcache
Memcache: memcache是一套分布式的高速缓存系统,目前被许多网站使用提升网站的访问速度,尤其是对于一些大型的.需要频繁访问数据库的网站访问速度提升效果很明显.具体是在内存中维护一个巨大的 ...
- 萨克斯维修服务器,萨克斯常见故障修理方法
原标题:萨克斯常见故障修理方法 1.如果某一按键突然停止工作了,那就检测一下相应的弹簧,如果是破裂或是遗失,可以暂时用硬橡胶带来代替; 记住在演奏完毕后要除去橡胶带,因为从长远来看它可能破坏你的被覆盖 ...
- 普元EOS开发积累第一篇(常见错误解决方法) 持续更新
普元EOS开发积累第一篇(常见错误解决方法) 持续更新 参考文章: (1)普元EOS开发积累第一篇(常见错误解决方法) 持续更新 (2)https://www.cnblogs.com/tangjing ...
- Spark程序运行常见错误解决方法以及优化
Spark程序运行常见错误解决方法以及优化 参考文章: (1)Spark程序运行常见错误解决方法以及优化 (2)https://www.cnblogs.com/double-kill/p/901238 ...
- python3.5怎么使用-Python3.5常见内置方法参数用法实例详解
本文实例讲述了Python3.5常见内置方法参数用法.分享给大家供大家参考,具体如下: Python的内置方法参数详解网站为:https://docs.python.org/3/library/fun ...
- Opencv中常见的滤波方法
Opencv中常见的滤波方法 - 随性岁分享 - 博客园 opencv:基于opencv的五种滤波方法_M海洋的博客-CSDN博客_opencv滤波 OpenCV3学习(4.2)--图像常用滤波方法( ...
- php常见的验证方法
php常见的验证方法 干货文章 ·2018-03-16 23:50:36 1 <?php 2 3 /** 4 * @param $id 5 * @return false|int 6 * 检测i ...
- OpenCV常见的优化方法和技巧总结
OpenCV常见的优化方法和技巧总结 [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/78540206 目录 OpenCV常 ...
最新文章
- 代谢组学在疾病诊断如何应用?
- shell unset之后数组元素个数为_PHP删除数组中指定值的元素的方法
- LeetCode 410——分割数组的最大值
- python付费课程推荐知乎_新手小白学习Python,有什么课程推荐吗?
- python拼图游戏代码的理解_有意思的JS(1)拼图游戏 玩法介绍及其代码实现
- 3800元!爆料大神怒赞谷歌Pixel 6:这是今年最好看手机!
- php 获取 url 的操作 非常有用!
- 运筹优化(三)--线性规划之单纯形法
- 极域电子教室超级管理员密码
- UE4.26 水插件参数介绍
- Redhat Enterprise Linux磁带机简单操作
- Win10禁用UAC(用户账户控制)
- 光谱数据计算色彩指标的软件(功能强大,齐全)
- bench_ios框架的设计思考,基础库、runtime和组件化
- Linux sed命令详解
- Jetson TK1 刷机安装Ubuntu系统与Mini PCI-e无线网卡
- IAR的View视图菜单中Watch、 Live Watch、 Quick Watch、 Auto、 Locals、 Statics这几个子菜单的含义和区别
- 输入一个四位数字x,分别求出x的个位数字、十位数字、百位数字和千位数字的值 ,并求个位、十位、百位、千位的和 -C语言
- printf中%p的输出应用
- 开始读《C专家编程》