大家好,我是IT修真院武汉分院第14期的学员,一枚正直纯洁善良的JAVA程序员。今天给大家分享一下,修真院官网JAVA任务6的深度思考——为什么要使用memcache?memcache有什么作用?

什么是memcache

Memcached是一款开源、高性能、分布式内存对象缓存系统,可应用各种需要缓存的场景,其主要目的是通过降低对Database的访问来加速web应用程序。许多Web应用都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示。 但随着数据量的增大、访问的集中,就会出现DB的负担加重、数据库响应恶化、 网站显示延迟等重大影响。

为什么使用memcache?

memcache一般的使用目的是,通过缓存数据库查询的结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。 它是一个基于内存的“键值对”存储,用于存储数据库调用、API调用或页面引用结果的直接数据,如字符串、对象等。

memcache客户端

Memcache是这个项目的名称,而memcached是它服务器端的主程序文件名,也就是一个是项目名称,一个是主程序文件名,Memcached Client是他的客户端连接程序

Memcached Client目前有3种:
Memcached Client for Java,
SpyMemcached,
XMemcached

这三种Client一直存在各种争议:
Memcached Client for Java 比SpyMemcached更稳定、更早、更广泛;
SpyMemcached 比 Memcached Client for Java更高效;
XMemcached 比 SpyMemcache并发效果更好。

memcached设计思想:

  1. 简单key/value存储:服务器不关心数据本身的意义及结构,只要是可序列化数据即可。存储项由“键、过期时间、可选的标志及数据”四个部分组成;
  2. 功能的实现一半依赖于客户端,一半基于服务器端:客户端负责发送存储项至服务器端、从服务端获取数据以及无法连接至服务器时采用相应的动作;服务端负责接收、存储数据,并负责数据项的超时过期;
  3. O(1)的执行效率. O(1)的标准:恒定不变, o(1)特性使得10000个连接和1个连接的查询速度是一样的。 (memcached依赖于libevent实现从而实现O(1))
  4. 清理超期数据:默认情况下,Memcached是一个LRU缓存,同时,它按事先预订的时长清理超期数据;但事实上,memcached不会删除任何已缓存数据,只是在其过期之后不再为客户所见;而且,memcached也不会真正按期限清理缓存,而仅是当get命令到达时检查其时长;

memcached的安装与连接

  1. 安装:
    安装服务: memcached -d install
    开启服务: memcached -p 11211 -l 127.0.0.1 -m 64 -vv
  2. 连接memcached服务:
    telnet 127.0.0.1 11211

memcached的协议与数据存取:

所谓协议,可以理解为对其操作(数据存取)的语法规则,存取数据的常用命令和参数如下:

  1. set:将 value(数据值) 存储在指定的 key(键) 中。

    如果set的key已经存在,该命令可以更新该key所对应的原来的数据,也就是实现更新的作用。
    语法:
    set key flags exptime bytes [noreply]
    value key:记录的键值
    flags:十进制的int,标识存储记录时的客户端标志,在记录取出时会返回。(java 客户端默认32)
    exptim:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
    noreply(可选): 该参数告知服务器不需要返回数据

  2. get:表示从memcached取出key对应的值

    如果没有对应的值则返回结束标志END
    语法:
    get key
    get test1 test2 一次查询多个

  3. delete:用于删除已存在的 key(键)。

    如果没有对应的值则返回结束NOT_FOUND
    语法:
    delete key [noreply]

  4. 所有命令统计:

    • 存储类命令:set, add, replace, append, preprepend
    • 统计类命令: stats, stats items, stats slabs, stats sizes
    • 清理类命令: deletefush_all

常见问题

缓存与数据库数据如何保持同步?

解决方案

遵守lazy load策略.

在Service层新增, 修改和删除操作时, 将更改的数据写入数据库, 并将操作的数据在缓存中标记为失效, 等待下次读取时再从数据库中加载到缓存中.

假设有如下场景:

高并发下, 一个线程时更新操作, 另一个时查询操作.更新操作在删除缓存后, 查询操作没有命中缓存, 先把老数据读出来后放到了缓存, 然后更新操作更新了数据库.于是在缓存中的数据还是老数据, 导致缓存中的数据是脏的.

编码实战

扩展思考

  1. memcached的缓存穿透
  2. memcached的使用场景

memcached的缓存穿透

缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞

memcached的缓存穿透解决方法

  1. 对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合则丢弃。还有最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。
  2. 也可以采用一个更为简单粗暴的方法,如果一个查询返回的数据为空(不管是数 据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。

memcached的使用场景

适用场景:

  1. 在动态系统中减少数据库负载,提升性能,做缓存,适合多读少写,大数据量的情况(如大量查询用户信息、好友信息、文章信息等)。它的一个总原则是将经常需要从数据库读取的数据缓存在memcached中,这些数据也分为几类:

    • 经常被读取并且实时性要求不强可以等到自动过期的数据。例如网站首页最新文章列表、某某排行等数据。也就是虽然新数据产生了,但对用户体验不会产生任何影响的场景。这类数据就使用典型的缓存策略,设置一过合理的过期时间,当数据过期以后再从数据库中读取。当然你得制定一个缓存清除策略,便于编辑或者其它人员能马上看到效果。
    • 经常被读取并且实时性要求强的数据。比如用户的好友列表,用户文章列表,用户阅读记录等。这类数据首先被载入到memcached中,当发生更改(添加、修改、删除)时就清除缓存。在缓存的时候,我将查询的SQL语句md5()得到它的 hash值作为key,结果数组作为值写入memcached,并且将该SQL涉及的table_name以及hash值配对存入memcached中。 当更改了这个表时,我就将与此表相配对的key的缓存全部删除。

不适用场景:

  1. 缓存对象的大小大于1MB;
  2. key的长度大于250字符(可以把一些key先md5再存储);
  3. 应用运行在不安全的环境中Memcached为提供任何安全策略,仅仅通过telnet就可以访问到memcached。如果应用运行在共享的系统上,需要着重考虑安全问题;
  4. 业务本身需要的是持久化数据。

参考文献

  1. http://blog.51cto.com/xslwahaha/1627129

更多讨论

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

为什么要使用memcache?memcache有什么作用?相关推荐

  1. php 访问 memcache,memcache+php实现页面访问的加速

    一.什么是memcache memcache是目前主流的一个高性能的分布式内存对象缓存系统:它以key-value形式在内存中存储数据.由于数据缓存在内存中,所以相比操作DB而言,它不需要解析SQL. ...

  2. ecshop + 主从 + memcache + memcache监控

    1.ecshop主从在上一篇文章中已经详细描述,在此不再累赘. 2.ecshop中配置memcache,步骤如下 参考:http://blog.csdn.net/very_loong/article/ ...

  3. Memcache的部署和使用

    Memcache的部署和使用 一.memcache简介 Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站 ...

  4. PHP Memcache详解

    memcache函数所有的方法列表如下: Memcache::add – 添加一个值,如果已经存在,则返回false Memcache::addServer – 添加一个可供使用的服务器地址 Memc ...

  5. 三大缓存框架ehcache、memcache和redis的介绍

    三大缓存框架ehcache.memcache和redis的介绍 2016-04-12 架构说 4964 阅读 最近项目组有用到这三个缓存,去各自的官方看了下,觉得还真的各有千秋!今天特意归纳下各个缓存 ...

  6. ehcache memcache redis 三大缓存

    2019独角兽企业重金招聘Python工程师标准>>> 最近项目组有用到这三个缓存,去各自的官方看了下,觉得还真的各有千秋!今天特意归纳下各个缓存的优缺点,仅供参考!  Ehcach ...

  7. Memcache所有方法及参数详解以及使用方法

    参考http://www.php.net/manual/zh/function.Memcache-add.php Memcache::add - 添加一个值,如果已经存在,则返回false Memca ...

  8. NoSQL分类及ehcache memcache redis 三大缓存的对比

    NoSQL分类 由于NoSQL中没有像传统数据库那样定义数据的组织方式为关系型的,所以只要内部的数据组织采用了非关系型的方式,就可以称之为NoSQL数据库. 目前,可以将众多的NoSQL数据库按照内部 ...

  9. ehcache memcache redis 三大缓存男高音

    2019独角兽企业重金招聘Python工程师标准>>> 最近项目组有用到这三个缓存,去各自的官方看了下,觉得还真的各有千秋!今天特意归纳下各个缓存的优缺点,仅供参考!  Ehcach ...

最新文章

  1. 构建RESTful风格的WCF服务
  2. 使用TensorRT和Jetson TX1 / TX2部署深度学习推理网络和深度视觉原语的指南 学习五
  3. 特征值与特征向量_矩阵的特征值和特征向量
  4. 《研磨设计模式》chap25 访问者模式Visitor(2)模式应用到场景
  5. C++longest palindromic subsequence最长回文子序列算法实现(附完整源码)
  6. sublime的使用
  7. kafka 集群的部署安装
  8. 如何用三元组表表示下列稀疏矩阵_盘一盘 Python 系列特别篇21之:SciPy 稀疏矩阵...
  9. java 递归 求一个数的阶乘
  10. GroupCoordinator介绍
  11. Linux宝库名人轶事栏目 | 感恩每一天
  12. 【有限差分法】(三)一维和二维抛物方程CN格式以及长时间稳定性分析(附算例与Python代码)
  13. 遇到问题你的PIN不可用,请单击以重置和bitlocker恢复密匙
  14. 实验十四 水下无线传感网协议仿真实验
  15. 超级会员创作者收益说明
  16. 绿竹生物上市破发:首日跌33% 募资2亿收盘市值45亿港元
  17. VC++6.0 Error spawning cl.exe错误
  18. swi 指令能用在C语言吗,ARM的SWI异常中断处理程序设计
  19. Flask中的session简易用法教程,以及permanent通俗解释
  20. 微型计算机的主要硬件以及技术指标,微型计算机的主要技术指标?

热门文章

  1. 浅谈Vue渐进式的理解
  2. Qt5.9程序打包发布
  3. 用动态规划算法实现最长公共子序列问题的算法(java实现)
  4. 【mmdetection3d】——3D 目标检测 NuScenes 数据集
  5. 利用栈将递归转换为非递归的方法
  6. VMware15虚拟机安装MacOS10.13苹果系统教程
  7. [python][Bug记录]特殊16进制转成对应的语言
  8. 利用Java计算一光年的距离
  9. 1. 机器人动力学—动力学的数学基础
  10. 华为防火墙ftp_华为防火墙如何配置ftp服务器映射到外网